PDO 返回空数组作为结果

Posted

技术标签:

【中文标题】PDO 返回空数组作为结果【英文标题】:PDO returns empty array as result 【发布时间】: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();

【问题讨论】:

$_POST"searchword" 语法错误和所有 POST 数组; 为了一件事。阅读 superglobals php.net/manual/en/language.variables.superglobals.php 更具体的 $_POST 使用这个 => php.net/manual/en/function.error-reporting.php 和 php.net/manual/en/pdo.error-handling.php 把花括号改成了[ ],还是不行。我没有收到任何错误,它只是返回一个空数组而不是标题列为“test1”的行 您忘记了%:seachword% 中的$ 【参考方案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 选项,因为我认为它可以更好地分离职责。

【讨论】:

以上是关于PDO 返回空数组作为结果的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO:存储过程返回空结果

PDO->fetchAll() 在远程服务器上返回空数组

Javascript 到 PHP PDO 到 MySQL 查询返回空

PDO 不返回任何结果,而 MySQL 命令行返回预期结果

PDO 只返回 mysql 的一半结果

查询返回空结果但数据存在