Tôi gặp sự cố lạ với php PDO và mysql.Cập nhật MySQL bằng PDO và tuyên bố chuẩn bị không hoạt động
Tôi có bảng sau:
create table test_table (id integer, value text);
với một hàng duy nhất:
insert into test_table values (1, "asdf");
khi tôi cố gắng cập nhật hàng duy nhất này với một tuyên bố chuẩn bị, tôi có hành vi khác nhau tùy theo cú pháp tôi sử dụng:
// connection to db (common code)
$dbh = new PDO("mysql:host=localhost;dbname=test", "myuser", "mypass");
======================================== =================
// WORKING
$q = 'update test_table set id=1, value='.rand(0,99999).' where id=1';
$dbh->exec($q);
=========================================== ==============
// WORKING
$q = 'update test_table set value=:value where id=:id';
$par = array(
"id" => 1,
"value" => rand(0,99999)
);
$sth = $dbh->prepare($q, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute($par);
============================= ============================
// NOT WORKING
$q = 'update test_table set id=:id, value=:value where id=:id';
$par = array(
"id" => 1,
"value" => rand(0,99999)
);
$sth = $dbh->prepare($q, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute($par);
Trong trường hợp thứ ba, trên máy chủ của tôi, bản cập nhật không được thực hiện trên hàng, không có lý do nào cũng không ngoại lệ/lỗi. Trên một máy chủ khác nó hoạt động. Tôi không tìm kiếm câu trả lời như: "và như vậy? Sử dụng triển khai đầu tiên hoặc thứ hai" :)
Tôi hỏi lý do triển khai thứ ba không hoạt động vì tôi đang di chuyển nhiều mã từ máy chủ sang một số khác (không phải mã của tôi) và nó chứa nhiều truy vấn như thế này và tôi không có thời gian để sửa chúng từng cái một. Trên máy chủ hiện tại, nó hoạt động và trên máy chủ mới nó không hoạt động.
Tại sao triển khai thứ ba không hoạt động? Có bất kỳ loại cấu hình cho php/pdo/mysql mà có thể ảnh hưởng đến hành vi này?
Cảm ơn.
Cập nhật: Cố gắng sqeeze ra thông báo lỗi:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
// NOT WORKING
$q = 'update test_table set id=:id, value=:value where id=:id';
$par = array(
"id" => 1,
"value" => rand(0,99999)
);
$sth = $dbh->prepare($q, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
print_r($sth);
print_r($dbh->errorInfo());
} catch(PDOException $e) {
echo $e->getMessage();
}
$sth->execute($par);
Thực thi mã này trên cả hai máy chủ (làm việc và không làm việc):
PDOStatement Object
(
[queryString] => update test_table set id=:id, value=:value where id=:id
)
Array
(
[0] => 00000
[1] =>
[2] =>
)
Cập nhật 2
Xem xét bài kiểm tra tiếp theo này:
create table test_table (value0 text, value text);
insert into test_table values ("1", "pippo");
// NOT WORKING
$q = 'update test_table set value0=:value0, value=:value where value0=:value0';
$par = array(
"value0" => "1",
"value" => rand(0, 839273)
);
create table test_table (value0 text, value text);
insert into test_table values ("pippo", "1");
// WORKING
$q = 'update test_table set value=:value, value0=:value0 where value=:value';
$par = array(
"value" => "1",
"value0" => rand(0, 839273)
);
Đáng kinh ngạc phải không? Nghi ngờ của tôi bây giờ là tồn tại một số beahaviour cập nhật đặc biệt được thực hiện cho đầu tiên cột của mỗi bảng trên PDO + giữ chỗ xử lý.
Bạn đang sử dụng: id cả để thay đổi giá trị của 'id' cũng như để xác định hàng. Bạn có chắc đó là điều bạn muốn làm không? – middus
@middus: như anh ấy nói: "Tôi đang di chuyển rất nhiều mã từ máy chủ sang máy chủ khác (không phải mã của tôi) và nó chứa nhiều truy vấn như thế này và tôi không có thời gian để sửa từng cái một" –
Tôi biết, đó không phải mã của tôi. Tôi chưa bao giờ làm thế. Tuy nhiên, tôi muốn biết tại sao nó không hoạt động trên một máy chủ và nó hoạt động trên máy chủ khác. –