Не работает fetchAll();

Juchi2011

Новичок
Ты родишь уже, какую ошибку тебе пишет fetchAll()?
Здравствуйте!
Ошибку не пишет.
Полностью прекращается работа всего скрипта (скрипт приведён в самом начале).
После вызова метода fetchAll(); поиск перестаёт работать.
 

Фанат

oncle terrible
Команда форума
Ок, посмотрел на этот говнокод внимательно.

fetchAll() у тебя не работает потому что вызывается после оператора exit.
fetchAll() в твоем случае вызывать бесполезно, поскольку он вернёт ноль строк. Поскольку все строки из БД ты уже прочитал, выше, в массив $sch .
Следовательно, fetchAll(), вызывать после foreach не имеет смысла. Если ты будешь хотя бы немного думать над кодом, который пишешь, а не тупо копипастить его из говновидеокурсов, то сможешь догадаться что $sch - это и есть тот массив, коорый ты хочешь проверить на пустоту.

Поэтому в коде надо оставить что-то одно. Либо идиотский foreach, либо fetchAll().
 
Последнее редактирование:

Juchi2011

Новичок
Ок, посмотрел на этот говнокод внимательно.

fetchAll() у тебя не работает потому что вызывается после оператора exit.
fetchAll() в твоем случае вызывать бесполезно, поскольку он вернёт ноль строк. Поскольку все строки из БД ты уже прочитал, выше, в массив $sch .
Следовательно, fetchAll(), вызывать после foreach не имеет смысла. Если ты будешь хотя бы немного думать над кодом, который пишешь, а не тупо копипастить его из говновидеокурсов, то сможешь догадаться что $sch - это и есть тот массив, коорый ты хочешь проверить на пустоту.

Поэтому в коде надо оставить что-то одно. Либо идиотский foreach, либо fetchAll().
Осмелюсь сказать в защиту этого кода.
Такой код есть в книге Кевина Янка - PHP и MySQL. От новичка к профессионалу. 2013.
Встречается такой код и в других книгах и учебниках. Извиняюсь, но долго все перечислять.
Суть проблемы в том, что если убрать проценты $sl = $_POST['sl'] ;, то всё работает. Работает и $s->fetchAll(); и foreach ().
Не работает fetchAll(); именно с процентами $sl = '%' . $_POST['sl'] . '%'; . Т. е. не хочет считать.
То, что касается кода после exit();, то код
$lv = $s->fetchAll();
if (count($lv) == 0)
{
$output = 'Такого логина нет в базе данных.';
include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/html/output.php';
exit();
}
должен стоять либо после
$s->execute();,
либо до foreach ().
 

Juchi2011

Новичок
Ок, посмотрел на этот говнокод внимательно.

fetchAll() у тебя не работает потому что вызывается после оператора exit.
fetchAll() в твоем случае вызывать бесполезно, поскольку он вернёт ноль строк. Поскольку все строки из БД ты уже прочитал, выше, в массив $sch .
Следовательно, fetchAll(), вызывать после foreach не имеет смысла. Если ты будешь хотя бы немного думать над кодом, который пишешь, а не тупо копипастить его из говновидеокурсов, то сможешь догадаться что $sch - это и есть тот массив, коорый ты хочешь проверить на пустоту.

Поэтому в коде надо оставить что-то одно. Либо идиотский foreach, либо fetchAll().
Без процентов всё работает.
Если поставить проценты, то перестаёт работать.
 

Фанат

oncle terrible
Команда форума
Если код идиотский, то не важно, кто его написал - обехьяна с пальмы или кевин янк из книжки. Он не перестает быть идиоским, если напечатан в книжке и много ещё где.
Код
PHP:
foreach ($s as $row)
{
    $sch[] = array('id' => $row['id'], 'login' => $row['login'], 'email' => $row['email'], 'date' => $row['date']);
}
Делает ровно то же самое, что и
PHP:
$sch = $s->fetchAll();
Но поскольку является в разы боле труднывм для написания, то такую промстыню вместо двух слов может писать только идиот. Который не понимает, что делает.

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

Juchi2011

Новичок
Если код идиотский, то не важно, кто его написал - обехьяна с пальмы или кевин янк из книжки. Он не перестает быть идиоским, если напечатан в книжке и много ещё где.
Код
PHP:
foreach ($s as $row)
{
    $sch[] = array('id' => $row['id'], 'login' => $row['login'], 'email' => $row['email'], 'date' => $row['date']);
}
Делает ровно то же самое, что и
PHP:
$sch = $s->fetchAll();
Но поскольку является в разы боле труднывм для написания, то такую промстыню вместо двух слов может писать только идиот. Который не понимает, что делает.

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

