Задать вопрос

Почему не работает функция foreach c PDO?

Здравствуйте! Имеется простой код
# Get array of containers
$arr = file(www.'/names.db');

$checkQ = 'SELECT `name` FROM ' . $tb['table'] . ' WHERE `name`=?';
$check = $dbh->prepare($checkQ);

foreach($arr as $value) {
    echo '<p>' . $value.' :: ';

    $check->execute(['%' . $value . '%']);
    echo $check->rowCount();
}

который по идее должен выводить список строк из файла (в котором одно имя на строчку) а рядышком указывать, сколько совпадений нашлось по базе данных.
Но он не работает. Имя выводит правильно, но вот у каждого имени красуется 0, и только у последнего - 1 (и он действительно есть в базе)
если убрать foreach, и вместо $value подставлять какие-либо значения - всё работает.

В чём может быть проблема?
  • Вопрос задан
  • 2762 просмотра
Подписаться 2 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 5
А зачем тут foreach я чё-то не понял. Сделайте запрос 1 раз, результаты запроса в массив и выведите их из массива циклом уже как вам надо.
Потом при чём тут файл? PDO это прослойка для работы с MySQL (и не только)

$stmt = $db->prepare("SELECT * FROM `table` WHERE `name` = :name");
$stmt->bindParam(':name', $name_file);
$stmt->execute();
$arr = $stmt->fetchAll(PDO::FETCH_ASSOC);
$Num = count($arr);


Чему равен $Num столько у вас и совпадений. Взял этот код из рабочего проекта.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Прекрасный, прекрасный пример того, что такое эти Q&A сайты.
Ну неужели жалкий ручеек тафика, состоящего из убогих и ламеров всех мастей, стоит того, чтобы терпеть это позорище?

Вопрос, который к ПДО имеет такое же отношение, как я - к балету, и - самое главное - ответы, прекрасно описываемые анекдотом про Вовочку "Я, конечно, не профессор..."

Вопрос, код в котором принципиально не будет работать, поскольку аффтару надо либо крестик снять, либо трусики надеть, и опеределиться - нечеткое у него сравение (и добавить LIKE) или четкое (тогда убрать процентики).

Ответы, в которых местные интеллектуалы наперебой пытаются давать советы про ПДО, при том что никогда в жизни этой библиотеки не видели.

Ну и вишенка на торте - совершенно детская причина всех страданий - коварные переводы строк, возвращаемые file() по умолчанию.
Ответ написан
Комментировать
jakulov
@jakulov
Переведите
$check = $dbh->prepare($checkQ);
внутрь цикла
Ответ написан
akubintsev
@akubintsev
Опытный backend разработчик
У вас запрос неправильный, судя по всему
Исправьте на
$checkQ = 'SELECT `name` FROM ' . $tb['table'] . ' WHERE `name` LIKE ?';


Да и лучше даже вот так:
$checkQ = 'SELECT count(`name`) FROM ' . $tb['table'] . ' WHERE `name` LIKE ?';

Пускай БД считает строки.
Ответ написан
Комментировать
судя по процентам, вам name LIKE %$value% надо (ну или name = %$value%)?
тогда запрос скорее всего составлен херово и проценты нужно ставить в prepare, а не в execute
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы