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

Juchi2011

Новичок
Здравствуйте, уважаемые форумчане!
Помогите, пожалуйста, новичку в решении задачи.

Метод fetchAll(); не работает, если есть проценты (%) в условии:
PHP:
                     $sl = '%' . $_POST['sl'] . '%';
                     $sql = 'SELECT id, login, email, date FROM users WHERE login LIKE :login';
                     $s = $pdo->prepare($sql);
                     $s->bindValue(':login', $sl);
                     $s->execute();
Если процентов (%) нет, т. е. $sl = $_POST['sl'];, то всё работает.
Как сделать, чтобы работало при условии $sl = '%' . $_POST['sl'] . '%';.
PHP:
// HTML шаблон
// search.php
         <form name="searchform" action="" method="post">
             <div>
                 <label for="sl">Поиск по логину:</label>
                     <input type="text" name="sl" placeholder="Поиск" value="">
                     <input type="submit" name="searchlogin" value="Найти">
             </div>
          </form>
// HTML шаблон
// srch.php
         <?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>


// PHP контроллёр
// search.php
<?php
     include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/scripts/dbconnect.php'; // Подключение к базе данных.
     if (isset($_POST['searchlogin']))
         {
             if (htmlspecialchars($_POST['sl'], ENT_QUOTES, 'UTF-8') == '')
                 {
                     $output = 'Заполните поле и повторите поиск.';
                         include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/html/output.php';
                             exit();
                 }
             try
                 {
                     $sl = '%' . $_POST['sl'] . '%';
                     $sql = 'SELECT id, login, email, date FROM users WHERE login LIKE :login';
                     $s = $pdo->prepare($sql);
                     $s->bindValue(':login', $sl);
                     $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();

/*
    Код, который не работает.
    Хочу в подключаемом шаблоне output.php вывести сообщение "Такого логина нет в базе данных.".
    Но метод fetchAll(); не работает.
    Не могу понять, как вывести сообщение при отрицательном результате.

                     $lv = $s->fetchAll();
                         if (count($lv) == 0)
                             {
                                 $output = 'Такого логина нет в базе данных.';
                                     include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/html/output.php';
                                         exit();
                             }
*/

         }
     include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/html/search.php';
?>
 
Последнее редактирование модератором:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Код оформите для начала тэгами [ php ] [ /php ]
 

Фанат

oncle terrible
Команда форума
Почему ты считаешь, что "не работает"?
В чем конкретно это проявляется? Как проверял?
 

Juchi2011

Новичок
Почему ты считаешь, что "не работает"?
В чем конкретно это проявляется? Как проверял?
Есть условие $sl = '%' . $_POST['sl'] . '%';.
Например,
в базе данных есть логин Мартин, а логина Марта в базе данных нет.
Если ввести Марта, то в этом имени есть буквы Март, поэтому эти одинаковые буквы тоже идут в расчёт.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Дружочек, логин проверяется всегда четким соответствием, а не через LIKE, это ересь.
 

Juchi2011

Новичок
Дружочек, логин проверяется всегда четким соответствием, а не через LIKE, это ересь.
Спасибо за ответ.
Это для админ. панели. Чтобы вывести похожие логины.
Например, все логины на букву H.
Но как вывести сообщение, если проверять простой текст через LIKE.
Метод fetchAll(); в конфигурации с $sl = '%' . $_POST['sl'] . '%'; (т. е. с процентами (%)) не работает.
 
Последнее редактирование:

флоппик

promotor fidei
Команда форума
Партнер клуба
Нельзя использовать Traversable на PDOStatement и fetchAll() одновременно. Нужно пользоваться итерируя через foreach ИЛИ сам Statement, ИЛИ результат вызова ->fetchAll()
 

Juchi2011

Новичок
Нельзя использовать Traversable на PDOStatement и fetchAll() одновременно. Нужно пользоваться итерируя через foreach ИЛИ сам Statement, ИЛИ результат вызова ->fetchAll()
try
{
$sl = '%' . $_POST['sl'] . '%';
$sql = 'SELECT id, login, email, date FROM users WHERE login LIKE :login';
$s = $pdo->prepare($sql);
$s->bindValue(':login', $sl);
$s->execute();
$lv = $s->fetchAll();
if (count($lv) == 0)
{
$output = 'Такого логина нет в базе данных.';
include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/html/output.php';
exit();
}
}
К сожалению, не работает.
 

Фанат

oncle terrible
Команда форума
Если ввести Марта, то в этом имени есть буквы Март, поэтому эти одинаковые буквы тоже идут в расчёт.
Это ты сам догадался, или кто-то очень умный подсказал?
А по какому принципу эти "одинаковые буквы идут в расчёт"? если я буду искать по слову "вася", оно должно найти мне слово "аня", потому что есть общие буквы?
 

Juchi2011

Новичок
Это ты сам догадался, или кто-то очень умный подсказал?
А по какому принципу эти "одинаковые буквы идут в расчёт"? если я буду искать по слову "вася", оно должно найти мне слово "аня", потому что есть общие буквы?
Вы ведь знаете алгоритм поиска.
Вопрос не в этом, а в том, как вывести сообщение 'Такого логина нет в базе данных.' при заданных условиях.
 

Jake Badland

Новичок
try
{
$sl = '%' . $_POST['sl'] . '%';
$sql = 'SELECT id, login, email, date FROM users WHERE login LIKE :login';
$s = $pdo->prepare($sql);
$s->bindValue(':login', $sl);
$s->execute();
$lv = $s->fetchAll();
if (count($lv) == 0)
{
$output = 'Такого логина нет в базе данных.';
include $_SERVER['DOCUMENT_ROOT'] . '/ws/story/html/output.php';
exit();
}
}
К сожалению, не работает.
разве не надо дополнительно экранировать?
$sl = '\'%' . $_POST['sl'] . '%\'';
я с PDO еще не заморачивался, но возможно поможет)
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Как ты собрался экранировать и что?
 

