BindValue не принимает ложное значение

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

BindValue не принимает ложное значение

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;

Подробности схемы, особенно тип столбца upload_value, были бы полезны ...

Gert van den Berg 08.01.2019 11:25
false преобразуется в пустую строку. Почему бы не использовать явно 1 или 0?
deceze 08.01.2019 11:40

При использовании 0 возникает та же проблема, и вставляется пустое пространство.

Bruno Andrade 08.01.2019 11:45

извините, но я не понимаю вопроса. ... почему у вас есть текстовый тип для хранения логического значения? а если работает bindParam, почему не используешь?

Charly 08.01.2019 12:02

1 ° Это поле «meta_value» будет не только хранить логическое значение, но и будет варьировать типы данных, которые оно будет хранить. 2 ° Я не использую bindParam, потому что хочу понять, почему BindValue не работает должным образом. Полагаю, у этой ошибки должно быть какое-то объяснение и решение.

Bruno Andrade 08.01.2019 12:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Ответ находится в документации для bindParam:

Unlike PDOStatement::bindValue(), the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.

И execute

call PDOStatement::bindParam() to bind PHP variables to the parameter markers: bound variables pass their value as input and receive the output value, if any, of their associated parameter markers

Ваш случай

Структура вашей базы данных ожидает upload_value как varchar, который в основном является текстом / строкой. Когда вы используете bindParam, он работает, потому что он передает значение true или false, то есть 1 или 0

Но когда вы используете bindValue, ссылка передается и затем оценивается во время выполнения, и, следовательно, истина преобразуется в 1 (строка / текст), а ложь оценивается как «пустая» строка.

Решение

Либо используйте bindParam, либо если вы хотите использовать bindValue, вы должны обновить структуру своей базы данных, чтобы принимать логические значения для upload_value вместо varchar

5-минутное руководство: https://w3guy.com/php-pdostatement-bindparam-bindvalue/

Хороший ответ после долгих исследований. Я смог использовать добавление PDO :: NULL_NATURAL в bindValue. Я не знаю, правильный ли это способ, может ли он вызвать ошибку в будущем, но это сработало. Может, тебе стоит добавить эту опцию к своему ответу.

Bruno Andrade 08.01.2019 14:12

Это сработало, отлично! Но вам следует подумать об обновлении вашего типа данных в базе данных, то есть заменить varchar на boolean

Tejashwi Kalp Taru 08.01.2019 14:13

Другие вопросы по теме