$数组中的SQL保留字导致错误



当我试图插入一个带有保留字的数组时遇到了问题。

我可能会说,这真的更糟,看看:

$sql="INSERT INTO sites (cat_id, cat_title, cat_parent, title, image, site_name, description) VALUES ('$_POST[cat_id]','$_POST[cat_title]','$_POST[cat_parent]','$title','$image','$site_name','$description')";

数组是从我创建的一个opengraph获取中混合而来的,但这并不重要,问题是,有时当数组$title或$image上有一个保留词,如"use"时,sql会返回错误"error:您的sql语法有错误;请查看相应的手册…"

所以情况就是这样:

当数组$title=http://techcrunch.com/2012/08/28/flipboard-hits-20-million-users-3-billion-flips-per-month/<----它不起作用,我收到上面的错误。

当数组为$title=时http://techcrunch.com/2012/08/27/google-nexus-7-is-now-available-in-france-germany-and-spain/<----它工作得很好!

所以我认为这可能是因为数组$title中有时(或我使用的任何其他数组)有一个"保留字"正在返回错误。。。那么,有什么方法可以保护我的数组不受此错误的影响呢?

谢谢!:)


编辑:

解决方案

好的!我遵循了@dystroy和@tadman的建议,使用PDO而不是常规的mysql连接。。。我不知道我是否完全可以抵御SQL攻击,但它用保留字解决了我的问题。现在,我可以将$数组中的任何内容插入到数据库中。

如果有人最终也遇到了同样的问题,我就是这么做的(如果你们觉得有什么尴尬,请抱怨):

$dbh = new PDO("mysql:host=MYHOST;dbname=MYDATABASE", "USER", "PASS");
$query = "INSERT INTO sites (cat_id, cat_title, cat_parent, title, image, site_name, description) VALUES (:cat_idpost, :cat_titlepost, :cat_parentpost, :titlepost, :imagepost, :site_namepost, :descriptionpost)";
$stmt = $dbh->prepare($query);
$stmt->bindParam(':cat_idpost', $cat_id);
$stmt->bindParam(':cat_titlepost', $cat_title);
$stmt->bindParam(':cat_parentpost', $cat_parent);
$stmt->bindParam(':titlepost', $titlepost);
$stmt->bindParam(':imagepost', $imagepost);
$stmt->bindParam(':site_namepost', $site_namepost);
$stmt->bindParam(':descriptionpost', $descriptionpost);
$cat_id = $_POST['cat_id'];
$cat_title = $_POST['cat_title'];
$cat_parent = $_POST['cat_parent'];
$titlepost = $title;
$imagepost = $image;
$site_namepost = $site_name;
$descriptionpost = $description;
$stmt->execute();

谢谢你们!:D

始终使用prepared语句在数据库中插入字符串。永远不要简单地将它们连接起来。

问题不仅在于保留单词,还在于由于特殊值或字符引起的所有错误(或攻击)。不要试图自己逃避所有这些:如果你使用一个预先准备好的语句,数据库会为你处理这些。

看看那些基于今天推荐的PHP/MMySQL(PDO)库的示例:http://www.php.net/manual/en/pdo.prepared-statements.php

用重音符号转义标题等保留词

最新更新