我是PDO库的新手。我正在使用mysql作为我的数据库开发环境。使用“?”时,我可以使用prepare和execute函数运行查询使用命名占位符时的占位符和bindParam方法(例如:“:column”)。
在此之后,我尝试通过输入任何引号来清除查询,如mysql_real_escape_string,来查看PDO是否进行了任何类型的转义。我试图看看查询的外观,但我得到的只是传递给prepare语句的语句,而不是将要执行的查询。
我尝试了var_dump $ result-> execute()和$ result-> fetch()但是execute语句给了我带有占位符的prepare语句的sql,而fetch语句给了我该查询的结果。
有没有办法查看将要运行的查询查询,或者至少在运行查询之前参数的外观?
我希望我对自己的问题很清楚。 :|
答案 0 :(得分:6)
当你写下这样的东西时:
$stmt = $pdo->prepare('SELECT * FROM tbl_name WHERE col_name = :col_name;');
$stmt->bindValue('col_name', 'some \' value');
$stmt->execute();
实际查询是...... SELECT * FROM tbl_name WHERE col_name = :col_name;
。那叫做预备声明。首先,您将查询发送到数据库,稍后您将发送查询参数。 PDO不合并查询和参数。
您可能认为PDOStatement::bindValue()
的确如此:
public function bindValue($placeholer, $value, $valueType = PDO::PARAM_STR) {
$this->query = str_replace($placeholder, $this->quote($value, $valueType), $this->query);
}
但不。
它更像是这样:
public function execute() {
try {
$this->sendQueryToDatabase($this->query);
// Query is valid
$this->sendParametersToDatabase($this->parameters);
return $this->fetchResultSet();
} catch (... $e) {
// Query is invalid (eg. syntax error)
throw ...;
}
}
答案 1 :(得分:3)
直截了当。
PDO有两种运行预准备语句的模式:
?
标记(但没有命名的占位符由PDO替换为?
s)这两种方法都非常安全。
当你有一个变量标识符 ...
时,真正的危险就开始了答案 2 :(得分:1)
prepare语句由mysql处理,所以pdo不会转义请求, pdo发送请求并在“之后”参数
答案 3 :(得分:-1)
启用常规查询日志,并在运行简单语句时观察实际对服务器执行的查询 - 执行一些插入操作,例如,使用包含嵌入式引号或nuls的字符串。