2012-04-20 18 views
7

W konfiguracji jednego serwera wystąpił bardzo dziwny błąd. Jest PHP 5.3.6 ze sterownikiem PDO dla MySQL, biblioteka klienta wersja 5.1.61. Wszystko jest kompilowane ręcznie.PDO bindValue z PDO :: PARAM_BOOL powoduje, że instrukcja wykonania nie działa bezgłośnie.

Kiedy wiążę params z bindValue i ustawię trzeci parametr jako \ PDO :: PARAM_BOOL, wówczas instrukcja wykona return false i nic się nie stanie (brak danych wstawionych do MySQL, nawet bez wyjątku). Kiedy nie używam trzeciego parametru, działa dobrze. W rzeczywistości nie mogę ommit trzeci parametr, bacues Doctrine2 DBAL ustawia go natomiast parametry konwersji ...

Oto kod:

<?php 
$pdo = new \PDO('mysql:host=***;dbname=***', '***', '***'); // hidden DB access 
$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 

$stmt = $pdo->prepare('insert into outage (name, description, start_at, end_at, is_exception, extranet_id) values (?,?,?,?,?,?)'); 
$stmt->bindValue(1, 'Test name', \PDO::PARAM_STR); 
$stmt->bindValue(2, 'Test desc', \PDO::PARAM_STR); 
$stmt->bindValue(3, '2012-01-01 00:00:00', \PDO::PARAM_STR); 
$stmt->bindValue(4, null, \PDO::PARAM_NULL); 
$stmt->bindValue(5, false, \PDO::PARAM_BOOL); 
$stmt->bindValue(6, 2, \PDO::PARAM_INT); 
var_dump(array('stmt result' => ($result = $stmt->execute()), 'last insert id' => $pdo->lastInsertId(), 'stmt err code' => $stmt->errorCode(), 'pdo err code' => $pdo->errorCode())); 

Wynik:

array(4) { 
    ["stmt result"]=> 
    bool(false) 
    ["last insert id"]=> 
    string(1) "0" 
    ["stmt err code"]=> 
    string(5) "00000" 
    ["pdo err code"]=> 
    string(5) "00000" 
} 

Co ewentualnie może pójść źle? Próbowałem go na innych 4 serwerach i nie otrzymałem tego błędu. Również jeśli przekazuję "0" (jako ciąg) do $stmt->bindValue(5, false, \PDO::PARAM_BOOL);, to działa dobrze.

+0

OK, problem został rozwiązany w PHP 5.3.10 na tym serwerze (Red Hat 5.4) –

Odpowiedz

12

Miałem ten sam problem na Ubuntu z PHP 5.3.10. (Co ciekawe nie było problemu na oknach z wamp ...)

Właściwie jest to znany błąd w PDO: https://bugs.php.net/bug.php?id=38546

Używam PDO :: PARAM_INT zamiast PDO :: PARAM_BOOL. Działa dobrze i nie musisz konwertować wartości logicznych na ciąg jak wyżej.