2013-04-30 94 views
0

我有一個PHP中的數組,循環一組名稱(和一個相應的數量)。我想打印在MYSQL數據庫表(我已成功連接)中找到的那些表。我目前使用的代碼是:MySQL包含變量

foreach ($arr as $name => $quan) { 
$query = "SELECT * FROM table WHERE name='$name'"; 
$result = mysql_query($query) or die(mysql_error()); 
if (mysql_num_rows($result) > 0) { 
    $row = mysql_fetch_array($result); 
    echo $quan." ".$row['name']. "\n"; 
} 
} 

由於某些原因,這隻會打印數組中的最後一個數量和名稱。幫幫我? 例如,如果數組的鍵值對爲{A-4,B-2,C-3},並且表中包含{A,B,D}作爲名稱...它將只打印「2 B 」。

+2

停止使用'mysql_query()'!改用MySQLi或PDO。 – Raptor 2013-04-30 07:26:40

+0

是指你的編輯,只有那些不存在的數據庫纔會打印出來? – Raptor 2013-04-30 07:42:23

+0

哎呀,不好的例子,沒有注意。固定。 – user1535846 2013-04-30 07:46:43

回答

4

更改代碼如下:

foreach ($arr as $name => $quan) { 
    $query = "SELECT * FROM table WHERE name='$name'"; 
    $result = mysql_query($query) or die(mysql_error()); 
    if (mysql_num_rows($result) > 0) { 
    while($row = mysql_fetch_array($result)) { 
     echo $quan." ".$row['name']. "\n"; 
    } 
    } 
} 

你必須通過結果循環。順便說一句,停止使用mysql_query()!改用MySQLi或PDO(並注意SQL注入;您可以使用mysqli_real_escape_string()來處理輸入參數)。對於庫MySQLi實現,那就是:

foreach ($arr as $name => $quan) { 
    $query = "SELECT * FROM table WHERE name='$name'"; 
    $result = mysqli_query($query) or die(mysqli_error()); 
    if (mysqli_num_rows($result) > 0) { 
    while($row = mysqli_fetch_array($result)) { 
     echo $quan." ".$row['name']. PHP_EOL; 
    } 
    } 
} 

而且相當"\n",我更喜歡使用PHP_EOL(如上圖所示)


而作爲意見認爲,該SQL語句可以執行一次,如如下:

$flipped_array = array_flip($arr); // flip the array to make "name" as values" 
for($i = 0; $i < count($flipped_array); $i++) { 
    $flipped_array[$i] = '\'' . $flipped_array[$i] . '\''; // add surrounding single quotes 
} 
$name_list = implode(',', $arr); 
$query = "SELECT * FROM table WHERE name IN ($name_list)"; 
// ... omit the followings 

eg在$ ARR包含 「彼得」, 「瑪麗」, 「肯」,查詢將是:

SELECT * FROM table WHERE name IN ('peter','mary','ken') 

旁註:但我不明白您的查詢。您只能從查詢中獲取名稱?你可以檢查行數,或者你甚至可以按名稱分組,例如:

SELECT name, COUNT(*) AS cnt FROM table GROUP BY name ORDER BY name 

得到你想要的。


UPDATE(再次):基於OP的評論,這裏是解決方案:

$flipped_array = array_flip($arr); // flip the array to make "name" as values" 
for($i = 0; $i < count($flipped_array); $i++) { 
    $flipped_array[$i] = '\'' . $flipped_array[$i] . '\''; // add surrounding single quotes 
} 
$name_list = implode(',', $arr); 
$query = "SELECT name, COUNT(*) AS cnt FROM table WHERE name IN ($name_list) GROUP BY name HAVING COUNT(*) > 0 ORDER BY name"; 
$result = mysqli_query($query) or die(mysqli_error()); 
if (mysqli_num_rows($result) > 0) { 
    while($row = mysqli_fetch_array($result)) { 
    echo $quan." ".$row['name']. ": " . $row['cnt'] . PHP_EOL; 
    } 
} 

上面的查詢將顯示出現在僅表名。不在表中的名字將不會顯示。現在完整的代碼(再次注意SQL注入)

+3

+1但也許提供一個示例,將結果分組,而不是每次迭代數組都執行SQL查詢? – webnoob 2013-04-30 07:29:03

+0

是&同意,將其添加。 – Raptor 2013-04-30 07:30:23

+0

我不明白。問題不在於它不循環結果。應該有0或1個結果。問題是,arr中的每個名稱都不會被打印。只打印arr中的姓氏(或者沒有,如果最後一個不在表格中)。 – user1535846 2013-04-30 07:36:22