2014-03-04 73 views
0

我有一个包含数据的数组,并且我正在循环数据。PHP检查数据库是否包含字符串

对于每个字符串,我想检查它是否存在于数据库(整个表)中。它可能在另一个字符串中(如果表中包含heyredcat,并且您检查红色,它也会返回true)。

我想出了这个示例脚本,但我不能拿出一个MySQL查询,谷歌搜索导致了许多伟大的建议,如果“列等于字符串”,但不是整个表中的字符串。

<?php 
$colors = array("red","green","blue","yellow"); 
foreach ($colors as $value) 
    { 
     $result = mysql_query("SELECT * FROM products where $value ...... ") or die(mysql_error()); 
     if($result){ 
     echo "Color" .$value. "is present"; 
     else { 
     echo "Color" .$value. "is not present"; 
     } 
    } 
?> 

我应该使用哪些MySQL查询?另外,我想知道,这是一种有效的方法吗? (耗时)

+0

tssss坏编辑。 无论如何,希望我的整个数据库搜索脚本将帮助其他人。 BOUH你! –

回答

3

这是查询能看起来像:

$res = mysql_query("SELECT 1 FROM `products` WHERE 
    `col1` LIKE '%" . $value . "%' 
    OR `col2` LIKE '%" . $value . "%' 
    OR `col3` LIKE '%" . $value . "%' 
    .. etc 
"); 
$num = mysql_num_rows($res); 
if ($num === 0) { // not found 

记住,这是容易受到SQL注入,如果颜色列表可以由用户挑选。

所以,你会想做的事:

$value = mysql_real_escape_string($value); 
mysql_query("SELECT 1 FROM `products` WHERE 
    `col1` LIKE '%" . $value . "%' 
    OR `col2` LIKE '%" . $value . "%' 
    OR `col3` LIKE '%" . $value . "%' 
    .. etc 
"); 

可以动态地看mysql的架构产生的列名。秘诀在于首先执行SELECT * FROM table LIMIT 1以获取所有列名称。


甚至更​​好的是使用PDO驱动器,其具有更好的(不易出错)将参数代入查询的方式。

+0

感谢您的答复(&编辑)。它工作的很棒,你提到了真正的游戏,我几乎忘记了。唯一需要注意的是你的方法需要一个列,而我更愿意搜索整个表 – Mdlc

+0

“对于每个字符串,我想检查它是否存在于数据库(整个数据库)中。” –

+0

我的意思是表,而不是整个数据库顺便说一句(我马上编辑),但@Loic这个答案不涉及这一点。 – Mdlc

0

您还需要数据库中每个表的列表循环访问,并查询每个表中的每列。我不知道可以查询数据库中每个表中的每个列的查询。也许你会更好地使用mysqldump和grep?

+0

information_schema是关键。 –

2

如果你想检查整个数据库,那么你做错了。

下面是关于如何做到这一点的主线:

首先收集所有数据库表和列:

Select table_schema, table_name, column_name from information_schema.COLUMNS where table_schema=[your_db_name] and table_name=[your_table_name] 

你只得到了整个数据库服务器列。

现在,您需要检查每个列是否与您的字符串类似。

<?php 
while ($row = mysqli_fetch_array($result)){ 
    mysqli_select_db($row['table_schema']); 
    $res = mysqli_query('select * from '.$row['table_name'].' where '.$row['column_name'].' like "%'.$your_string.'%"'); 
    while($res_line = mysqli_fetch_array($res)){ 
     var_dump($res_line); 
    } 
} 

?> 

哦,我不承担任何责任分贝滞后:d

,你可能要添加的TABLE_SCHEMA,table_name和列名在你的场,我不会把所有的乐趣,有一些。

+0

感谢您的回答,尤其是对于整合我的请求来搜索整个表。 – Mdlc

+0

这将符合您的需求。 –

相关问题