Php 使用已准备好的语句,但未转义或删除引号

Php 使用已准备好的语句,但未转义或删除引号,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我在将一些东西插入数据库时遇到问题。如果我在文本字段中输入单引号或双引号,它将中断查询,并且不会转义它们。我刚刚读到,使用预先准备好的语句就不需要调用mysql\u real\u escape\u string了。有人能告诉我我的查询是否执行错误吗$companyInfo是一个包含大约8行要插入的数组 function InsertCompanyInfo($companyInfo, $conn) { foreach($companyInfo as $key => $table) {

我在将一些东西插入数据库时遇到问题。如果我在文本字段中输入单引号或双引号,它将中断查询,并且不会转义它们。我刚刚读到,使用预先准备好的语句就不需要调用mysql\u real\u escape\u 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;
}

准备好的语句通过在代码中分离查询结构和值来工作,如下所示:

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

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

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

这不是使用预处理语句的方式。您希望在查询中使用占位符(
),而不是直接连接内爆结果。请再次阅读如何使用准备好的语句
$stmt = $pdo->prepare('INSERT INTO foo (bar) VALUES (?)');
$stmt->execute(array('baz'));