2012-01-13 108 views
1

我有一个脚本,当我提交它时,我提交了一些输入到MySQL数据库的字段,现在它成功通过,但是如果其中一个字段有撇号,它永远不会被插入到数据库中。我可以修改什么来实现这个功能?插入MySQL时的撇号问题

if ($_POST) { 
$name = trim($_POST['your_name']); 
$email = trim($_POST['your_email']); 
$answers = $_POST['answers']; 
$i = 0; 
foreach ($answers as $a) { 
    if (trim($a)) 
     $i++; 
} 

if ($name && $email && $i >= 40) { 
    $array = array(); 
    $q = mysql_query("select * from fields"); 
    while($f = mysql_fetch_array($q)) 
     $array[$f['label']] = $answers[$f['ID']]; 

    $array = serialize($array); 
    $time = time(); 
    $ip = $_SERVER['REMOTE_ADDR']; 
    $token = md5($time); 

    $result = mysql_query("insert into data (submit_name, submit_email, submit_data, submit_confirm, submit_time, submit_ip, submit_token) 
     values ('$name', '$email', '$array', '0', '$time', '$ip', '$token')"); 
+2

这就是为什么'mysql_query'函数应该可能从PHP中删除。只要有可能,几乎**总是**,请使用[预先准备的语句](http://php.net/manual/en/pdo.prepared-statements.php)。您没有任何理由将用户输入的文本直接放入SQL中。 – tadman 2012-01-13 16:30:29

+2

核心开发团队拼命想要杀死mysql/mysqli,但网络上有**这么多**可怕的过时“教程”,它会破坏**这么多**现有的垃圾代码。 – rdlowrey 2012-01-13 16:32:15

+1

我一直在这里更频繁地观看MySQL标签,我非常害怕人们对SQL转义的无知。这就像他们甚至懒得提及它。在一个公正的世界中,编写这样的代码将会是一场**大罪行**。 – tadman 2012-01-13 16:34:04

回答

0

使用mysql_real_escape_string(),因为这将解决您的撇号问题,并至少部分有助于避免SQL注入攻击。如果你不想用PHP的内置PDO库弄脏你的手,你可能会考虑一个数据库抽象层(DBAL)。 ADODB就是一个例子。

+0

任何指向我的脚本的地方?对不起,我在这里是一个小菜鸟,而且我有这个脚本是由其他人写的。 – techora 2012-01-13 16:45:38

+0

@kcray:在将其添加到查询中之前,您将用该函数包装每个用户提供的字符串。 – Crontab 2012-01-13 16:48:37

+0

你有几分钟吗?你能联系我吗? impactfactor1 [在]的Gmail [点] com – techora 2012-01-13 17:01:59

3

您需要escape characters with special meaning in MySQL in your data

快速和改善您的代码的方法是将所有字符串通过mysql_real_escape_string之前,将它们插入到您的SQL字符串中。

更好的方法是从mysql_query切换到允许使用bound parameters (preferably with prepared statements)的东西。

+0

PHP是否有简单的独立ORM?或者它们是否都捆绑到CakePHP或CodeIgniter中? – tadman 2012-01-13 16:36:20

+0

如果没有,我会感到惊讶,但我试图避免PHP,所以我不知道。 – Quentin 2012-01-13 16:39:00

+0

任何指向我的脚本的地方?对不起,我在这里是一个小菜鸟,而且我有这个脚本是由其他人写的。 – techora 2012-01-13 16:47:16