Этот код полностью рабочий.
Подключаюсь к базе данных. Файл dbconnect.php

PHP:
<?php

     try

         {

             $pdo = new PDO('mysql: host=localhost; dbname=story', 'root', '');

                 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                 $pdo->exec('SET NAMES "utf8"');

         }

     catch (PDOException $e)

         {

             $error = 'Невозможно подключиться к серверу баз данных.';

          // $error = 'Невозможно подключиться к серверу баз данных: ' . $e->getMessage();

                 include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/html/error.php';

                     exit();

         }

         $output = 'Соединение с базой данных установлено.';

          // include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/html/output.php';

?>
PHP:
<?php

     include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/scripts/dbconnect.php';

     if (isset($_POST['searchword']))

         {

             if (htmlspecialchars($_POST['se'], ENT_QUOTES, 'UTF-8') == '')

                 {

                     $output = 'Заполните поле и повторите поиск.';

                         include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/html/output.php';

                             exit();

                 }

             try

                 {

                     $se = '%' . $_POST['se'] . '%';

                     $sql = 'SELECT id, login, email, date FROM users WHERE login LIKE :login';

                     $s = $pdo->prepare($sql);

                     $s->bindValue(':login', $se);

                     $s->execute();

                 }

             catch (PDOException $e)

                 {

                     $error = 'Ошибка при извлечении данных.';

                  // $error = 'Ошибка при извлечении данных: ' . $e->getMessage();

                         include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/html/error.php';

                             exit();

                 }

             foreach ($s as $row)

                 {

                     $sch[] = array('id' => $row['id'], 'login' => $row['login'], 'email' => $row['email'], 'date' => $row['date']);

                 }

                     include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/html/srch.php';

                         exit();

         }

     include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/html/search.php';

?>

Шаблон search.php (приведён частично, так как остальная часть не имеет значения)
HTML:
<!DOCTYPE html>

<html>

<head>

     <meta charset="utf-8">

     <title>Поиск пользователя</title>

</head>

<body>

     <h3>Поиск пользователя</h3>

     <div class="search">

         <form name="searchform" action="" method="post">

             <div>

                 <label for="se">Поиск:</label>

                     <input type="text" name="se" placeholder="Поиск" value="">

                     <input type="submit" name="searchword" value="Найти">

             </div>
    </div>

</body>

</html>
Шаблон srch.php
HTML:
<!DOCTYPE html>

<html>

<head>

     <meta charset="utf-8">

     <title>Результаты поиска</title>

</head>

<body>

     <h3>Результаты поиска</h3>

         <?php foreach ($sch as $user): ?>

             <div>

                 <form action="" method="post">

                     <div>

                         <?php echo htmlspecialchars($user['id'], ENT_QUOTES, 'UTF-8'); ?>

                         <?php echo htmlspecialchars($user['login'], ENT_QUOTES, 'UTF-8'); ?>

                         <?php echo htmlspecialchars($user['email'], ENT_QUOTES, 'UTF-8'); ?>

                         <?php echo htmlspecialchars($user['date'], ENT_QUOTES, 'UTF-8'); ?>

                         <input type="hidden" name="id" value="<?php echo htmlspecialchars($user['id']); ?>">

                         <input type="submit" name="action" value="Редактировать">

                         <input type="submit" name="action" value="Изменить пароль">

                         <input type="submit" name="action" value="Удалить">

                     </div>

                 </form>

             </div>

         <?php endforeach; ?>

     <p><a href="#" onclick="history.back();">Вернуться на предыдущую страницу</a></p>

</body>

</html>

Шаблон users.php
HTML:
<!DOCTYPE html>

<html>

<head>

     <meta charset="utf-8">

     <title>Список пользователей</title>

     <?php include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/containers/smoke.php'; ?>

</head>

<body>

     <div><?php include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/administrator/inc/search/index.php'; ?></div>

     <p><a href="/ws/story/inc/adduser">Добавить нового пользователя</a></p>

     <p>Все зарегистрированные пользователи, которые есть в базе данных:</p>

     <p>

         <?php foreach ($consumer as $users): ?>

         <div>

             <form name="consumer" action="" method="post">

                 <div>

                     <?php echo htmlspecialchars($users['id'], ENT_QUOTES, 'UTF-8'); ?>

                     <?php echo htmlspecialchars($users['login'], ENT_QUOTES, 'UTF-8'); ?>

                     <?php echo htmlspecialchars($users['email'], ENT_QUOTES, 'UTF-8'); ?>

                     <?php echo htmlspecialchars($users['password'], ENT_QUOTES, 'UTF-8'); ?>

                     <?php echo htmlspecialchars($users['date'], ENT_QUOTES, 'UTF-8'); ?>

                 </div>

                 <div><input name="id" type="hidden" value="<?php echo htmlspecialchars($users['id'], ENT_QUOTES, 'UTF-8'); ?>"></div>

                 <div>

                     <input name="edit" type="submit" value="Редактировать">

                     <input name="changepassword" type="submit" value="Изменить пароль">

                     <input name="remove" type="submit" value="Удалить">

                 </div>

             </form>

         </div>

         <?php endforeach; ?>

     </p>

     </body>

