来自HTML textarea元素的输入值不能插入到MySQL表中,因为它包含撇号(‘)字符例如:'Adam's garden'。因此,我按照prepare的建议使用了PDO::PHP ()函数,但我仍然无法将这些数据插入到表中,但是当我移除撇号以获得'Adams garden'时,该值将被成功插入。
我认为PDO::prepare()函数应该处理引号和转义SQL语句的特殊字符。PHP文档的确说过要使用绑定参数的PDO::prepare(),但是我没有限制我的php变量来查询参数。绑定参数是绝对必要的还是仅仅因为这是使用PDO::prepare()函数的通常方式而声明的呢?
否则,我如何在输入变量中引用和转义特殊字符?
编辑:--我正在使用字符串连接来执行多个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文档段:
引用()将引号放在输入字符串周围(如果需要的话),并在输入字符串中转义特殊>字符,使用适合底层>驱动程序的引用样式。 如果使用此函数构建SQL语句,则强烈建议使用PDO::input ()来准备具有绑定参数的SQL语句,而不是使用PDO::quote()将用户输入插入到SQL语句中。具有绑定参数的准备语句不仅更可移植、更方便、更不受SQL注入的影响,而且执行速度往往比内插查询快得多,因为服务器和客户端都可以缓存已编译的查询形式。http://www.php.net/manual/en/pdo.quote.php
发布于 2013-06-25 23:37:16
PDO::prepare只创建准备好的语句。查询必须被正确地参数化,并且您必须向execute发送参数(或以其他方式绑定它们),以便正确地转义它们。例如:
$ta = $_REQUEST['textarea'];
$stmt = $pdo->prepare("INSERT INTO t1 VALUES (?)");
$stmt->execute(array($ta));你可能在做的是
$pdo->prepare("INSERT INTO t1 VALUES ('" . $_REQUEST['ta'] . "')")->execute();在这种情况下,输入不会被转义。
发布于 2013-06-26 01:28:36
SQL语句是代码。当您构建带有连接(或其他什么)的SQL查询时,您正在进行代码生成。在生成php代码(eval ("echo '$variable';");)或HTML代码(<h1><?= $header?></h1>)时,此代码生成也有相同的问题。在生成的代码中没有“数据”,只有代码本身。
有几种方法可以避免不必要的行为。
return '\'' . str_replace(array('\\', '\''), array('\\\\', '\\\''), $var) . '\'';)因此,准备语句的主要思想是将数据与代码分离。因此,您必须直接指定数据的位置和代码所在的位置。
使用准备语句插入的最简单方法是
$pdo->prepare('INSERT INTO `table` (`text`) VALUES(?);')->execute(array($text));记住,准备好的陈述是避免麻烦的首选方法。如果你能用预先准备好的语句
https://stackoverflow.com/questions/17309275
复制相似问题