【问题标题】:PDO SQLITE Escape single quote backslashPDO SQLITE 转义单引号反斜杠
【发布时间】:2012-01-14 20:42:06
【问题描述】:

通过 SQLITE3 使用 PDO 到 CRUD。当我插入一个字符串 'did't' 时,该字符串会以 'didn\'t' 的形式进入表中。

所以,后来当我读回字符串以输出到 HTML 时,我的网页中没有。

那么,如果 PDO 使用反斜杠对 INSERT 上的单引号进行转义,我如何去除转义的反斜杠以进行演示?

这有意义吗?

编辑 - 包括代码。 $eventBody 是有问题的字符串。

try {
               $db = new PDO('sqlite:../posts.sqlite');
                $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
                }
            catch(PDOException $e)
                {
                    echo $e->getMessage();
                    die;
                }
                    //using the sqlite functions to do date/time stuff
        $query = 'INSERT INTO posts (eDay, eMonth, eYear, eTitle, eBody,author, eURL, eTime)
                  VALUES( strftime(\'%d\',\'now\') , strftime(\'%m\',\'now\') , strftime(\'%Y\',\'now\') ,"'. $eventTitle .'","'.$eventBody.'","' . $eventAuthor. '","' . $eventURL . '",time(\'now\',\'localtime\'));' ;

                try
                {
                $result=$db->query($query);
                if(!($result))
                {
                    echo "INSERT FAILED.<br>";
                    echo "QUERY STRING: ".$query ." <br>";
                    die;

                }
                    echo "Successfully Added Record";
                    $eventTitle = '';
                    $eventBody='';
                    $eventURL='';
                    $eventAuthor='';
            //      urlRedirect("Referback.php");
                }
                catch (PDOException $ex)
                {
                    echo $ex->getMessage();
                    die;
                }
                catch (Exception $exc)
                {
                    echo $exc->getMessage();
                    die;
                }
        }

【问题讨论】:

  • 能否提供插入代码?
  • 好的,构建查询的方式无法正常工作,因为您将 PHP 和 SQL 混合在一起。

标签: php sqlite pdo


【解决方案1】:

PDO 以应有的方式工作,您应该检查插入(构建查询)和数据源(即来自$_POST/$_GET 的内容)的方式。

特别是magic quotes gpc。如果您不知道它是什么,请检查一下。这是一个非常反复出现的问题。在开始使用stripslashes/addslashes 等之前。

您还应该使用prepared statement,它不仅更好,而且工作量更少,更安全。

$stmt = $db->prepare('INSERT INTO posts '.
    '(eDay, eMonth, eYear, eTitle, eBody, author, eURL, eTime) '.
    'VALUES (?, ?, ?, ?, ?, ?, ?, ?);');
$result = $stmt->execute(array(
    date('d'),
    date('m'),
    date('Y'),
    $eventTitle,
    $eventBody,
    $eventAuthor,
    $eventURL,
    time('now', 'localtime')
));

您还可以打印您提供给 ̀ execute` 的数据,以确保它是您想要的。

【讨论】:

  • 谢谢你。我看过有关准备好的陈述的帖子,我想我一直在努力避免重写。我经常在 MS SQL 中使用存储过程(为了工作),这种方法有点相似。我会试一试。感谢您抽出宝贵时间。
  • Gruet,您的代码开箱即用,效果很好。但是,字符串仍然像没有那样存储在表中。
  • 检查magic_quote_gpc和var_dump你给execute的数组,以确保那里一切正常。
  • 好的,我在这个站点上添加了示例 #2 中的函数,一切都很好。 php.net/manual/en/security.magicquotes.disabling.php
猜你喜欢
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 2014-06-19
相关资源
最近更新 更多