我花了一些时间在我的代码中追逐一个错误,然后我找到了问题。我正在使用预准备语句并使用数组来替换参数。我的问题是,通过在准备好的查询中包含命名参数,它可以防止参数被替换。
以下是一些示例代码:
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')
从通用日志中可以看出,第二个查询不会替换参数。为什么会这样?
答案 0 :(得分:1)
prepare
方法正在分析查找替换的SQL查询字符串(:var或?)。引用的值不会被替换,否则您将无法在表字段中存储文字“:b”值。
您可以在此处获得有关PDO::prepare
的更多信息
http://php.net/manual/en/pdo.prepare.php