2012-04-20 79 views
7

Trong một thiết lập máy chủ, tôi gặp phải lỗi rất lạ. Có PHP 5.3.6 với PDO Driver cho MySQL, thư viện máy khách phiên bản 5.1.61. Mọi thứ được biên soạn bằng tay.PDO bindValue với PDO :: PARAM_BOOL làm cho câu lệnh được thực thi không thành công

Khi tôi ràng buộc thông số với bindValue và đặt tham số thứ ba là \ PDO :: PARAM_BOOL thì câu lệnh thực thi trả về false và không có gì xảy ra (không có dữ liệu được chèn vào MySQL, thậm chí không có ngoại lệ). Khi tôi không sử dụng tham số thứ ba, nó sẽ hoạt động tốt. Trong thực tế, tôi không thể ommit tham số thứ ba, bacues Doctrine2 DBAL đặt nó trong khi chuyển đổi các thông số ...

Đây là mã:

<?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())); 

Kết quả:

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

Điều gì có thể đi sai? Tôi đã thử nó trên 4 máy chủ khác và không nhận được lỗi này. Ngoài ra nếu tôi vượt qua '0' (như một chuỗi) để $stmt->bindValue(5, false, \PDO::PARAM_BOOL); nó hoạt động tốt.

+0

OK, sự cố được giải quyết theo PHP 5.3.10 trên máy chủ này (Red Hat 5.4) –

Trả lời

12

Tôi đã gặp vấn đề tương tự trên Ubuntu với PHP 5.3.10. (Điều thú vị là không có vấn đề trên cửa sổ với wamp ...)

Trên thực tế nó là một lỗi được biết đến trong PDO: https://bugs.php.net/bug.php?id=38546

tôi sử dụng PDO :: PARAM_INT thay vì PDO :: PARAM_BOOL. Nó hoạt động tốt, và bạn không phải chuyển đổi boolean thành chuỗi như trên.

Các vấn đề liên quan