程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了PDO 准备好的语句:获取 NULL 而不是预期的结果大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决PDO 准备好的语句:获取 NULL 而不是预期的结果?

开发过程中遇到PDO 准备好的语句:获取 NULL 而不是预期的结果的问题如何解决?下面主要结合日常开发的经验,给出你关于PDO 准备好的语句:获取 NULL 而不是预期的结果的解决方法建议,希望对你解决PDO 准备好的语句:获取 NULL 而不是预期的结果有所启发或帮助;

我不明白这个问题。我在 PHP 中有一个 sql 查询。如果我通过 PDO 和准备好的语句触发查询,但没有占位符,我会得到预期的结果。但是查询中的产品 ID 来自外部,因此我将用占位符 :productID 替换它。如果我这样做,结果是 NulL。

sql 查询:

SELECT 
COUNT(`stock`.`product`) AS COUNT,`product`.`name_en` AS name,`product`.`default_consumption` AS `DEFAulT_CONSUM`
FROM `stock`
RIGHT JOIN `product`
ON `stock`.`product` = `product`.`ID`
WHERE `product` = :productID

如果我将占位符 :productID 替换为数据库表中的有效 ID(例如 1),我会得到预期的结果。

$query = "SELECT 
          COUNT(`stock`.`product`) AS COUNT,`product`.`default_consumption` AS `DEFAulT_CONSUM`
          FROM `stock`
          RIGHT JOIN `product`
          ON `stock`.`product` = `product`.`ID`
          WHERE `product` = 1";
$query = $this->db->prepare($query);
$query->execute();
$response = $query->fetch(PDO::FETCH_ASSOC);
var_dump($response);

输出

array(3) {
  ["COUNT"]=>
  string(1) "0"
  ["name"]=>
  string(6) "butter"
  ["DEFAulT_CONSUM"]=>
  string(3) "0.1"
}

现在我将替​​换它:

$query = "SELECT 
          COUNT(`stock`.`product`) AS COUNT,`product`.`default_consumption` AS `DEFAulT_CONSUM`
          FROM `stock`
          RIGHT JOIN `product`
          ON `stock`.`product` = `product`.`ID`
          WHERE `product` = :productID";

$query = $this->db->prepare($query);
$query->execute(array(':productID' => $productID));
$response = $query->fetch(PDO::FETCH_ASSOC);
var_dump($response);

输出

array(3) {
  ["COUNT"]=>
  string(1) "0"
  ["name"]=>
  NulL
  ["DEFAulT_CONSUM"]=>
  NulL
}

$productID 是来自外部的值。在我的测试中,我将其设置为 1,就像在我的第一个示例中一样。我得到了 to 字段 DEFAulT_CONSUMname 的结果 NulL 如果我直接在 execute() 中设置 ID 1:

$query->execute(array(':productID' => 1));

我再次得到NulL。如果我再次将查询中的 :productID 替换为 1 的直接 ID,我将再次得到预期的结果。我暂时不明白这个问题。

我使用 PHP 8.0 和 MariaDB。上面的代码在一个单独的函数中运行。目前没有执行其他代码。

感谢您的帮助。我确定,我忽略了一些东西。

创建表格

CREATE table`product`(
    `ID` INT(10) UNSIGNED NOT NulL auto_INCREMENT COMMENT 'ID of the Product',`name_en` VARCHAR(255) NOT NulL COMMENT 'name of the Product in Englisch',`name_de` VARCHAR(255) NulL COMMENT 'name of the Product in German',`name_fr` VARCHAR(255) NulL COMMENT 'name of the Product in France',`group` INT(10) UNSIGNED NulL DEFAulT 1 COMMENT 'ID of the Product Group',`unit` INT(10) UNSIGNED NOT NulL DEFAulT 1 COMMENT 'ID of the Unit',`default_consumption` float(10) UNSIGNED NOT NulL DEFAulT 0.5 COMMENT 'Value for Default Consumption',`created_at` TIMESTAMP NOT NulL DEFAulT CURRENT_TIMESTAMP COMMENT 'Timestamp of creation Time',`changed_at` TIMESTAMP NulL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Timestamp of changed',`deleted_at` TIMESTAMP NulL COMMENT 'Timestamp of deleted',PRIMARY KEY(`ID`),INDEX `product_name_en_IDx`(`name_en`),INDEX `product_name_de_IDx`(`name_de`),INDEX `product_name_fr_IDx`(`name_fr`),INDEX `product_group_IDx`(`group`),CONSTRAINT `product_group_fk` 
        FOREIGN KEY(`group`)
        REFERENCES `product_group`(`ID`)
        ON UPDATE CASCADE
        ON DELETE SET NulL,CONSTRAINT `product_unit_fk` 
        FOREIGN KEY(`unit`)
        REFERENCES `unit`(`ID`)
        ON UPDATE CASCADE
        ON DELETE RESTRICT
)ENGINE=InnoDB;

CREATE table `stock`(
    `product` INT(10) UNSIGNED NOT NulL COMMENT 'ID of the Product',`user` INT(10) UNSIGNED NOT NulL COMMENT 'ID of the User',`stock` float(10) UNSIGNED NOT NulL DEFAulT 0 COMMENT 'Stock Value',`indivIDual_consumption` float(10) UNSIGNED NulL COMMENT 'IndivIDual Consumption Value',`ki_value` float(10) UNSIGNED NulL DEFAulT 0.000 COMMENT 'KI Up Down Value',`last_buy` TIMESTAMP NOT NulL DEFAulT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Timestmap of last Buy',INDEX `stock_product_IDx`(`product`),INDEX `stock_user_IDx`(`user`),CONSTRAINT `stock_product_fk`
        FOREIGN KEY(`product`)
        REFERENCES `product`(`ID`)
        ON UPDATE CASCADE
        ON DELETE RESTRICT,CONSTRAINT `stock_user_fk`
        FOREIGN KEY(`user`)
        REFERENCES `user`(`ID`)
        ON UPDATE CASCADE
        ON DELETE RESTRICT
)ENGINE=InnoDB;

解决方法

您似乎发现了 MariaDB SQL 优化器的错误。请尽早向他们提交错误报告。

该问题与 PDO 无关。您看到不同结果的原因是 PDO 默认将所有值绑定为字符串。当您将其绑定为字符串时,会正确评估 WHERE 子句中的比较。当您将值转换为整数或使用文字 1 时,优化器会将其与 product.id 进行比较,而不是与 stock.product 进行比较。不太确定这里内部发生​​了什么,但显然使用整数时行为是错误的。您可以在 https://dba.stackexchange.com/ 上询问是否有人对此行为有解释,但这很可能需要由 MariaDB 团队作为错误解决。

Here is an online reproducible version of this bug.

大佬总结

以上是大佬教程为你收集整理的PDO 准备好的语句:获取 NULL 而不是预期的结果全部内容,希望文章能够帮你解决PDO 准备好的语句:获取 NULL 而不是预期的结果所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: