【发布时间】:2017-08-17 15:39:13
【问题描述】:
我正在尝试将 mysql_query 转换为 pdo 等效项
我的表结构是(删除了不相关的列 - 我的问题需要的是other_id):
CREATE TABLE `temp_table` (
`id` int(12) NOT NULL DEFAULT '0',
`other_id` int(12) NOT NULL DEFAULT '0',
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
以及它拥有的数据:
-----------------
| id | other_id |
-----------------
| 1 | 123 |
-----------------
| 2 | 0 |
-----------------
| 3 | 456 |
-----------------
| 4 | 0 |
-----------------
之前的数据库查询是:
$sql = "SELECT id FROM temp_table WHERE other_id = '{$other_id}'";
$result = mysql_query($sql, $db)
return mysql_fetch_assoc($result);
使用$other_id 作为NULL 调用查询(php 中的“null”,而不是字符串或任何内容)。
结果 mysql_query:这给出了我的值 2,4
PDO 等效代码:
$sql = "SELECT id FROM temp_table WHERE other_id = :other_id";
$sth = $dbConnection->prepare($sql);
$sth->bindValue(":other_id", $other_id);
$sth->execute();
return $sth->fetchAll(PDO::FETCH_COLUMN);
结果 PDO :这根本没有给出任何值。
这是我以前没有遇到过的奇怪问题(因为我更多的是 java 开发人员,几年后最近接触了 PHP)。
作为一种解决方法,我不得不在下面的行中返回 2,4 作为 pdo 输出的结果,但想了解更多关于上述差异的信息。
$sth->bindValue(":other_id", empty($other_id) ? 0 : $other_id);
我也试过$sth->bindValue(":other_id", $other_id, PDO::PARAM_INT);,但没有帮助
【问题讨论】:
-
这会有什么不同?更新:刚刚更改为
bindParam仍然是同样的问题 -
从技术上讲,
0在数据库中是 NOT NULL,所以如果您将NULL传递给$other_id,它不应该 match ...我对它使用在mysql_扩展名下工作的原因感到更加困惑——它不应该这样做。 -
不是你的问题的真正答案,但不是
empty($other_id) ? 0 : $other_id,你也可以只做(int)$other_id -
在第一个示例(非 PDO)中,
$other_id被转换为字符串(计算结果为other_id = '')。这实际上与此处的0相同。第二个例子是传递NULL,其中!= 0。 -
@BenM 这解释了!谢谢;)