2012-11-12 22 views
7

Tôi đã chuyển đổi một ứng dụng để sử dụng các câu lệnh chuẩn bị PDO thay vì mysqli và tôi đang gặp phải một vấn đề lạ. Tôi có một số hồ sơ trong cơ sở dữ liệu mà nó dự kiến ​​rằng một trường sẽ là null. Không phải 'null' (chuỗi), hoặc '' (chuỗi rỗng), nhưng NULL. Tôi xây dựng các truy vấn của mình động, vì vậy trong quá khứ khi tôi bắt gặp một biến null trong một đối tượng, tôi sẽ tạo truy vấn như sau:Chọn các hàng trong đó một trường rỗng bằng cách sử dụng các câu lệnh chuẩn bị PDO PHP và MySQL

WHERE fieldName is null; 

Và sẽ nhận được kết quả mong đợi khi trường đó là rỗng.

Bây giờ với PDO, truy vấn của tôi không trả lại bất kỳ kết quả nào và tôi không gặp phải bất kỳ lỗi nào. Nó chỉ đơn giản là không trả lại các hồ sơ tôi mong đợi. Khi tôi echo các truy vấn được xây dựng và chạy chúng trực tiếp trong MySQL tôi nhận được kết quả mong đợi, nhưng trong ứng dụng không có kết quả trả về.

Một số trong những điều tôi đã cố gắng bao gồm truy vấn xây dựng mà trông như thế này:

WHERE fieldName is null; 

hoặc

WHERE fieldName <=> null; 

Tôi cũng đã cố gắng tiêu chuẩn chuẩn bị tuyên bố:

WHERE fieldName = :fieldName 

và sau đó ràng buộc với các loại báo cáo sau:

$stmt->bindParam(":$field", $value); 
$stmt->bindParam(":$field", $value, PDO::PARAM_NULL); 
$stmt->bindParam(":$field", null, PDO::PARAM_NULL); 
$stmt->bindValue(":$field", null, PDO::PARAM_NULL); 
$stmt->bindValue(":$field", null, PDO::PARAM_INT); 

Bất kỳ trợ giúp nào về điều này sẽ được đánh giá cao. Phiên bản PHP của tôi là 5.3.10 và MySQL là 5.5.22. Là một câu hỏi phụ, tôi vẫn không rõ ràng về sự khác biệt giữa bindParam và bindValue, vì vậy nếu nó có ý nghĩa để bao gồm trong câu trả lời của bạn, tôi thực sự sẽ đánh giá cao một số làm rõ về chủ đề ...

+0

Câu hỏi khác nhau, nhưng tất cả mọi người đang ở đây: http://stackoverflow.com/questions/1391777/how-do-i-insert-null-values-using-pdo –

+0

Tôi đã thử tất cả các đề xuất khác nhau từ câu hỏi đó và không có câu hỏi nào đã hoạt động cho đến thời điểm này ... – cdwhatcott

+0

Nếu bạn đang chèn hoặc tìm kiếm trên null, tại sao bạn cần phải tham số hóa nó? –

Trả lời

3

Hóa ra là sự kết hợp của một số câu trả lời cho câu hỏi này: How do I insert NULL values using PDO? (như John đã chỉ ra)

tôi cần phải thay đổi mệnh đề where của tôi như thế này:

WHERE fieldName is :fieldName; 

Và sau đó vượt qua một loạt các lĩnh vực => giá trị cho các chức năng thực hiện:

$binds = array(); 
foreach ($wheres as $where) { 
    $field = $where['field']; 
    $value = $where['value']; 
    $binds[":$field"] = $value; 
} 
$stmt->execute($binds); 

Truy vấn sẽ không hoạt động chút nào với bindValue, ngay cả khi đã thay đổi mệnh đề where của tôi. Có ai biết tại sao ràng buộc không hoạt động, nhưng phương pháp khác này đã làm?

+2

Tôi không nghĩ rằng có thể sử dụng trình giữ chỗ cho điều kiện 'IS' trong tuyên bố PDO, mặc dù tôi đang gặp khó khăn khi tìm bằng chứng xác thực về điều này. Trong thử nghiệm, tôi không thể nhận được "WHERE fieldName là: fieldName" để hoạt động, thậm chí sử dụng mã chính xác mà bạn đã cung cấp. Tôi có thể nhận được mã để làm việc tốt nếu tôi sử dụng một cái gì đó khác hơn là 'IS', chẳng hạn như' = 'hoặc'> '. Bạn có thể xây dựng trên mã bạn đã sử dụng hoặc có bất kỳ đề xuất nào khác không? Tôi đang mắc kẹt với MySQL phiên bản 5.1 mặc dù, để có thể giải thích lý do tại sao nó không làm việc cho tôi (tôi thấy rằng bạn đang sử dụng 5,5). –

1

Câu hỏi khác nhau, nhưng tất cả awnsers đang ở đây: How do I insert NULL values using PDO?

Nói tóm lại:

$stmt->bindValue(':param', null, PDO::PARAM_INT); 

nên work.You cũng có thể sử dụng:

$stmt->execute(array(":param" => NULL)); 

Đối bindp aram bạn phải cung cấp giá trị trong biến (không phải hằng số), bindvalue bạn có thể sử dụng hằng số, vn

-1

Trong MySql bạn có thể sử dụng truy vấn

select * from atable where isnull(column_name); 

để kiểm tra giá trị null.

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