беру адишник из гета..пробовал тупо переменной присваивать любое число - выдает пустой массив. может в самом запросе что не так? PHP: $stmt = $pdo->prepare("SELECT * FROM users WHERE 'id'= :id"); $stmt->execute(['id'=>$id]); $res = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach($res as $key => $row){ echo $row['id']; echo $row['user']; } echo '<pre>'; var_dump($res); echo '</pre>';
потому что ты название поля обрамил в кавычки одинарные, что в результате "название поля" стало "значением". Теперь ты присваиваешь строке :id значение. Итого в любом случае у тебя пустой результат будет. SELECT * FROM users WHERE 'id'= :id --- Добавлено --- Это не SQLITE а MySQL
к сожалению здесь дело не в кавычках, данный код работает на других страницах..уже пробовал и без ковычек --- Добавлено --- тоже пустой массив дает
еще такая штука - если вместо fetchALL ставить просто fetch, тогда показывает ошибку в форыче Warning: Invalid argument supplied for foreach() bool(false)
Есть еще множество способов написать выборку данных неправильно. Если ты будешь их перебирать наудачу, точно ничего хорошего не получится. Давай вернемся к коду из первого поста: то что там одинарные кавычки вокруг имени поля, это однозначно неправильно. Убери их, проверь результат. Чему равен $id ? Скопируй текст запроса (всё, что внутри двойных кавычек) в phpmyadmin и замени :id на реальное значение, выполни запрос — что получилось? --- Добавлено --- По идее, цикл у тебя должен сработать один раз, если в $id реальное значение. Или ни одного раза, если такого id в таблице пользователей нет. Поэтому надо смотреть что в $id PHP: echo '<pre>'; echo '$id = ' . $id . "\n"; echo '$res = ' . var_export($res, true) . "\n"; echo '</pre>';
вот я и пробовал поставить fetch, потому что нужно вытаскивать один id пользователя, к которому захожу на страницу и id беру из гета...надо полагать что такой пользователь есть в базе
@гендаль серый Если fetch, то без цикла. Смотри описание pdo в официальной документации. Как насчет остальных советов, ты приближаешся к решению или как? https://www.php.net/manual/ru/book.pdo.php --- Добавлено --- Это был сарказм? Давай я тоже пошучу: твой код не работает, надо полагать что-то пошло не так. Выведи содержимое $id и попробуй выполнить запрос без PHP.
ребята кто писал про кавычки правы. одно не понял - почему этот код на другой странице работает и без кавычек выбирает категории, но там правда переменная не передается...подвох от разработчиков pdo
ещё раз: кавычки вокруг имени поля не обязательны! они допустимы, если это двойные кавычки (по стандарту ANSI SQL) или обратные (специфика MySQL). их ставят чтобы избежать неоднозначности когда имя таблицы или поля совпадает с зарезервированным словом. вот встретится тебе поле с именем "select", тогда кавычки будут необходимы x не нормально: ... WHERE 'id' = :id (здесь 'id' это строковый литерал, а не имя поля) ✅ нормально: ... WHERE `id` = :id (только в MySQL) ✅ нормально: ... WHERE id = :id (имхо, id не является зарезервированным словом нигде) ± нормально: ... WHERE "id" = :id (в других диалектах SQL, и в MySQL если включено ANSI_QUOTES) это естественная реакция первым делом обвинить php | pdo | фреймворк. но потом в 99.999% случаев оказывается что ты сам невнимателен.
P.S. Список зарезервированных слов может меняться в новых версиях MySQL. У меня был случай, когда форумный движок стал репортить ошибку на запросах с таблицей groups. Это имя было ОК до версии 8.0.2, а теперь его необходимо окружать `. Так что можно рекомендовать использовать ` везде, где они применимы.
понятно..с базой заморочек для новичка тоже хватает. про зарезервированные слова читал, для новичка информации много, всего сразу не упомнишь и с ходу все не поймешь....не зря придумывают обертки для баз и pdo того же
Начните сначала. Проверьте подключение к базе - логин, пароль, имя базы, кодировку. Проверьте передаваемые параметры и имена таблиц. Составьте из них Запрос вручную и сравните с генерируемым скриптом. Проверьте что возвращает этот запрос в PMA. И тд