我如何清理下面的查询?

时间:2011-03-21 05:32:20

标签: php mysql

有人可以教我如何清理查询吗?我应该清理$ first_word吗?

$question_text = sanitize($_POST['question_text']);

list($first_word) = explode(' ', $question_text);

$qStuff=mysql_query("SELECT c.field_name,t.category_name, d.domain_name FROM category_fields c, taxonomy_category t, taxonomy_domain d WHERE c.category_id = t.category_id AND t.domain_id = d.domain_id AND c.field_name = '$first_word'");

5 个答案:

答案 0 :(得分:2)

像这样使用PDO和参数绑定:

$sql = "INSERT INTO table (field) VALUES (?)";
$sth = $dbh->prepare($sql); 
$sth->execute(array($value));

答案 1 :(得分:1)

如果您想继续使用mysql_*功能,则必须使用mysql_real_escape_string()来转义字符串数据:

$first_word_escaped = mysql_real_escape_string($first_word);
$qStuff=mysql_query("SELECT c.field_name,t.category_name, d.domain_name FROM category_fields c, taxonomy_category t, taxonomy_domain d 
     WHERE c.category_id = t.category_id 
           AND t.domain_id = d.domain_id 
           AND c.field_name = '$first_word_escaped'");


注意:如Overview of the mysqli extension (引用)中所述

  

什么是PHP的MySQL扩展?

     

这是原始扩展名   旨在让您开发PHP   与a交互的应用程序   MySQL数据库。
mysql扩展   提供了一个程序界面,并且是   仅适用于MySQL   版本低于4.1.3。
这个   扩展可以与版本一起使用   MySQL 4.1.3或更新版本,但不是全部版本   最新的MySQL服务器功能将   可用。

     

注意:如果您使用的是MySQL 4.1.3或更高版本,则强烈要求   建议你使用    mysqli 扩展名。


另一种解决方案是停止使用mysql_*家庭功能,并使用准备语句切换到eiter mysqliPDO,这是新功能之一 mysql_*不支持:

有了这些,您将不得不逃避您的数据:它将在绑定其值时自动完成。

答案 2 :(得分:0)

“Sanitizing”不一定与“SQL转义”相同。对于MySQL的SQL转义值,对要放入查询的值使用mysql_real_escape_string

$first_word = current(explode(' ', $_POST['question_text']));

// sanitize $first_word here if you want to to remove certain things

mysql_query("SELECT … '" . mysql_real_escape_string($first_word) . "'");

答案 3 :(得分:0)

我建议使用preg_match语句来限制字符类型。我还建议使用PHP PDO和准备好的SQL语句。我在手机上或者我会发布链接。

答案 4 :(得分:0)

使用像PDO这样的现代数据库功能,并使用参数化查询。