Jake Badland

Новичок
Как ты собрался экранировать и что?
Я же привел пример.
ну или так если без PDO
$like = '%' . $_POST['sl'] . '%';
$sql = "SELECT id, login, email, date FROM users WHERE login LIKE '{$like}'";
Я был бы более уверен в результате. Без кавычек выдало бы какраз ексепшн, но насколько помню ексепшины из базы надо как - то по другому ловить?

или так:
$sql = 'SELECT id, login, email, date FROM users WHERE login LIKE \':login\'';

я хз "$pdo->" унаследован или "родной"
и есть подозрение, что результат работы не стоит заворачивать в трай.
да и catch нима)
Ладно) Я сёдня нимного выпимши, если не горит - проверю) Ни разу с PDO не работал)
Но любопытства всегда много)
 

Jake Badland

Новичок
PHP:
$options = [
    \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
];

$pdo = new \PDO('mysql:host=localhost;dbname=test', $user, $pass, $options);

$login = '%Test123%';

$query = $pdo->prepare("SELECT * FROM users WHERE login LIKE :login");
$query->bindValue(':login', $login);
$query->execute();

$data = $query->fetchAll();

$error = '';
if (!$data){
    $error = "Такого логина нет в базе данных.";
    die(' Или что ты там хочешь))) ');
}

foreach ($data as $row){
    echo '<pre>';
    var_dump($row);
    echo  '</pre>';
}

echo "$error <br/>";
И да, c0dex, PDO сам всё прекрасно делает) Никакого экранирования не надо))
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Да я то в курсе, потому и спросил нафига там что-то выдумывать.
 

Juchi2011

Новичок
разве не надо дополнительно экранировать?
$sl = '\'%' . $_POST['sl'] . '%\'';
я с PDO еще не заморачивался, но возможно поможет)
Здравствуйте!
Ничего там экранировать не надо.
Работает всё превосходно.
Проблема появляется при вызове метода fetchAll();
 
Сверху