我遇到一些问题,需要将一些内容插入到我的数据库中。如果我将单引号或双引号放入我的文本字段中,它将破坏查询并且不会转义它们。我刚刚完成阅读,使用预处理语句消除了调用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
答案 0 :(得分:1)
准备好的语句通过将查询结构和代码中的值分开来实现,如下所示:
$stmt = $pdo->prepare('INSERT INTO foo (bar) VALUES (?)');
这是查询结构,首先要了解数据库。 然后你分别给它值:
$stmt->execute(array('baz'));
您正在做的是在完全形成的查询上调用prepare
,该查询包括粗略插值。这里没有prepare
可以做的事情。转义值的整个问题是,数据库无法确定值是什么以及在事实之后您的查询部分是。如果您将查询完全形成并错误地转义到数据库,则无法神奇地识别出应该是什么。您需要向查询添加占位符,并在单独的步骤中提供相应的值。