У меня возникла странная проблема с php PDO и mysql.Обновление MySQL с использованием PDO и подготовленный оператор не работает
У меня есть следующая таблица:
create table test_table (id integer, value text);
с единственной строкой:
insert into test_table values (1, "asdf");
, когда я пытаюсь обновить эту одну строку с заранее подготовленным заявлением, я получил различное поведение в зависимости от синтаксиса Я использую:
// 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);
В третьем случае, на моем сервере, обновление не выполняется строка, без каких-либо причин и исключений/ошибок. На другом сервере это работает. Я не ищу ответы вроде: «и так? Используйте первую или вторую реализацию» :)
Я спрашиваю, почему третья реализация не работает, потому что я переношу много кода с сервера на другой (это не мой код), и он содержит много запросов, подобных этому, и у меня нет времени исправлять их по одному. На текущем сервере это работает, а на новом - нет.
Почему третья реализация не работает? Существует ли какая-либо конфигурация для php/pdo/mysql, которая может повлиять на это поведение?
Спасибо.
Update: Пробовал sqeeze сообщения об ошибках:
$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);
Выполнение этого кода на обоих серверах (работает и не работает):
PDOStatement Object
(
[queryString] => update test_table set id=:id, value=:value where id=:id
)
Array
(
[0] => 00000
[1] =>
[2] =>
)
Update 2
Посмотрите на эту дополнительную проверку:
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)
);
Невероятный, не так ли? Мой подозреваемый сейчас заключается в том, что существует специальный специальный beahaviour update специально для первый столбец каждой таблицы по обработке PDO +.
Вы используете: идентификатор и изменить значение «ид», а также для идентификации строки. Вы уверены, что это то, что вы хотите сделать? – middus
@middus: как он сказал: «Я переношу много кода с сервера на другой (не мой код), и он содержит много запросов, подобных этому, и у меня нет времени исправлять их по одному» –
Я знаю, это не мой код. Я никогда этого не сделаю. Тем не менее, я хотел бы знать, почему он не работает на сервере, а другой - на другом. –