【问题标题】:PHP different results for mysql_query and pdomysql_query 和 pdo 的 PHP 不同结果
【发布时间】: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 这解释了!谢谢;)

标签: php mysql pdo


【解决方案1】:

这不是 mysql_ 与 PDO 差异的问题,而是类型杂耍的问题。

在第一个非 PDO 示例中,$other_id 在查询中被转换为字符串,因此您的查询如下所示:

SELECT id FROM temp_table WHERE other_id = '';

MySQL 在查询期间对数字类型的字段将空字符串视为0,因此您的查询实际上正确匹配了两条记录。

在 PDO 示例中,由于您传递的是 $other_id(即 null),因此您的查询绑定如下:

SELECT id FROM temp_table WHERE other_id = NULL;

MySQL 不会将0 视为NULL,因此您发送的查询实际上并不相同。

【讨论】:

    【解决方案2】:

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

    这里没有什么奇怪的。

    $other_idNULL 时,第一个查询变为:

    SELECT id FROM temp_table WHERE other_id = ''
    

    因为other_id列的类型是数字,所以提供的值(空字符串)is converted to the number 0有两个匹配的行。

    另一方面,通过 PDO 发送的查询等价于:

    SELECT id FROM temp_table WHERE other_id = NULL
    

    不仅表中没有NULLs,而且此查询永远不会返回任何行,即使other_id 列中有NULL 的行也是如此。 (在other_id 中选择具有NULL 的行的正确方法是使用IS NULL operator)。

    【讨论】:

      猜你喜欢
      • 2012-08-31
      • 1970-01-01
      • 2016-07-30
      • 2012-11-04
      • 2011-04-27
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多