「後,」當你寫的東西,如:
$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 ...;
}
}
Read more about Prepared Statements
你想太多了。準備好的語句以100%的速度逃避您的輸入。如果您需要查看最終查詢的樣子,則必須設置數據庫查詢日誌。 – netcoder 2011-01-07 16:39:42
@netcoder準備好的語句不會轉義任何東西(除非在兼容模式下)。查詢日誌 – 2011-01-07 16:50:01
@Col中沒有新內容。彈片:技術上來說是的,儘管你可以用你想要的方式說出來。至於「查詢日誌中沒有新內容」,我根本就不明白這是什麼意思...... – netcoder 2011-01-07 16:54:31