За последние 24 часа нас посетили 17310 программистов и 1663 робота. Сейчас ищут 1585 программистов ...

Почему запрос может возвращать пустой массив?

Тема в разделе "Сделайте за меня", создана пользователем гендаль серый, 7 ноя 2023.

Метки:
  1. гендаль серый

    гендаль серый Новичок

    С нами с:
    20 янв 2023
    Сообщения:
    53
    Симпатии:
    0
    беру адишник из гета..пробовал тупо переменной присваивать любое число - выдает пустой массив.
    может в самом запросе что не так?

    PHP:
    1. $stmt = $pdo->prepare("SELECT * FROM users WHERE 'id'= :id");
    2.                 $stmt->execute(['id'=>$id]);
    3.                 $res = $stmt->fetchAll(PDO::FETCH_ASSOC);          
    4.                
    5.                 foreach($res as $key => $row){
    6.                     echo $row['id'];
    7.                     echo $row['user'];
    8.                 }
    9.                
    10.                
    11.                 echo '<pre>';
    12.                 var_dump($res);
    13.                 echo '</pre>';
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    потому что ты название поля обрамил в кавычки одинарные, что в результате "название поля" стало "значением". Теперь ты присваиваешь строке :id значение. Итого в любом случае у тебя пустой результат будет. SELECT * FROM users WHERE 'id'= :id
    --- Добавлено ---
    Это не SQLITE а MySQL
     
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.859
    Симпатии:
    748
    Адрес:
    Татарстан
    угу.. вот если бы кавычки были обратными - `такие` то было бы норм
     
  4. гендаль серый

    гендаль серый Новичок

    С нами с:
    20 янв 2023
    Сообщения:
    53
    Симпатии:
    0
    к сожалению здесь дело не в кавычках, данный код работает на других страницах..уже пробовал и без ковычек
    --- Добавлено ---
    тоже пустой массив дает
     
  5. гендаль серый

    гендаль серый Новичок

    С нами с:
    20 янв 2023
    Сообщения:
    53
    Симпатии:
    0
    еще такая штука - если вместо fetchALL ставить просто fetch, тогда показывает ошибку в форыче
    Warning: Invalid argument supplied for foreach()
    bool(false)
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям

    Есть еще множество способов написать выборку данных неправильно. Если ты будешь их перебирать наудачу, точно ничего хорошего не получится.

    Давай вернемся к коду из первого поста: то что там одинарные кавычки вокруг имени поля, это однозначно неправильно. Убери их, проверь результат. Чему равен $id ? Скопируй текст запроса (всё, что внутри двойных кавычек) в phpmyadmin и замени :id на реальное значение, выполни запрос — что получилось?
    --- Добавлено ---
    По идее, цикл у тебя должен сработать один раз, если в $id реальное значение. Или ни одного раза, если такого id в таблице пользователей нет. Поэтому надо смотреть что в $id
    PHP:
    1. echo '<pre>';
    2. echo '$id = ' . $id . "\n";
    3. echo '$res = ' . var_export($res, true) . "\n";
    4. echo '</pre>';
     
  7. гендаль серый

    гендаль серый Новичок

    С нами с:
    20 янв 2023
    Сообщения:
    53
    Симпатии:
    0
    вот я и пробовал поставить fetch, потому что нужно вытаскивать один id пользователя, к которому захожу на страницу и id беру из гета...надо полагать что такой пользователь есть в базе
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    @гендаль серый Если fetch, то без цикла. Смотри описание pdo в официальной документации. Как насчет остальных советов, ты приближаешся к решению или как?

    https://www.php.net/manual/ru/book.pdo.php
    --- Добавлено ---
    Это был сарказм? Давай я тоже пошучу: твой код не работает, надо полагать что-то пошло не так. Выведи содержимое $id и попробуй выполнить запрос без PHP.
     
  9. гендаль серый

    гендаль серый Новичок

    С нами с:
    20 янв 2023
    Сообщения:
    53
    Симпатии:
    0
    ребята кто писал про кавычки правы. одно не понял - почему этот код на другой странице работает и без кавычек выбирает категории, но там правда переменная не передается...подвох от разработчиков pdo
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    ещё раз: кавычки вокруг имени поля не обязательны! они допустимы, если это двойные кавычки (по стандарту 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% случаев оказывается что ты сам невнимателен.
     
    гендаль серый нравится это.
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    P.S. Список зарезервированных слов может меняться в новых версиях MySQL. У меня был случай, когда форумный движок стал репортить ошибку на запросах с таблицей groups. Это имя было ОК до версии 8.0.2, а теперь его необходимо окружать `.
    Так что можно рекомендовать использовать ` везде, где они применимы.
     
  12. гендаль серый

    гендаль серый Новичок

    С нами с:
    20 янв 2023
    Сообщения:
    53
    Симпатии:
    0
    понятно..с базой заморочек для новичка тоже хватает. про зарезервированные слова читал, для новичка информации много, всего сразу не упомнишь и с ходу все не поймешь....не зря придумывают обертки для баз и pdo того же
     
  13. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Начните сначала.
    Проверьте подключение к базе - логин, пароль, имя базы, кодировку.
    Проверьте передаваемые параметры и имена таблиц. Составьте из них Запрос вручную и сравните с генерируемым скриптом. Проверьте что возвращает этот запрос в PMA.
    И тд
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    Мне однажды писали что я посты публикую ради сбора лайков. Так вот...

    Где мои лайки ? :mad: