php-mysqli可以工作,但pdo不能

php-mysqli可以工作,但pdo不能,php,pdo,mysqli,Php,Pdo,Mysqli,我正在尝试切换到pdo,并且很享受它的成功,但是我的最新功能无法工作。然而,当我回到mysqli时,一切都很好。我肯定我错过了什么,但是什么 不工作PDO: $db = db_pdo(); $query = $db->prepare("select * from locks_for_sale where type_3=':search'"); $query->bindParam(":search", $sub_items[3]); $query->execute(); if

我正在尝试切换到pdo,并且很享受它的成功,但是我的最新功能无法工作。然而,当我回到mysqli时,一切都很好。我肯定我错过了什么,但是什么

不工作PDO:

$db = db_pdo();
$query = $db->prepare("select * from locks_for_sale where type_3=':search'");
$query->bindParam(":search", $sub_items[3]);
$query->execute();

if (!$result=$query->fetch()) {
    $print .= "<tr><td>&nbsp;</td><td><h3>No products currently available.</h3></td></tr>\n";
}

else {
    other code
请注意: 包括函数db_pdo。 $sub_items[3]是一个字符串

工作mysqli:

$db = db_conn();
$sql = "select * from locks_for_sale where type_3='".$sub_items[3]."'";
$query = $db->query($sql);

if (!$query->fetch_assoc()) {
    $print .= "<tr><td>&nbsp;</td><td><h3>No products currently available.</h3></td></tr>\n";
}

else {
    other code
同样,db_conn也包括在内

我知道这个查询的结果返回了2项,但是pdo版本显示$结果


提前感谢。

从:搜索参数中删除引号:

如果被引用,它将被视为一个文本字符串“:search”,并且您将因绑定错误数量的参数而导致错误

如果您对准备好的语句不熟悉,请尽量不要将它们看作是将变量放入SQL字符串中的等价物,就像连接或插入变量时那样。相反,您将参数值直接传递到数据库引擎中,数据库引擎将相应地将它们放入查询中。RDBMS有责任构造一个带有适当引号的有效语句。

给定00000个错误代码,这实际上意味着查询成功。问题在于获取逻辑:

if (!$query->fetch_assoc()) {
    ^--- remove
如果提取成功,调用将返回not false,也称为true。然后,你把它倒过来!并将其转换为false,导致其他代码运行。

请尝试bindValue

另见:

var\u dump$query->errorInfo说了什么?返回false表示有错误,所以让PDO准确地告诉您错误是什么。@Marc B当我按照您说的做时,屏幕上没有显示任何内容,这使我认为问题可能在我的代码中进一步存在。既然如此,为什么mysqli可以工作而pdo不能工作呢?mysqli可以工作是因为您没有使用准备好的语句,而是直接将值插入到SQL字符串中。这真的是另一回事。var_dump$result以查看从fetch调用中得到的结果。正如您所说,我的PDO代码由于引号而无法工作,但在我取消引号后整个脚本失败,因为后面的函数正在使用mysqli。我没有意识到,因为php.ini没有设置为在浏览器中回显错误,我只是通过命令行看到它。一个基本的设置错误。谢谢。是的,虽然我没有指定PARAM::STR位,但这也不起作用,所以我现在就试试。我们知道查询的结果是真的,不管它的值是什么。当然,对这一点的合法检验是询问查询结果是否属实?这就是为什么我把它放在这里!开始时,从任何错误或不正确的查询继续。如果它是真的,那么代码应该处理else{代码的一部分,不是吗?当然,但问题是你的代码顺序。如果你颠倒if测试的意义,你必须颠倒真/假块的顺序。你的代码归结为如果查询失败,那么就做成功的事情,否则就做失败的事情。谢谢你的回复和关于错误检查/代码顺序的想法。我一直认为tch是正确的,但很高兴用errorInfo确认它,这是我将来会做的。谢谢。
if (!$query->fetch_assoc()) {
    ^--- remove
<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindValue(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', $colour, PDO::PARAM_STR);
$sth->execute();
?>