0

当我尝试插入一个包含保留字的数组时遇到问题。

我可能会说真的很奇怪,看看:

$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 fetch,但这并不重要,问题是有时当数组$title或$image上有一个保留字如“use”时,sql会返回错误“错误:您的 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 注入或攻击,但它用保留字解决了我的问题。现在我可以将 $array 中的任何内容插入到数据库中。

如果有人在这里遇到同样的问题,这就是我所做的(如果你们发现任何尴尬,请抱怨):

$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

4

2 回答 2

1

始终使用准备好的语句在数据库中插入字符串。永远不要简单地连接它们。

问题不仅在于保留词,还在于由于特殊值或字符引起的各种错误(或攻击)。不要试图自己逃避这一切:如果您使用准备好的语句,数据库将为您处理。

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

于 2012-08-28T19:07:21.343 回答
-1

转义保留字,如带重音的标题

于 2012-08-28T19:10:35.397 回答