PHP PDOとmysqlに奇妙な問題があります。単一の行を持つPDOを使用したMySQLのアップデートと準備されたステートメントが動作しない
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);
、私のサーバー上で、更新は上行われていません何らかの理由も例外/エラーもなしに行を追加します。別のサーバー上で動作します。私は次のような答えを探していません: "それで、最初の実装か2番目の実装を使用しますか?"
私はなぜサーバーから多くのコードをもう1つ(これは私のコードではない)です。このようなクエリが多数含まれており、1つずつ修正する時間がありません。現在のサーバーでは動作し、新しいサーバーでは動作しません。
なぜ3番目の実装が機能しないのですか?この動作に影響を与える可能性のあるphp/pdo/mysqlの設定はありますか?
ありがとうございました。
更新:両方のサーバー上でこのコードを実行する(作業と動作していない)
$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);
: はエラーメッセージを出しsqeezeしようとしました
PDOStatement Object
(
[queryString] => update test_table set id=:id, value=:value where id=:id
)
Array
(
[0] => 00000
[1] =>
[2] =>
)
アップデート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)
);
信じられないほどですか?私の容疑者は現在、PDO +プレースホルダ処理のすべてのテーブルの最初の列のために特別に作られた特別なアップデートbeahaviourが存在します。
あなたが使用している:IDを両方の「ID」の値を変更するだけでなく、行を識別します。あなたはそれがあなたがしたいことだと確信していますか? – middus
@middus:「私はコードをサーバーから別のコードに移行していますが、このようなクエリが多数含まれており、1つずつ修正する時間がありません」 –
私は知っている、それは私のコードではない。私は決してそれをしないだろう。それでも、サーバー上で動作しない理由と、別のサーバーで動作する理由を知りたいと思います。 –