PDO返回空数组作为结果

时间:2015-06-10 16:53:43

标签: php mysql ajax pdo

我有一个简单的搜索form,用于使用AJAX向我的php脚本发送POST请求。我希望脚本在我的数据库中搜索title列中的关键字,并返回找到它的行。发布的数据看起来像"searchword=test1",其中test1位于我的文字输入内容中。

我的数据库中有两行,一行标题为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();
}

2 个答案:

答案 0 :(得分:0)

首先,根据您的作业,您忘记了$的{​​{1}}符号:

旁注:我在%:seachword%注意到的拼写错误应该按照seachword

读作searchword
':searchword' => $searchword

但是,我会做这样的事情:

$searchword = $_POST["searchword"];

然后

LIKE :seachword

语法示例:

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

还要确保您的表单确实有一个POST方法,并确保您的元素确实已命名且没有拼写错误。

error reporting添加到文件的顶部,这有助于查找错误。

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

旁注:错误报告应仅在暂存时完成,而不是生产。

  • 在打开连接后立即添加<?php error_reporting(E_ALL); ini_set('display_errors', 1); // rest of your code ,以捕获潜在错误(如果有)。

答案 1 :(得分: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,因为在我看来,它更好地分离了职责。