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' => $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->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 返回空数组作为结果的主要内容,如果未能解决你的问题,请参考以下文章