2017-04-21 4 views
-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番目のクエリパラメータを置き換えるものではありません。ここ

は、いくつかのサンプルコードです。なぜそれが起こるのですか?

+2

引用符で囲まれている場合は、パラメータではなくリテラルなので、置き換えないでください。リテラル文字列 ':a'を挿入する必要があり、同じクエリ内にaというラベルの付いたパラメータがある場合はどうなりますか?パラメータとそれ以外のものとを区別することなく、 – Clive

+0

はパラメータを引用符で囲まないでください。私は単引用符と二重引用符をエスケープしようとし、同じ動作を見た。 –

+0

エスケープについては何を意味するのかよく分かりませんが、パラメータは決して引用しないでください。 DBエンジン(またはピンチでPDO自体)があなたのためにそれを世話します – Clive

答えて

1

prepareメソッドは、置換文字(:varまたは?)を検索するSQLクエリ文字列を解析しています。引用された値は置き換えられません。そうでなければ、テーブルフィールドにリテラル ':b'値を格納することができなくなります。 さらに詳しい情報をご希望の場合PDO::prepare http://php.net/manual/en/pdo.prepare.php

関連する問題