-3
私はコードでバグを追いかけていましたが、問題が見つかりました。準備されたステートメントを使用していて、配列を使用してパラメータを置き換えていました。私の問題は、準備されたクエリに名前付きパラメータを囲むことによって、パラメータが置き換えられないようにすることでした。一般的なログから単一引用符は、準備されたクエリのパラメータ置換をなぜ妨げるのですか?
try {
$conn = new PDO("mysql:host=$host;dbname=$db;", $user, $pass);
} catch(PDOException $e) {
echo $e->getMessage();
}
function insert_update_db($query, $params = NULL) {
global $conn;
try {
$sql = $conn->prepare($query);
$sql->execute($params);
}
catch(PDOException $e) {
echo $e->getMessage();
}
}
$params = array(":a" => 1, ":b" => "test_string");
$query = "INSERT INTO table1 VALUES (:a, :b)";
insert_update_db($query, $params);
$query = "INSERT INTO table1 VALUES (':a', ':b')";
insert_update_db($query, $params);
:あなたは、一般的なログから見ることができるように
Query INSERT INTO table1 VALUES ('1', 'test_string')
Query INSERT INTO table1 VALUES (':a', ':b')
、2番目のクエリパラメータを置き換えるものではありません。ここ
は、いくつかのサンプルコードです。なぜそれが起こるのですか?
引用符で囲まれている場合は、パラメータではなくリテラルなので、置き換えないでください。リテラル文字列 ':a'を挿入する必要があり、同じクエリ内にaというラベルの付いたパラメータがある場合はどうなりますか?パラメータとそれ以外のものとを区別することなく、 – Clive
はパラメータを引用符で囲まないでください。私は単引用符と二重引用符をエスケープしようとし、同じ動作を見た。 –
エスケープについては何を意味するのかよく分かりませんが、パラメータは決して引用しないでください。 DBエンジン(またはピンチでPDO自体)があなたのためにそれを世話します – Clive