mac*_*cha 5 php mysql pdo sql-injection prepared-statement
我是PDO库的新手.我正在使用mysql作为我的数据库开发环境.使用"?"时,我可以使用prepare和execute函数运行查询 使用命名占位符时的占位符和bindParam方法(例如:":column").
在此之后,我尝试通过输入任何引号来清除查询,如mysql_real_escape_string,来查看PDO是否进行了任何类型的转义.我试图看看查询的外观,但我得到的只是传递给prepare语句的语句,而不是将要执行的查询.
我尝试var_dump $ result-> execute()和$ result-> fetch()但是execute语句给了我带有占位符的prepare语句的sql,而fetch语句给了我该查询的结果.
有没有办法查看将运行的查询查询,或至少在运行查询之前参数的外观?
我希望我对自己的问题很清楚.:|
当你写下这样的东西:
$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 ...;
    }
}