PHP:PDO语句简单MySQL选择不起作用

PHP:PDO语句简单MySQL选择不起作用,php,mysql,pdo,Php,Mysql,Pdo,我用下面的PHP代码对一个表进行了非常简单的选择 $statement = $db->prepare("SELECT * FROM account WHERE fbid = :fbid"); $statement->bindParam(":fbid",$uid, PDO::PARAM_STR,45); $out = $statement->execute(); print_r($out) // 1; //$out = $statement->execute(array('

我用下面的PHP代码对一个表进行了非常简单的选择

$statement = $db->prepare("SELECT * FROM account WHERE fbid = :fbid");
$statement->bindParam(":fbid",$uid, PDO::PARAM_STR,45);
$out = $statement->execute();
print_r($out) // 1;
//$out = $statement->execute(array(':fbid' => $uid)); // also doesn't work
$row = $statement->fetch();
$out为真正的成功,$row为空

编辑:

$statement->debugDumpParams

输出

SQL:[40]从fbid=:fbid参数:1键:名称:[5]:fbid参数号=-1名称=[5]:fbid参数=1参数类型=2的帐户中选择*

如果我修改代码如下:

$statement = $db->prepare("SELECT * FROM account WHERE fbid = $uid");
$out = $statement->execute();
$row = $statement->fetch();
$row包含我期望的记录

我不知所措。我正在使用PDO::prepare、bindParams等来防止SQL注入,也许我在这方面弄错了

编辑: 在我的示例中,$uid是一个数字字符串,即只包含数字的字符串。在数据库中,列类型为VARCHAR45

编辑:

如果将数据库类型从VARCHAR45更改为BIGINT,则两个查询都可以工作。如果我再次将数据库类型中的类型更改回VARCHAR45,它就会工作。那么是什么原因呢


请停下来。

已经有一段时间了。。。请尝试将哈希传递给:


$statement->executearray'fbid'=>$uid

已经有一段时间了。。。请尝试将哈希传递给:


$statement->executearray'fbid'=>$uid

尝试删除额外的参数

$statement->bindParam (":fbid", $uid, PDO::PARAM_STR);
编辑 您是否100%确定UID周围没有多余的空格?使用和通过值进行测试:

$statement->bindValue (":fbid", trim($uid), PDO::PARAM_STR);

尝试删除额外的参数

$statement->bindParam (":fbid", $uid, PDO::PARAM_STR);
编辑 您是否100%确定UID周围没有多余的空格?使用和通过值进行测试:

$statement->bindValue (":fbid", trim($uid), PDO::PARAM_STR);

也许可以试试PDO::PARAM_INT


除此之外,请记住bindParam将变量作为引用。也许您的演示代码没有显示在调用execute之前更改该变量的值。如果需要,请参阅bindValue。

可以尝试PDO::PARAM_INT


除此之外,请记住bindParam将变量作为引用。也许您的演示代码没有显示在调用execute之前更改该变量的值。如果需要,请参阅bindValue。

我认为您的PDO安装可能有问题

$uid = 552192373; // my facebook uid for testing
$statement = $db->prepare("SELECT * FROM users WHERE facebook_uid = :fbid");
$statement->bindParam(":fbid",$uid, PDO::PARAM_STR,45);
$out = $statement->execute();
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo '<pre>';
print_r($row);
echo '</pre>';

我认为您的PDO安装可能有问题

$uid = 552192373; // my facebook uid for testing
$statement = $db->prepare("SELECT * FROM users WHERE facebook_uid = :fbid");
$statement->bindParam(":fbid",$uid, PDO::PARAM_STR,45);
$out = $statement->execute();
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo '<pre>';
print_r($row);
echo '</pre>';

您需要检查您的fbid值。如果它的整数值大于2^32无符号,则它应该始终为字符串,仅由字符串$uid强制转换是无效的,而sprintf%.0f,。。。仅当整数值小于2^52时有效,因为在32位操作系统上,当数字大于2^3132时,无符号PHP将假定它是双精度类型,默认精度仅为14十进制,但fbid为20

您必须在字符串中保留fbid,在PHP中只包含[0-9],在MySQL中存储为BIGINT或VARCHAR并不重要,MySQL只接受字符串sql语句,并始终以字符串格式返回结果


您需要检查您的fbid值。如果它的整数值大于2^32无符号,则它应该始终为字符串,仅由字符串$uid强制转换是无效的,而sprintf%.0f,。。。仅当整数值小于2^52时有效,因为在32位操作系统上,当数字大于2^3132时,无符号PHP将假定它是双精度类型,默认精度仅为14十进制,但fbid为20

您必须在字符串中保留fbid,在PHP中只包含[0-9],在MySQL中存储为BIGINT或VARCHAR并不重要,MySQL只接受字符串sql语句,并始终以字符串格式返回结果


你能把打印出来的结果贴出来吗;好的,对于屎和傻笑,请尝试在bindParam中不使用,PDO::PARAM_STR,45,这样看起来就像$statement->bindParam:fbid,$uid@Jayrox:$行仍然为空。我很困惑。这应该行得通。事实上,我有一个类似的select语句,虽然在不同的表中也能工作。Facebook建议UID在mysql中存储为Bigint20。你能发布print_r$out的结果吗;好的,对于屎和傻笑,请尝试在bindParam中不使用,PDO::PARAM_STR,45,这样看起来就像$statement->bindParam:fbid,$uid@Jayrox:$行仍然为空。我很困惑。这应该行得通。事实上,我有一个类似的select语句,虽然在不同的表中也能工作。Facebook建议UID在mysql中存储为Bigint20,将其更改为int,不会返回结果。另外,我对$uid值进行了回显,这正是我所期望的。我也尝试过bindValue,但也不起作用。将其更改为int不会返回结果。另外,我对$uid值进行了回显,这正是我所期望的。我也试过bindValue,但也不起作用。你试过使用位置参数而不是命名参数吗?从fbid=?处的帐户中选择*?和Executarray$uid?您是否尝试过使用位置参数而不是命名参数?从fbid=?处的帐户中选择*?还有Executarray$uid?