</html>
Если при поиске логина совпадает хоть одна буква в одном логине или в нескольких логинах ( первая, в середине или последняя буква, не важно), то выводится один логин или несколько (тот или те, где есть совпадения). Например, если ввести в поиск букву М, то выведутся все логины, где есть буква М в любом месте слова (Мартин, Рома и т. д. ).

Если же после $s->execute(); вызвать метод fetchAll();


PHP:
$lv = $s->fetchAll();

                         if (count($lv) == 0)

                                   {

                                                $output = 'Такого логина нет в базе данных.';

                                                          include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/html/output.php';

                                                                        exit();

                                   }
то поиск перестаёт работать.
С процентами, как в вышеприведённом примере, fetchAll(); перестаёт считать.
Нужно вывести сообщение "Такого логина нет в базе данных.", если не будут найдены совпадения.

Если что-то не так написал, то всё исправлю и дополню.
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
оформи код как код.
нажми ссылочку "редактировать" под своим сообщением, потом найди кнопку три точки (...) над формой, и вставляй код с ее помощью
 

Juchi2011

Новичок
Если код идиотский, то не важно, кто его написал - обехьяна с пальмы или кевин янк из книжки. Он не перестает быть идиоским, если напечатан в книжке и много ещё где.
Код
PHP:
foreach ($s as $row)
{
    $sch[] = array('id' => $row['id'], 'login' => $row['login'], 'email' => $row['email'], 'date' => $row['date']);
}
Делает ровно то же самое, что и
PHP:
$sch = $s->fetchAll();
Но поскольку является в разы боле труднывм для написания, то такую промстыню вместо двух слов может писать только идиот. Который не понимает, что делает.

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

Juchi2011

Новичок
оформи код как код.
нажми ссылочку "редактировать" под своим сообщением, потом найди кнопку три точки (...) над формой, и вставляй код с ее помощью
Кажется, с Вашей помощью получилось всё отредактировать.
С уважением.
 
Последнее редактирование:

Juchi2011

Новичок
оформи код как код.
нажми ссылочку "редактировать" под своим сообщением, потом найди кнопку три точки (...) над формой, и вставляй код с ее помощью
С наступающим Новым годом! 2020!
Желаю добра и процветания!
А также крепкого здоровья!
 

Фанат

oncle terrible
Команда форума
Зачем ты все время добавляешь это fetchall?
Ты вообще читаешь что я пишу?
Например
fetchAll(), вызывать после foreach не имеет смысла.
$sch - это и есть тот массив, коорый ты хочешь проверить на пустоту.
Что не ясно в этих двух строчках?
 

Juchi2011

Новичок
Зачем ты все время добавляешь это fetchall?
Ты вообще читаешь что я пишу?
Например

Что не ясно в этих двух строчках?
В вышеприведённом (последнем) коде я fetchAll() не вызывал. Посмотрите внимательно. В этом коде нет вызова метода fetchAll().
Это полностью рабочий код. Поиск работает.
При поиске, в случае отсутствия совпадений показывает пустую страницу.
Нельзя вызвать fetchAll(), так как поиск перестаёт работать. Вообще не работает, т. е. полностью прекращает функционировать.
Никакого поиска не производится.
fetchAll() не работает именно из-за процентов. Если проценты убрать, то fetchAll() можно вызвать и посчитать совпадения, и если совпадений нет,
то вывести сообщение "Такого логина нет в базе данных."
Но в коде есть проценты, и метод fetchAll() из-за них не работает.
Вопрос в том, как с fetchAll() вывести сообщение "Такого логина нет в базе данных.", если нет совпадений?
И я никогда не вызывал fetchAll() после foreach().
Попробуйте в реальности запустить этот код, сразу станет всё понятно.
 
Последнее редактирование:

Juchi2011

Новичок
Зачем ты все время добавляешь это fetchall?
Ты вообще читаешь что я пишу?
Например

Что не ясно в этих двух строчках?
При заданных условиях методом fetchAll() вывести сообщение не получается.
Вы правы, придётся выводить сообщение проверяя массив $sch на пустоту.
 
Последнее редактирование:
Сверху