当我尝试插入一个有保留字的数组时,我遇到了问题。
我可能会说真的很奇怪,看一看:
$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
答案 0 :(得分:1)
始终使用预准备语句在数据库中插入字符串。永远不要简单地连接它们。
问题不仅仅是保留字,而是由于特殊值或字符引起的各种错误(或攻击)。不要试图自己逃避所有这些:如果您使用预准备语句,数据库将为您处理。
根据今天推荐的PHP / MySQL库(PDO)查看这些示例:http://www.php.net/manual/en/pdo.prepared-statements.php
答案 1 :(得分:-1)
转义保留字,例如带有重音的标题