首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDO::准备()不转义SQL中的特殊字符

PDO::准备()不转义SQL中的特殊字符
EN

Stack Overflow用户
提问于 2013-06-25 23:33:48
回答 2查看 8.9K关注 0票数 1

来自HTML textarea元素的输入值不能插入到MySQL表中,因为它包含撇号(‘)字符例如:'Adam's garden'。因此,我按照prepare的建议使用了PDO::PHP ()函数,但我仍然无法将这些数据插入到表中,但是当我移除撇号以获得'Adams garden'时,该值将被成功插入。

我认为PDO::prepare()函数应该处理引号和转义SQL语句的特殊字符。PHP文档的确说过要使用绑定参数的PDO::prepare(),但是我没有限制我的php变量来查询参数。绑定参数是绝对必要的还是仅仅因为这是使用PDO::prepare()函数的通常方式而声明的呢?

否则,我如何在输入变量中引用和转义特殊字符?

编辑:--我正在使用字符串连接来执行多个INSERT。在下面示例代码的$evData['Description']字段中可以找到撇号。

代码语言:javascript
复制
$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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-25 23:37:16

PDO::prepare只创建准备好的语句。查询必须被正确地参数化,并且您必须向execute发送参数(或以其他方式绑定它们),以便正确地转义它们。例如:

代码语言:javascript
复制
$ta = $_REQUEST['textarea'];
$stmt = $pdo->prepare("INSERT INTO t1 VALUES (?)");
$stmt->execute(array($ta));

你可能在做的是

代码语言:javascript
复制
$pdo->prepare("INSERT INTO t1 VALUES ('" . $_REQUEST['ta'] . "')")->execute();

在这种情况下,输入不会被转义。

票数 7
EN

Stack Overflow用户

发布于 2013-06-26 01:28:36

SQL语句是代码。当您构建带有连接(或其他什么)的SQL查询时,您正在进行代码生成。在生成php代码(eval ("echo '$variable';");)或HTML代码(<h1><?= $header?></h1>)时,此代码生成也有相同的问题。在生成的代码中没有“数据”,只有代码本身。

有几种方法可以避免不必要的行为。

  1. 打包/解压缩:对数据库的数据变量使用base64 64_encode/FROM_base64 64,对eval使用base64 64_encode/base64 64_decode,对html使用html实体。
  2. 转义:$PDO::quote()表示数据库的数据变量,一些函数用于eval (例如,return '\'' . str_replace(array('\\', '\''), array('\\\\', '\\\''), $var) . '\'';)
  3. (不好)删除‘危险’结构:(例如‘$v= preg_replace('/UNION(?:\s+ALL)?\s+SELECT/i',’-‘,$a);)用于数据库,strip_tags用于HTML。
  4. 数据与代码分离:为数据库准备语句,生成函数,并将数据传递给数据库,使用构建HTML。

因此,准备语句的主要思想是将数据与代码分离。因此,您必须直接指定数据的位置和代码所在的位置。

使用准备语句插入的最简单方法是

代码语言:javascript
复制
$pdo->prepare('INSERT INTO `table` (`text`) VALUES(?);')->execute(array($text));

记住,准备好的陈述是避免麻烦的首选方法。如果你能用预先准备好的语句

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17309275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档