我正在尝试将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)。
作为一种解决方法,我必须将下面的行放在pdo输出的结果中返回2,4
,但是想要了解更多有关上述差异的信息。
$sth->bindValue(":other_id", empty($other_id) ? 0 : $other_id);
我也试过了$sth->bindValue(":other_id", $other_id, PDO::PARAM_INT);
没有帮助
答案 0 :(得分:4)
这不是SqlException
与PDO差异的问题,而是与类型杂耍有关。
在第一个非PDO示例中,mysql_
正在转换为查询中的字符串,因此您的查询如下所示:
$other_id
MySQL在查询期间为数字类型的字段处理与SELECT id FROM temp_table WHERE other_id = '';
相同的空字符串,因此您的查询实际上正确匹配了两个记录。
在PDO示例中,因为您正在传递0
($other_id
),所以您的查询绑定如下:
null
MySQL不会将SELECT id FROM temp_table WHERE other_id = NULL;
视为0
,因此您发送的查询实际上并不相同。
答案 1 :(得分:4)
这是我之前没有遇到的奇怪问题。
这里没有什么奇怪的。
当NULL
为SELECT id FROM temp_table WHERE other_id = ''
时,第一个查询变为:
other_id
因为SELECT id FROM temp_table WHERE other_id = NULL
列的类型是数字,所提供的值(空字符串)http://jsfiddle.net/fq3fb31d/并且有两个匹配的行。
另一方面,通过PDO发送的查询等同于:
NULL
不仅表中没有NULL
,而且此查询永远不会返回任何行,即使other_id
列中有行NULL
也是如此。 (在other_id
中选择let pickerDataSource: [[String]] = [ ["asdadadad", "sffgddfg"],
["sfsdasgag", "sdfasdfasfsf", "sdsfgagagaggs"] ]
行的正确方法是使用is converted to the number 0
。