【发布时间】:2013-06-22 22:55:10
【问题描述】:
我有来自HTMLtextarea 元素的输入值,因为它包含撇号(')字符,例如:'Adam's garden',所以无法插入到 MySQL 表中。因此,我按照 PHP 文档的建议使用了 PDO::prepare() 函数,但我仍然无法将此数据插入表中,但是当我删除撇号以获取 'Adams garden' 时,值已成功插入
我认为PDO::prepare() 函数应该处理 SQL 语句的引号和转义特殊字符。 PHP 文档确实说过要使用 PDO::prepare() 和绑定参数,但我没有将我的 php 变量绑定到查询参数。绑定参数是绝对必要的,还是仅仅因为这是使用PDO::prepare() 函数的常用方式而被声明?
我如何在输入变量中引用和转义特殊字符?
编辑:
我正在使用字符串连接来执行多个 SQL INSERT。撇号位于下面示例代码的$evData['Description'] 字段中。
$evQuery ="INSERT INTO ep_events
VALUES(NULL, '" .$evData['Title'] ."', '" .$evData['Venue'] ."', '" .$evData['Address'] ."', '" .$evData['Description'] ."')";
$tkQuery ="INSERT INTO ep_tickets VALUES";
foreach ($tkData as $ref =>$tkObj){
for($i=0; $i<$tkObj['Quantity']; $i++){
$tkQuery .='(NULL, LAST_INSERT_ID(), "' .$tkObj['Name'] .'", "' .$tkObj['Price'] .'"),';
}
}
$tkQuery =rtrim($tkQuery, ',');
$query ='START TRANSACTION;' .$evQuery ."; " .$tkQuery .';' .'COMMIT;';
$stm =$db->prepare($query);
$stm->execute();
这是 PHP 文档部分:
PDO::quote() 在输入字符串周围放置引号(如果需要)并转义输入字符串中的特殊 > 字符,使用适合底层 > 驱动程序的引用样式。
如果你使用这个函数来构建 SQL 语句,你就是 强烈推荐使用 PDO::prepare() 来准备 SQL 语句 使用绑定参数而不是使用 PDO::quote() 进行插值 用户输入到 SQL 语句中。带绑定的预处理语句 参数不仅更便携,更方便,不受 SQL 的影响 注入,但执行起来通常比插值快得多 查询,因为服务器端和客户端都可以缓存已编译的表单 的查询。 http://www.php.net/manual/en/pdo.quote.php
【问题讨论】:
-
不要引用文档,而是向我们展示您的代码。
-
为什么不能将撇号插入数据库...?
标签: php mysql pdo escaping quoting