запрос SELECT в PDO

Serebos

Новичок
Всем привет. Начал пошагово разбирать с PDO (https://phpdelusions.net/pdo#why).
Создал БД, в ней таблицу (аналогичную в описанных примерах).

Вывел успешно первый запрос, что в пособии:
PHP:
$stmt = $pdo->query('SELECT * FROM users');
while ($row = $stmt->fetch())
{
    echo $row['name']. "-" .$row['email']. "-" .$row['status'] . "<br>";
}
Следующий запрос оказался безуспешным
PHP:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status=?');
$stmt->execute([$email, $status]);
$user = $stmt->fetch();
браузер вывел ошибку "переменные не определены"! Почитал, одна из причин если переменная не инициализирована. Но значения содержаться в этих переменных.
Вероятно, я чего-то еще не понимаю.
Подскажите, пожалуйста, почему последний запрос выдает ошибку? Буду весьма признателен, если объяснение будет доступно понимаю для новичка.

Результат запроса нужно выводить в виде массива, но туда я еще не дошел.
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
Я не очень понимаю, что значит "переменные не определены", но если речь об ошибке "Undefined variable", это значит что переменной не было присвоено никакой значение.

В данном случае от новичка никакие особенные знания не требуются, а нужны такие сопособности, как "здравый смысл" и "умение верить собственным глазам".

Но значения содержаться в этих переменных.
В каких переменных? Какие значения? Почемы ты решил что содержатся?
 

Serebos

Новичок
Я не очень понимаю, что значит "переменные не определены", но если речь об ошибке "Undefined variable", это значит что переменной не было присвоено никакой значение.

В данном случае от новичка никакие особенные знания не требуются, а нужны такие сопособности, как "здравый смысл" и "умение верить собственным глазам".


В каких переменных? Какие значения? Почемы ты решил что содержатся?
этот запрос вывел результат в браузере (
[email protected]-new user
[email protected]-old user
)

Код:
$stmt = $pdo->query('SELECT * FROM users');
while ($row = $stmt->fetch())
{
    echo $row['name']. "-" .$row['email']. "-" .$row['status'] . "<br>";
}
Основываясь на увиденном, я предполагаю, что переменные name, email, status имеют значения.

На следующий запрос браузер вывел сообщение
PHP:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status=?');
$stmt->execute([$email, $status]);
$user = $stmt->fetch();
"
Notice: Undefined variable: email in C:\xampp\htdocs\kinomonster\index.php on line 29

Notice
: Undefined variable: status in C:\xampp\htdocs\kinomonster\index.php on line 29
"
проблема с переменной email и status. Почему, не понимаю. СПАСИБО.
 
Последнее редактирование:

weregod

unserializer
и как тут $row из первого перетекло-то в $email, $status из второго?
 

Serebos

Новичок
как я могу адаптировать код под свои потребности, если возникают проблемы с книжным вариантом?!
 

Фанат

oncle terrible
Команда форума
Ещё раз.
С чего ты взял что переменной $email было присвоено какое-то значение?
Где код, в отором это происходит?

Ты написл здесь уже кучу текста, но так и не привел одну строчку кода, в которой видно что переменной $email присваивается значение.
 

Serebos

Новичок
Вероятно, я ошибочно интерпретирую заданное значение в ДБ к присвоению значения, поскольку сейчас слышу о присвоенном значение через код. Приведенный код весь! Какое значение должно быть присвоено в этом случае? Спасибо за помощь.
 

Фанат

oncle terrible
Команда форума
Мы не знаем. Это твой код.
Начнем с простого
1. Зачем тебе переменная $email?
2. Знаешь ли ты, как в РНР присвоить значение переменной?
 

Serebos

Новичок
1. Я не знаю, зачем мне переменная $email. Я следовал примерам с руководства по использованию PDO, какое должно быть написано для "простого смертного", как мне кажется, с целью разобраться, как с этим работать.
2. Я не знаю, как присваивать значения переменным и для чего вообще это нужно.
 

nllabs

Новичок
Привет !
1. Каждый программист тратит значительную часть своего времени на отладку и поиск ошибок. Как найти ошибку в своем коде?
Это нужно изучить.

2. Я сейчас дам ответ на твой вопрос, но ты должен знать, что этот код делает:
PHP:
$email = '[email protected]';
$status = 'Ready';

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status=?');
$stmt->execute([$email, $status]);
$user = $stmt->fetch();
Ссылка на руководство по PHP: вот

3. Плейсхолдеры можно использовать двумя способами:
PHP:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status=?');
$stmt->execute([$email, $status]);
$user = $stmt->fetch();
// or
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status=:status');
$stmt->execute(['email' => $email, 'status' => $status]);
$user = $stmt->fetch();
Я использую второй вариант. Он более длинный, но зато не перепутаешь местами параметры.
 

Serebos

Новичок
Привет !
1. Каждый программист тратит значительную часть своего времени на отладку и поиск ошибок. Как найти ошибку в своем коде?
Это нужно изучить.

2. Я сейчас дам ответ на твой вопрос, но ты должен знать, что этот код делает:
PHP:
$email = '[email protected]';
$status = 'Ready';

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status=?');
$stmt->execute([$email, $status]);
$user = $stmt->fetch();
Ссылка на руководство по PHP: вот

3. Плейсхолдеры можно использовать двумя способами:
PHP:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status=?');
$stmt->execute([$email, $status]);
$user = $stmt->fetch();
// or
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status=:status');
$stmt->execute(['email' => $email, 'status' => $status]);
$user = $stmt->fetch();
Я использую второй вариант. Он более длинный, но зато не перепутаешь местами параметры.
Привет, nllabs! Спасибо за участие в обсуждении и за помощь. Ознакомлюсь со всем материалом!
 

Фанат

oncle terrible
Команда форума
Я следовал примерам с руководства
Руководство по ПДО - это руководство по работе с БД. Оно не может включать в себя все осталные разделы из учебника по языку. Если ты используешь переменную, которая не имеет никакого значения - тебе сначала надо научиться это делать.
Я не знаю, как присваивать значения переменным
Ну тогда всё просто.
Тебе ещё рано осваивать работу с базой данных, а надо подтянуть базовый синтаксис.
После того как ты начнешь понимать, что такое переменная, зачем она тебе нужна, и как с ней работать, можно потихоньку приступать к работе с базой данных- в этом слуае ты будешь понимать, что такое $email, что такое $status, и будешь их использовать осмысленно, а не просто бездумно копируя.
 

Serebos

Новичок
Руководство по ПДО - это руководство по работе с БД. Оно не может включать в себя все осталные разделы из учебника по языку. Если ты используешь переменную, которая не имеет никакого значения - тебе сначала надо научиться это делать.

Ну тогда всё просто.
Тебе ещё рано осваивать работу с базой данных, а надо подтянуть базовый синтаксис.
После того как ты начнешь понимать, что такое переменная, зачем она тебе нужна, и как с ней работать, можно потихоньку приступать к работе с базой данных- в этом случае ты будешь понимать, что такое $email, что такое $status, и будешь их использовать осмысленно, а не просто бездумно копируя.
Спасибо, Фанат. Вероятно, суть терминов я еще не до конца понимаю. Хотя процесс сам мне знакомый. Если под присвоением значения иметься ввиду, например, $name = John; (еще через ссылку, видел, но не обращал внимания - так как не применял).
Интерактивный курс по php я почти завершаю. Но понимаю, что здесь работа только началась (чего не скажу о HTML и CSS, я быстро их прошел и собрал два сайте, как по мне - хорошо). По php пройденные темы понимаю и повторить могу, но когда встречается "новые входные данные" - это ужас! Сразу попытаться правильно объяснить тем, у кого спрашиваю совет, а потом еще правильно применить новое! Спасибо за помощь, и за терпение. Сухую теория я уже 3 месяца читаю, 2 тетради на А4 по 40 листов исписаны. Открыл свою первую тетрадь, на втором уроке записано: переменная - некий контейнер с данными, начинается со знака доллара..... потом синтаксис записи, типы переменных.... Так можно еще много писать, но без практики - толку мало! Я хочу достичь свою цель, потому буду продолжать: читать и писать! И постараюсь более корректно спрашивать, с целью получить искомый ответ.
 

Serebos

Новичок
Привет !
1. Каждый программист тратит значительную часть своего времени на отладку и поиск ошибок. Как найти ошибку в своем коде?
Это нужно изучить.

2. Я сейчас дам ответ на твой вопрос, но ты должен знать, что этот код делает:
PHP:
$email = '[email protected]';
$status = 'Ready';

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status=?');
$stmt->execute([$email, $status]);
$user = $stmt->fetch();
Ссылка на руководство по PHP: вот

3. Плейсхолдеры можно использовать двумя способами:
PHP:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status=?');
$stmt->execute([$email, $status]);
$user = $stmt->fetch();
// or
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status=:status');
$stmt->execute(['email' => $email, 'status' => $status]);
$user = $stmt->fetch();
Я использую второй вариант. Он более длинный, но зато не перепутаешь местами параметры.
содержательная статья о работе с ошибками! Спасибо.
 

Фанат

oncle terrible
Команда форума
В общем если отойти от сухой теории, то если ты хочешь использовать переменные $email и $status, то сначала надо присвоить им какое-нибудь значение.
Само по себе оно не присвоится.
 

Serebos

Новичок
Я придерживаюсь мнения, чтобы критически воспринимать все, что лишено логики!
Вот в этом коде, все понятно и он работает! (в первой строке - идет обращение к таблице и мы хотим вставить значения в позиции name, email, status. Во второй строке - указаны значения для вставки). По завершению кода - в таблице БД появляется новая запись. ЛОГИЧНО!
PHP:
$stmt = $pdo->prepare('INSERT INTO users (name, email, status)
    VALUES (?, ?, ?)');

$stmt->execute(['Bill', '[email protected]', 'owner']);

echo "New records created successfully";
Но в этом коде, на мой взгляд, логика отсутствует (холя логика человека может отличатся от "машинной")
PHP:
$email = '[email protected]';
$status = 'Ready';
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status=?');
$stmt->execute([$email, $status]);
$user = $stmt->fetch();
var_dump ($status);
Суть SELECTA - извлечь данные с таблицы users. Значение var_dump ($status) - останется тем же (Ready), если закоментировать три нижние строки (начиная с SELECT). Логика мне не понятна, поскольку тот же результат будет выведен кодом
PHP:
$email = '[email protected]';
$status = 'Ready';
var_dump ($status);
Снаружи отличий нет!
Единственное смысловое значение SELECT, в первом коде, которое можно додумать - выполняется проверка: существует ли таблица users cо значениями колонок email и status.

Очень часто, понимание новых вещей приходит со временем, во время накопления опыта.

Подготовительный запрос Insert у меня уже есть и он добавляет значения в БД. Осталось его "соединить с xml".
 

Фанат

oncle terrible
Команда форума
Очень часто, понимание новых вещей приходит со временем, во время накопления опыта.
Я бы сказал что понимание приходит при наличии осмысленной задачи.
Когда грызешь сухую теорию то да - возникают такие нелепые идеи.
Но вот когда у тебя есть задача, для которй может потребоваться извлечь данные из базы, то все сразу встаёт на свои места. И придумвать фантастиеские толкования для банальных операций не приходится.

Я думаю, тебе надо начать с SQL понять что такое запросы., для чего они нужны. Сделать тестовую БД, наполнить данными. Придумать запрос, который надо выполнить на РНР. И выполнить его.

То есть, не ставить телегу впереди лошади, сначала выполняя запрос, а потом сидя и думая - а что это было сейчас и зачем?
 

Serebos

Новичок
Спасибо за рекомендации. Продолжу накоплять знания с элементарного в целях достижения задачи, что и породила эти обсуждения на форуме.
 

Serebos

Новичок
Я бы сказал что понимание приходит при наличии осмысленной задачи.
Когда грызешь сухую теорию то да - возникают такие нелепые идеи.
Но вот когда у тебя есть задача, для которй может потребоваться извлечь данные из базы, то все сразу встаёт на свои места. И придумвать фантастиеские толкования для банальных операций не приходится.

Я думаю, тебе надо начать с SQL понять что такое запросы., для чего они нужны. Сделать тестовую БД, наполнить данными. Придумать запрос, который надо выполнить на РНР. И выполнить его.

То есть, не ставить телегу впереди лошади, сначала выполняя запрос, а потом сидя и думая - а что это было сейчас и зачем?
Привет. Код начал приобретать изначально ожидаемое, мною, поведение:
PHP:
try {
$query = "SELECT *
FROM users
WHERE id = :id";
$cat= $pdo->prepare($query);
$cat->execute(['id' => 1]);
echo $cat->fetch()['name'];
} catch (PDOException $e) {
echo "Connect failed: " . $e->getMessage();
}
В эту строку echo $cat->fetch()['name'] поочередно ввожу переменные email и status - значения выводятся. Но как записать в echo все три переменные для id=1 не знаю (если это вообще возможно). Записи такого типа не работают
PHP:
echo $cat->fetch()['name'].['email'];
echo $cat->fetch()['name'].$cat->fetch()['email'];
СПАСИБО
 
Сверху