mysql_query和pdo

时间:2017-08-17 15:39:13

标签: php mysql pdo

我正在尝试将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);没有帮助

2 个答案:

答案 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)

  

这是我之前没有遇到的奇怪问题。

这里没有什么奇怪的。

NULLSELECT 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