【问题标题】:PDO returns empty array as resultPDO 返回空数组作为结果
【发布时间】:2015-08-26 01:49:55
【问题描述】:

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

我的数据库中有 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();
}

【问题讨论】:

标签: php mysql ajax pdo


【解决方案1】:

首先,根据您的分配,您忘记了%:seachword%$ 符号:

旁注:我刚刚注意到seachword 中有一个错字,根据':searchword' =&gt; $searchword 应该读作searchword

$searchword = $_POST["searchword"];

但是,我会这样做:

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

旁注:错误报告只能在暂存阶段完成,而不能在生产阶段完成。

  • 在打开连接后立即添加$db-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);,以捕获潜在错误(如果有)。

【讨论】:

  • 感谢所有帮助。首先,我必须将我的表单方法设置为发布。之后,我在 $query->execute 语句中使用了您的连接,并从 $db->prepare SQL 语法中删除了 % 符号,现在它可以工作了。现在继续输入验证 =)
  • @MihaŠušteršič 不客气,我很高兴听到 Miha。我通常会添加一条关于确保表单确实明确暗示 POST 方法的注释,因为如果省略该方法,表单默认为 GET,cheers
【解决方案2】:

它不起作用的原因是 :searchname 的值被转义了。结果,

SELECT * FROM articles WHERE title LIKE %:seachword%

被解释为:

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

这是一个无效的查询。您需要引用整个字符串或使用 concat() 添加 % 。

您的两个选项是: $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 选项,因为我认为它可以更好地分离职责。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2012-12-22
    • 1970-01-01
    相关资源
    最近更新 更多