2011-07-19 53 views
0

好工作,我有我的DB這些表:PHP - 的strstr()不使用MySQL

表A:

id | haystack 
------------- 
1 | 682,401 
2 | 351 

表B:

id | needle 
------------- 
1 | 352 
2 | 682 
3 | 978 

所有我想要的要做的是檢查表A中的乾草堆是否包含表B中的任何針。我在PHP中使用了此代碼:

$res_A = mysql_query('SELECT * FROM table_A'); 
while($row_A = mysql_fetch_array($res_A)){ 
    $res_B = mysql_query('SELECT * FROM table_B'); 
    while($row_B = mysql_fetch_array($res_A)){ 
     if(strlen(strstr($row_A['haystack'], $row_B['needle']) > 0)){ 
      echo 'I found this needle: '.$row_B['needle'].' in this haystack: '.$row_A['haystack'].'<br />'; 
     } 
    } 
} 

但是,它不起作用。我試圖弄清楚整天,但沒有機會。我需要提及的是乾草堆和針塔是Varchars。

你能幫我解決這個問題嗎? 在此先感謝!

+0

什麼是「它不工作」是什麼意思?發生了什麼?你期望什麼? – KingCrunch

+2

首先,除非你總是有3個數字,否則使用'strstr'不是一個好主意。 (如果針頭含有52,但乾草堆有252?)另外,嘗試在乾草堆上使用['explode'](http://php.net/manual/en/function.explode.php)方法,然後使用[' in_array'](http://us3.php.net/manual/en/function.in-array.php)。 –

+0

我期待看到在table_a.haystack中包含table_b.needle的table_a.id(我希望我很清楚)。是的,看起來strstr不是一個好主意,所以我用sql代替了許多人的建議。這更容易和更快。 – Cosmi

回答

1

你爲什麼不全部保留在SQL服務器上?更容易和更快..

SELECT * from hay, needle WHERE hay.haystack LIKE CONCAT('%',needle.needle,'%');

+0

容易如餡餅!謝謝,這是我需要的解決方案! – Cosmi

0

試試這個:

$res_A = mysql_query('SELECT haystack FROM table_A'); 
while($row_A = mysql_fetch_array($res_A)){ 
    $res_B = mysql_query("SELECT needle FROM table_B WHERE needle = '" . $row_A['haystack'] . "'"); 
    if(mysql_num_rows($res_B) > 0) { 
      echo 'I found this needle: '.$row_B['needle'].' in this haystack: '.$row_A['haystack'].'<br />'; 
    } 
} 
+0

除了'needle'不必與'haystack'相等這個事實(所以你應該使用'LIKE'),你會遇到Brad Bradie在他對這個問題的評論中提到的問題。對字符串使用'explode()'並用'in_array()'檢查。 – Marco

1

通知您括號放置strlen(strstr($row_A['haystack'], $row_B['needle']) > 0)

嘗試:if(strlen(strstr($row_A['haystack'], $row_B['needle'])) > 0)

要包括在呼叫的> 0strlen

+0

此答案解決了您的代碼問題。但是,正如許多其他人所建議的那樣,我還建議使用查詢來加快處理速度。 – keithhatfield