2014-03-04 49 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

這將符合您的需求。 –

相關問題