2016-02-15 55 views
1

我有多個複選框形式,其中客戶選擇一個或多個項目顯示它們SQL SELECT元素匹配陣列和一排

我傳遞值到一個頁面的PHP在那裏與語句的選擇,我取的價格,從db中選擇的項目的圖像。

ID | Name | Price | Images | item 
1 | bob | 10 | link | a 
2 | bob | 5  | link | b 
3 | bob | 5  | link | c 
4 | bob | 5  | link | d 

我想顯示在一排像選擇項的結果:

bob a b 

下面的代碼不要讓我看到這個結果時,客戶選擇多了一個項目。

// $_POST['choices'] array 
$result = count($_POST['choices']); 

require("config.casa.php"); //file connection db 


try { 
    $dbh = new PDO("mysql:host=$DB_Server;dbname=$DB_DBName",$DB_Username,$DB_Password); 

    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // <== add this line 
    echo 'Connected to Database<br/>'; 

for($i=0; $i<$result; $i++){ 
     $po="SELECT name, item, price, images FROM my-tb WHERE item ='".$_POST['choices'][$i]."'"; 
     $rpo=$dbh->prepare($po); 
    $rpo->execute(); 
$pol = $rpo->fetch(PDO::FETCH_ASSOC); 
    echo "<ul class=\"tab\"><li class=\"col1\">"."name"."</li>"; 
    echo "<li class=\"col2\"><p class=\"two\"><h3>&euro; ".$pol['price']."</h3></p>"; 
     echo "<p class=\"lin\"><strong><span class=\"up\">".$pol['images']."</strong></p>"; 
     <li class=\"col3\">".$row["item"]."</li></ul> 
      } 
    $dbh = null; 
    } 
catch(PDOException $e) 
    { 
    echo $e->getMessage(); 
    } 

我也試過執行該語句fecth出週期的,但我得到的最後一個項目,而不是從可變$_POST['choices']的所有的人。

回答

1

你應該在這裏做的是使用IN CLAUSE。將$_POST[]轉換爲逗號分隔的字符串。

$choices = implode(', ', $_POST['choices']); 

SELECT name, item, price, images FROM `my-tb` WHERE item IN ($choices) 

將產生類似的查詢:讓你不循環在你$_POST

SELECT name, item, price, images FROM `my-tb` WHERE item IN (a,b,d) 

這也將使它和不必要執行多個查詢。

旁註

我不知道,如果你的實際的表名爲my-tb,但如果你在你的表名有hyphens必須使用backticks封裝字符串名稱。

+0

我在面板的phpmyadmin與「條款」測試查詢並顯示正確的結果和警報「此表格不包含唯一列」。 另外,當我嘗試執行頁面php時,echo語句只顯示一個項目而不是所有項目。 在我的問題早期我的gol是顯示從客戶選擇的所有項目。 也許我錯了代碼php或表的結構。 表的真實名稱是沒有連字符,謝謝你的注意 – user3332537

0

在這個查詢語句:

$po="SELECT name, item, price, images FROM my-tb WHERE item ='".$_POST['choices'][$i]."'"; 

可以使用item='item 1' or item='item 2' or .... 完整代碼創建語句如下:

$condition=""; 
$count=count($_POST['choices']); 
$i=0; 
foreach($_POST['choices'] as $value) { $i++; 
    if($i<$count) { 
     $condition.="item='".$value."' or "; 
    } else { 
     $condition.="item='".$value."'"; //Last element should not contain or at the end 
    } 
} 
$po="SELECT name, item, price, images FROM my-tb WHERE ".$condition; 
+0

但爲什麼?這正是'... IN'子句存在的原因。 – Ohgodwhy

+0

是的,只是獲得相同結果的另一種方式。但是一旦我堅持使用IN,因爲我的發佈數據包含特殊字符。或幫助我脫身。對於數字和字母數據,我同意IN始終是最好的。 –