2010-08-22 81 views
0

我创建了一个不起作用的用户定义的sql查询。用户应该能够在输入字段中输入搜索字符串,然后提交然后查看他们的搜索结果,但是每次我输入搜索的内容时,我都知道该数据库在数据库中,我在“where子句”中获取未知列“x” “ 错误信息。'where子句'中的未知列'xyz'

你能帮我解决这个问题吗?下面是我写的是到目前为止的代码...

... 
mysql_select_db("mydb", $c); 
$search = $_POST['search']; 

$rslt = mysql_query("SELECT * FROM mytable 
WHERE 'mycolumn' RLIKE $search"); 

while($row = mysql_fetch_array($rslt)) 
    { 
    echo $row['myrow']; 
    echo "<br />"; 
    } 

if (!$row) 
    { 
    die('uh oh: ' . mysql_error()); 
    } 

?> 
+0

尝试使用反引号而不是引号时“包装”表或列名称,但你应该引用字符串,如$ search – 2010-08-22 16:59:58

+0

那么你有一个名为mycolumn的列在那里?和一个名为mytable的表? – Iznogood 2010-08-22 17:02:02

回答

4

更改代码这样:
1)转换报价到各地列名反引号。
2)使用单个qoutes环绕$搜索,使其成为一个字符串。

$rslt = mysql_query("SELECT * FROM mytable WHERE `mycolumn` RLIKE '{$search}'"); 
+0

[反斜杠是不必要的,除非列名也是MySQL中的保留字](http://dev.mysql.com/doc/refman/5.0/en/reserved-words.html) – 2010-08-22 17:08:26

+0

非常感谢大家! ! :) – 2010-08-22 17:13:25

+0

@OMG小马,是的,但我们不知道在他的代码中mycolumn是否是保留名称。所以,遵循这种做法总是安全的。 – shamittomar 2010-08-22 17:23:55

0

我想补充一些关于安全性和性能的内容。

将用户输入(任何GET,POST或cookie数据)直接放入SQL查询是不安全的。这是一个严重的安全问题,称为SQL injection。要避免它,请使用mysql_real_escape_string()函数。

此外,SELECT * FROM mytable ...不是一个好的做法。建议明确列出,即使所需的所有列,如果他们都:

SELECT col1, col2, col3, col4, col5 FROM mytable ... 
1

这有助于肯定 只是改变变量$搜索将被解读为一个字符串即$search 所以它会是这样

$rslt = mysql_query("SELECT * FROM mytable WHERE mycolumn RLIKE '$search'");