BindValue не принимает ложное значение - PullRequest
0 голосов
/ 08 января 2019

У меня есть текстовый тип данных в базе данных, который хотел бы ввести значения true или false. Если я использую Mysqli или PDO с BindParam, он работает правильно, он добавляет 1 или 0, но когда я пытаюсь использовать BindValue, он работает только верно. Ложное значение заменяется на пустое место.

empty values

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;

1 Ответ

0 голосов
/ 08 января 2019

Согласно документации

Ответ находится в документации для 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...