Estoy usando un campo de bit (1) para almacenar valores booleanos y escribir en la tabla usando declaraciones preparadas con PDO.PDOstatement (MySQL): insertando el valor 0 en un campo de bit (1) da como resultado 1 escrito en la tabla
Esta es la tabla de prueba:
CREATE TABLE IF NOT EXISTS `test` (
`SomeText` varchar(255) NOT NULL,
`TestBool` bit(1) NOT NULL DEFAULT b'0'
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
Este es el código de prueba:
$pdo = new PDO("connection string etc") ;
$statement = $pdo->prepare('INSERT INTO `test` (SomeText,TestBool) VALUES (?,?)') ;
$statement->execute(array("TEST",0)) ;
Ejecución de código que me da una fila con valor 1 bajo TestBool. Y lo mismo con bindValue() y bindParm(). También probé marcadores de posición con nombre (en lugar de?) Con el mismo resultado.
Luego probé:
$statement = $pdo->prepare('INSERT INTO `test` (SomeText,TestBool) VALUES ("TEST",0)') ;
$statement->execute() ;
que funcionaba correctamente (TestBool tiene valor 0). Perforar el SQL directamente en MySQL también funciona.
Tenga en cuenta que la inserción de 1 siempre funciona.
Entonces, ¿por qué los marcadores de posición no pueden insertar el valor 0? (¿y cómo lo hago realmente?)
Ya está usando PDO, eso está bien. ¿Por qué no aprovechar la función de marcadores de posición nombrados de PDO? Vea un tutorial: http://www.phpeveryday.com/articles/PDO-Positional-and-Named-Placeholders-P551.html –
A los fines de esta pregunta, lo probé y no hace ninguna diferencia. Para una consulta general, ¿hay alguna ventaja de usarlo de otra manera que la conveniencia? (Esto es parte de un DAL, así se generará de todos modos) – Peter
Sí, no necesita recordar el orden de sus variables. Aumenta la abstracción de su código. –