使用预准备语句但引号未被转义或删除

时间:2014-02-13 13:33:08

标签: php mysql sql pdo

我遇到一些问题,需要将一些内容插入到我的数据库中。如果我将单引号或双引号放入我的文本字段中,它将破坏查询并且不会转义它们。我刚刚完成阅读,使用预处理语句消除了调用mysql_real_escape_string的需要。有人能告诉我,如果我执行错误的查询。 $companyInfo是一个包含大约8行要插入的数组。

function InsertCompanyInfo($companyInfo, $conn) {
    foreach($companyInfo as $key => $table) {           
        $keys = array_keys($table);
            $values = null;
            $x = 1;

            foreach($table as $row => $value) {
                $values .= "'$value'";
                if($x < count($keys)) {
                    $values .= ', ';

                }
                $x++;
            }

        $sql = $conn->prepare("INSERT INTO {$key} (`" . implode('`, `', $keys) . "`) VALUES ({$values});");
        $sql->execute();
        $CompanyID = $conn->lastInsertId('CompanyID');
    }
    return $CompanyID;
}

这是我插入qoutes时出现的错误:

    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax
 error or access violation: 1064 You have an error in your SQL syntax; check the manual that
 corresponds to your MySQL server version for the right syntax to use near '1', 
''''"'"''"';;''';';')' at line 1' in /var/www/Survey/InsertFunctions.php:20 Stack trace: #0
 /var/www/Survey/InsertFunctions.php(20): PDOStatement->execute() #1 
/var/www/Survey/testProcess.php(8): InsertCompanyInfo(Array, Object(PDO)) #2 {main} thrown 
in /var/www/Survey/InsertFunctions.php on line 20

1 个答案:

答案 0 :(得分:1)

准备好的语句通过将查询结构和代码中的值分开来实现,如下所示:

$stmt = $pdo->prepare('INSERT INTO foo (bar) VALUES (?)');

这是查询结构,首先要了解数据库。 然后你分别给它值:

$stmt->execute(array('baz'));

您正在做的是在完全形成的查询上调用prepare,该查询包括粗略插值。这里没有prepare可以做的事情。转义值的整个问题是,数据库无法确定值是什么以及在事实之后您的查询部分是。如果您将查询完全形成并错误地转义到数据库,则无法神奇地识别出应该是什么。您需要向查询添加占位符,并在单独的步骤中提供相应的值。