2010-06-04 52 views
1

我写了很多来自XML文件的信息到数据库中。使用PHP插入数据到MySQL当它包含'

一切工作正常,直到我遇到一个领域与“在描述中,插入失败,错误

Error 

1064:You have an error in your SQL syntax; check the manual that 

相当于你的MySQL服务器 版本正确的语法使用 附近你也喜欢你也这样认为。 我们很想让您访问我们查看 超过100' 在行3

有没有一种方法能有这个插入没有它失败?导入文件可能会很大并且会定期更改,因此我无法搜索并替换其中的字符。

我实际的PHP语句:

$query = mysql_query("REPLACE into list 
(id, name, link, description, cost, date_added,type,myipaq,private,imgurl) 
VALUES ('$id','$name','$link',"'$description'",'$cost','$date','$type','$myipaq','$private','$imgurl')"); 

在此先感谢,

格雷格

+0

我不是一个PHP家伙或MySQL家伙,但你可以做一些HTML编码来编码它吗?然后你可以HTML解码它再次显示它。 – 2010-06-04 17:05:31

+0

啊..上师说它叫'mysql_real_escape_string' - 我觉得它和HTML编码是一样的概念 – 2010-06-04 17:08:49

+0

为什么'$ description'有双引号呢?这不会导致PHP错误,因为他们没有逃脱?和MySQL错误,如果他们逃脱?在MySQL之前用这个代码解决了 – 2010-06-04 17:42:23

回答

6

这种下降只是通过SQL注入的类别下的数据。

在PHP中有一个函数:mysql_real_escape_string用于编码一个字符串,这样它们都不会影响它可能连接到的SQL语句。

所以确保你所有的值都通过mysql_real_escape_string函数,你会没事的。

API REF:http://php.net/manual/en/function.mysql-real-escape-string.php

+0

Jeez NO。 -1,尽管所有的加号票。真正的转义字符串最好是坚持使用石膏,正确执行此操作的唯一方法是使用准备好的语句。 – Cruachan 2010-06-04 17:44:08

+0

*所以请确保你的所有值都经过了mysql_real_escape_string函数,你会没事的。*这个陈述是误导性的,并且是不真实的。这是一种改进,但不是完全可靠的解决方案。 – Cruachan 2010-06-04 23:06:58

1

通过mysql_real_escape_string()

+2

为了澄清,在创建之前,通过该函数传递每个值查询字符串。您不要在整个查询中使用该功能。 – 2010-06-04 17:10:32

+0

不,请使用预准备语句。 -1表示否则。 – Cruachan 2010-06-04 17:44:58

0

使用我的方便的花花公子功能:

function mysql_safe_string($value) { 
    if(is_numeric($value))  return $value; 
    elseif(empty($value))  return 'NULL'; 
    elseif(is_string($value)) return '\''.mysql_real_escape_string($value).'\''; 
    elseif(is_array($value)) return implode(',',array_map('mysql_safe_string',$value)); 
} 

function mysql_safe_query($format) { 
    $args = array_slice(func_get_args(),1); 
    $args = array_map('mysql_safe_string',$args); 
    $query = vsprintf($format,$args); 
    $result = mysql_query($query); 
    if($result === false) echo '<div class="mysql-error"><strong>Error: </strong>',mysql_error(),'<br/><strong>Query: </strong>',$query,'</div>'; 
    return $result; 
} 

像这样:

mysql_safe_query('INSERT INTO table VALUES (%s, %s, %s)', $val1, $val2, $val3); 

而忘记引用或引用没有你的字符串,并写出mysql_real_escape_string了十几次。

+0

不是一个坏主意。但是如果他们的数组已经包含','但是呢? – 2010-06-04 17:47:57

+0

@Brendan:你是什么意思?如果数组中的值已经有尾随逗号?他们会被引用,并用逗号插入数据库...谁低估了这一点? – mpen 2010-06-04 17:57:33

+0

我投了票,因为有人已经投票否决了(我认为这是一个好主意)。我问的是,如果他们得到这个数组:'{“x”,“y”,“,”}'?它不会被转换为:“x,y ,,”,那么当它变成一个数组时:'{“x”,“y”,“”,“”}'? – 2010-06-04 20:13:24

0

插入,替换或实际上与PHP数据库上的任何事情交互的唯一真正安全的方式是使用预处理语句。再也没有任何理由以任何其他方式去做。使用mysql_real_escape_string转义字符串会给你一些保护,但它不是防弹的。

准备好的陈述并不困难。看到他们的PHP manual页面,有几个包装让生活变得更加简单,我个人喜欢codesense mysqli wrapper很多,并且已经使用它一段时间没有问题 - 它不比直接的MySQL PHP代码更难。 EasyPDO也看起来很有希望。

您应该查看相关问题"PHP: Is mysql_real_escape_string" sufficient for cleaning user input"了解更多关于您为什么不应该懒惰的更多细节。

+0

+1真实但更难使用 – 2010-06-04 20:16:23

+0

@Brendan,根本用不了多少,特别是如果你使用包装。坦率地说,如果任何人的编码水平受到准备好的陈述的挑战,他们应该放弃并去做别的事情。 – Cruachan 2010-06-04 23:03:22