2015-06-10 5 views
2

У меня есть простой поиск form, который я использую для отправки запроса POST на мой скрипт php с использованием AJAX. Я хочу, чтобы скрипт выполнял поиск моей базы данных по ключевому слову в столбце заголовка и возвращал строки, где он их нашел. Опубликованные данные выглядят так: "searchword=test1", где test1 в содержании моего ввода текста.PDO возвращает пустой массив как результат

У меня есть 2 строки в моей базе данных, есть заголовок test1 и еще один test2. Если я сделаю SELECT * FROM articles, я могу видеть результаты в порядке. Если я нахожу SELECT * FROM articles WHERE title LIKE 'test1'; в консоль, я получаю правильный результат, но мой PHP-скрипт возвращает пустой массив.

Не знаю, что я делаю неправильно здесь, любая помощь приветствуется.

мой PHP:

try { 
    $hostname = "localhost"; 
    $username = "root"; 
    $password = ""; 

    $db = new PDO("mysql:host=$hostname;dbname=topdecka_PTC",$username, $password); 

    if (!empty($_POST["searchword"])) { 
     $searchword = $_POST["searchword"]; 
     $query = $db->prepare("SELECT * FROM articles WHERE title LIKE %:seachword%"); 
     $query->execute(array(':searchword' => $searchword)); 

     $result = $query->fetchAll(PDO::FETCH_ASSOC); 
     echo json_encode($result); 
     die(); 
    } 
    else { 
     $query = $db->prepare('SELECT * FROM articles'); 
     $query->execute(); 

     $result = $query->fetchAll(PDO::FETCH_ASSOC); 
     echo json_encode($result); 
     die(); 
    } 
} catch (PDOException $e) { 
    echo "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 
+0

'$ _POST {" searchword "}' синтаксическая ошибка и для всех ваших POST-массивов; *для одной вещи*. Читайте на суперглобальных http://php.net/manual/en/language.variables.superglobals.php более конкретно для '$ _POST'. –

+0

Используйте это => http://php.net/manual/en/function.error-reporting.php и http://php.net/manual/en/pdo.error-handling.php –

+0

изменили фигурные фигурные скобки на [], все равно работать не будет. Я не получаю никаких ошибок, но он просто возвращает пустой массив вместо строки, в которой столбец заголовка «test1» –

ответ

0

Во-первых, вы забыли $ знак для %:seachword% согласно Вашему заданию:

Sidenote: Там опечатка, что я только что заметил в seachword, который должен читаться как searchword согласно ':searchword' => $searchword

$searchword = $_POST["searchword"]; 

Однако, я хотел бы сделать что-то вроде этого instea d:

LIKE :seachword 

затем

$query->execute(array(":searchword" => "%" . $searchword . "%")); 

Пример Синтаксис:

$sqlprep = $conn->prepare("SELECT `column` FROM `table` WHERE `column` LIKE :word"); 
$sqlprep->bindValue(':word', '%value%'); 

Также убедитесь, что ваша форма действительно есть метод POST, и что ваш элемент действительно назван и нет опечаток.

Добавить error reporting в начало файла (ов), который поможет найти ошибки.

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

// rest of your code 

Sidenote: Сообщения об ошибках не должно быть сделано только в постановке, и никогда производства.

  • Добавить $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); сразу после открытия соединения, чтобы поймать возможные ошибки, если таковые имеются.
+1

Спасибо за помощь. Прежде всего, мне пришлось установить способ формы для публикации. После этого я использовал вашу конкатенацию в операторе $ query-> execute и удалил знаки% из синтаксиса $ db-> prepare SQL, и теперь он работает. Теперь, чтобы перейти к проверке ввода =) –

+0

@ MihaŠušteršič Вы очень желанны, и я рад слышать это Миха. Я обычно добавляю примечание о том, что форма действительно явно подразумевает метод POST, поскольку формы по умолчанию GET, если метод опущен, * cheers * –

0

Причина, по которой она не работает, связана с тем, что значение для: searchname ускользает. В результате

SELECT * FROM articles WHERE title LIKE %:seachword%

интерпретируется как это:

SELECT * FROM articles WHERE title LIKE %"test1"%

который является недействительным запроса. Вам нужно процитировать всю строку или использовать concat(), чтобы добавить% in.

Ваши два варианта: $query = $db->prepare("SELECT * FROM articles WHERE title LIKE :seachword"); $query->execute(array(':searchword' => "%" . $searchword . "%"));

или: $query = $db->prepare("SELECT * FROM articles WHERE title LIKE CONCAT('%', :seachword, '%')"); $query->execute(array(':searchword' => $searchword));

Лично я предпочитаю вариант с CONCAT, как она разделяет обязанности лучше, на мой взгляд.

Смежные вопросы