我在数据库中有一个文本数据类型,想要输入true或false值。如果我确实将Mysqli或PDO与BindParam一起使用可以正常工作,则它会添加1或0,但是当我尝试使用BindValue时,它只会起作用。伪值交换为空白。

php - BindValue不接受错误值-LMLPHP

try{
 $conn =  new PDO("mysql:host=localhost;dbname=name_db", "root", "");
 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 $sql = "INSERT INTO upload_meta (video_id, upload_key, upload_value) VALUES (:video_id,:upload_key,:upload_value)";
 $temp = $conn->prepare($sql);
 $temp->bindValue(':video_id', 11111111);
 $temp->bindValue(':upload_key', 'exodo');
 $temp->bindValue(':upload_value', false);

$temp->execute();

}catch(PDOException $e){

    echo $e->getMessage();


}


该字段将接收需要为文本的各种类型的值。

CREATE TABLE `upload_meta` (
  `meta_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `video_id` int(11) unsigned NOT NULL,
  `upload_key` varchar(255) DEFAULT NULL,
  `upload_value` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`meta_id`),
  KEY `video_id` (`video_id`),
  KEY `index_upload_key` (`upload_key`(191)),
  CONSTRAINT `upload_meta_ibfk_1` FOREIGN KEY (`video_id`) REFERENCES `video` (`id_video`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

最佳答案

根据文档

答案在bindParam的文档中:


  与PDOStatement :: bindValue()不同,该变量被绑定为引用,并且仅在调用PDOStatement :: execute()时进行评估。


还有execute


  调用PDOStatement :: bindParam()将PHP变量绑定到参数标记:绑定变量将其值作为输入传递,并接收其关联参数标记的输出值(如果有)


你的情况

您的数据库结构期望upload_value为varchar,基本上是文本/字符串。当您使用bindParam时,它可以正常工作,因为它传递的是true或false值,即1或0

但是,当您使用bindValue时,将传递引用,然后在执行时对其进行评估,因此将true转换为1(字符串/文本),但是将false评估为“空”字符串。



使用bindParam或如果要使用bindValue,应更新数据库结构以接受upload_value的布尔值而不是varchar

5分钟指南:https://w3guy.com/php-pdostatement-bindparam-bindvalue/

关于php - BindValue不接受错误值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54089493/

10-10 19:56