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.
OK, problem został rozwiązany w PHP 5.3.10 na tym serwerze (Red Hat 5.4) –