2014-08-29 5 views
4

Как вставить значение BIT в MySQL с помощью подготовленного отчета PDO? Ниже я попытался и мои результаты.Вставить значение BIT в MySQL с помощью PDO Подготовлено заявление

<?php 
function testIt($value) 
{ 
    $sql='INSERT INTO test(id,data) VALUES(?,?)'; 
    $stmt=db::db()->prepare($sql); 
    $stmt->execute(array(0,$value)); 
    $id=db::db()->lastInsertId(); 

    $sql='SELECT * FROM test WHERE id='.$id; 
    $stmt=db::db()->query($sql); 
    $rs=$stmt->fetch(PDO::FETCH_ASSOC); 
    echo("Test for {$value} returns id {$rs['id']} and data {$rs['data']}<br>"); 
} 

date_default_timezone_set('America/Los_Angeles'); 
ini_set('display_errors', 1); 
error_reporting(E_ALL); 
require_once('../../ayb_private/dbase.php'); 

$sql='CREATE TEMPORARY TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, data BIT(8) NOT NULL DEFAULT 00000000, PRIMARY KEY (id))'; 
$stmt=db::db()->exec($sql); 

testIt('b"01010101"'); 
testIt('b01010101'); 
testIt('01010101'); 
testIt(0x55); 
testIt("b'01010101'"); 
?> 

РЕЗУЛЬТАТЫ:

Test for b"01010101" returns id 1 and data 255 
Test for b01010101 returns id 2 and data 255 
Test for 01010101 returns id 3 and data 255 
Test for 85 returns id 4 and data 255 
Test for b'01010101' returns id 5 and data 255 
+0

Работает ли 'testIt (0x55)'? – Barmar

+0

@Barmar 'Тест на 85 возвращает id 4 и данные 255' – user1032531

+0

Хм, может быть, вы можете получить представление об этих вопросах: http://stackoverflow.com/search?q=pdo+prepare+title%3Abit – Barmar

ответ

4

Не рядом с причалом, чтобы проверить, но я считаю, вы должны связать тип его INT и отправить его в качестве INT, а не как «b010101» (или что-то):

$sql='INSERT INTO test(id,data) VALUES(:id,:bit)'; 
$stmt=db::db()->prepare($sql); 
$stmt->bindValue('id', null, PDO::PARAM_NULL); 
$stmt->bindValue('bit', (int)$value, PDO::PARAM_INT); 
$stmt->execute(); 

Быстрая проверка на Google показала это similar previous answer.

+0

Использование вашего решения и 'testIt (0x55);' похоже, работает. Вместо привязки, возможно, просто конвертировать двоичное значение, используя PHP, может работать? – user1032531

+0

Это сообщение отвечает на вопрос, но дает ответ, который я хотел услышать. Похоже, что PDO не очень хорошо работает с значениями BIT. Поскольку эти значения не предоставляются пользователям, я полагаю, что я мог бы вручную добавить их в свой запрос. Или, возможно, тип BIT типа все вместе и использовать 'TINYINT (1)'. Мысли? – user1032531

+0

@ user1032531 Насколько я помню, вы не можете отправить битку через PDO в MySQL: вы в лучшем случае всегда будете отправлять целое число, и даже тогда, если вы явно не укажете PDO на использование целого числа, он отправляет как строка. Если ваш прецедент хранит битовые поля в базе данных, тогда 'bindValue' представляет собой целочисленное представление и работает (как и выше). Если ваш случай использования выбирает по полю бит из известного набора возможных битовых полей, просто закодируйте их непосредственно в запросе. – bishop

Смежные вопросы