为什么单引号会阻止准备好的查询中的参数替换?

时间:2017-04-21 17:08:13

标签: php pdo

我花了一些时间在我的代码中追逐一个错误,然后我找到了问题。我正在使用预准备语句并使用数组来替换参数。我的问题是,通过在准备好的查询中包含命名参数,它可以防止参数被替换。

以下是一些示例代码:

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')

从通用日志中可以看出,第二个查询不会替换参数。为什么会这样?

1 个答案:

答案 0 :(得分:1)

prepare方法正在分析查找替换的SQL查询字符串(:var或?)。引用的值不会被替换,否则您将无法在表字段中存储文字“:b”值。 您可以在此处获得有关PDO::prepare的更多信息 http://php.net/manual/en/pdo.prepare.php