2017-04-12 29 views
1

我是PHP編碼新手。我有不同的偏好讓用戶從我的html頁面選擇。我想檢索用戶選擇的所有複選框,並顯示其中包含所有這些首選項的酒店名稱。例如,如果用戶選擇「屋頂」,「海邊」和「游泳池」複選框,則mytrip.db數據庫中相應列中放置它們的賓館必須一次全部檢索並且得到顯示。我的代碼只需要一個複選框值,並僅顯示酒店名稱。我想顯示包含所有首選項的酒店。 我的代碼如下:如何從PHP中一次選擇多個複選框的基礎上從SQLite 3數據庫檢索值?

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<title>PHP: Get Values of Multiple Checked Checkboxes</title> 
<link rel="stylesheet" href="css/php_checkbox.css" /> 
</head> 
<body> 
<div class="container"> 
<div class="main"> 
<h2>PHP: Get Values of Multiple Checked Checkboxes</h2> 
         <select id="mySelect" name="list"> 
         <option selected>Select a place</option> 
         <option value="1">Lahore</option> 
         <option value="2">Dubai</option> 
         <option value="3">New York</option> 
         <option value="4">Canberra</option> 
         <option value="5">London</option> 
         </select> 
<form action="php_checkbox.php" method="post"> 
<label class="heading">Select Your Preferences:</label> 
<input type="checkbox" name="check_list[]" value="Swimming pool"><label>Swimming pool</label> 
<input type="checkbox" name="check_list[]" value="Roof top"><label>Roof top</label> 
<input type="checkbox" name="check_list[]" value="Sea side"><label>Sea side</label> 



<input type="submit" name="submit" Value="Submit"/> 

</html> 
<?php include 'checkbox_value.php';?> 
</form> 
</div> 
</div> 
</body> 
</html> 

checkbox_value.php代碼如下:

<?php 
class MyDB extends SQLite3 
    { 
     function __construct() 
     { 
     $this->open('mytrip.db'); 
     } 
    } 
    $db = new MyDB(); 
    if(!$db){ 
     echo $db->lastErrorMsg(); 
    } else { 

    } 
if(isset($_POST['submit'])){ 
if(!empty($_POST['check_list'])) { 
// Counting number of checked checkboxes. 
$checked_count = count($_POST['check_list']); 
echo "You have selected following ".$checked_count." option(s): <br/>"; 
$prefarray=array(); 
$i=0; 
// Loop to store and display values of individual checked checkbox. 
foreach($_POST['check_list'] as $selected) { 
$prefarray[$i]= $selected; 

echo "<p>".$prefarray[$i] ."</p>"; 
echo "<p>".$selected ."</p>"; 
$i++; 
} 
echo "<p>".$i ."</p>"; 
$sql =<<<EOF 

     SELECT hotel_name from Dubai WHERE $prefarray[i]==1 AND $prefarray[i-1]==1 ; 
EOF; 

    $ret = $db->query($sql); 
    while($row = $ret->fetchArray(SQLITE3_ASSOC)){ 
     echo "<p> <br /></p>\n"; 
     echo "\n". $row['hotel_name'] . "\n"; 
    } 





    $db->close(); 
echo "<br/><b>Note :</b> <span>Similarily, You Can Also Perform CRUD Operations using These Selected Values.</span>"; 
} 
else{ 
echo "<b>Please Select Atleast One Option.</b>"; 
} 
} 
?> 

這段代碼的問題是,它僅顯示一個複選框值,如果我使用查詢

SELECT hotel_name FROM Dubai WHERE $selected==1 

我試着保存通過製作數組「prefarray」選中的複選框值。但是當我執行我在checkbox_value.php代碼中發佈的查詢時,它會給出錯誤「Prefarray中的未定義偏移3」。我希望數據庫查詢只具有用戶選擇的複選框值。例如,如果用戶選擇2出三個複選框的然後我的查詢應該看起來像

SELECT hotel_name FROM Dubai WHERE $checkbox==1 AND $checkbox2==1; 

任何幫助,以實現二者的這些任務可以理解的!

回答

1

我已修復並重構(無法阻止自己)您的代碼。

我已將列名更改爲正確的名稱。有一些冗餘的代碼沒有做任何事情,所以我擺脫了它。您要查找的主要內容是連接foreach循環中的每個選定列。我還在檢查硬編碼的選定值$hotelOptions以防止sql注入。

這裏是我的了:

checkbox_value.php:

<?php 
class MyDB extends SQLite3 
{ 
    function __construct() 
    { 
     $this->open('mytrip.db'); 
    } 
} 
$db = new MyDB(); 
if(!$db){ 
    echo $db->lastErrorMsg(); 
} else { 

} 

$hotelOptions = array('swimming_pool', 'roof_top', 'sea_side'); 

if (isset($_POST['submit'])) { 
    if (!empty($_POST['check_list']) && is_array($_POST['check_list'])) { 
     // Counting number of checked checkboxes. 
     $checked_count = count($_POST['check_list']); 
     echo "You have selected following ".$checked_count." option(s): <br/>"; 
     // Loop to store and display values of individual checked checkbox. 
     $where = ''; 
     foreach($_POST['check_list'] as $selected) { 
      echo "<p>".$selected ."</p>"; 
      if (array_search($selected, $hotelOptions) !== false) { 
       $where .= " AND {$selected} = 1"; 
      } 
     } 
     $where = substr($where, 5, strlen($where)); 

     $sql = "SELECT hotel_name FROM Dubai WHERE {$where};"; 

     $ret = $db->query($sql); 
     while($row = $ret->fetchArray(SQLITE3_ASSOC)){ 
      echo "<p> <br /></p>\n"; 
      echo "\n". $row['hotel_name'] . "\n"; 
     } 
     $db->close(); 
     echo "<br/><b>Note :</b> <span>Similarily, You Can Also Perform CRUD Operations using These Selected Values.</span>"; 
    } else { 
     echo "<b>Please Select Atleast One Option.</b>"; 
    } 
} 

HTML佈局:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> 
    <title>PHP: Get Values of Multiple Checked Checkboxes</title> 
    <link rel="stylesheet" href="css/php_checkbox.css"/> 
</head> 
<body> 
<div class="container"> 
    <div class="main"> 
     <form action="checkbox_value.php" method="post"> 
      <h2>PHP: Get Values of Multiple Checked Checkboxes</h2> 
      <select id="mySelect" name="list"> 
       <option selected>Select a place</option> 
       <option value="1">Lahore</option> 
       <option value="2">Dubai</option> 
       <option value="3">New York</option> 
       <option value="4">Canberra</option> 
       <option value="5">London</option> 
      </select> 
      <p class="heading">Select Your Preferences:</p> 

      <input type="checkbox" name="check_list[]" value="swimming_pool" id="checkbox_1"> 
      <label for="checkbox_1">Swimming pool</label> 

      <input type="checkbox" name="check_list[]" value="roof_top" id="checkbox_2"> 
      <label for="checkbox_2">Roof top</label> 

      <input type="checkbox" name="check_list[]" value="sea_side" id="checkbox_3"> 
      <label for="checkbox_3">Sea side</label> 

      <div> 
       <input type="submit" name="submit" Value="Submit"/> 
      </div> 
      <?php include 'checkbox_value.php';?> 
     </form> 
    </div> 
</div> 
</body> 
</html> 
+0

運行代碼我得到「警告後:SQLite3的: :query():無法編寫語句:1,在"附近; ":語法e第35行checkbox_value.php中的錯誤「。並且在fetchArray()函數中。請指導我如何實現它? – MinjaNinja

+0

嘗試'$ sql =「SELECT hotel_name FROM Dubai WHERE」。$ where where。「;」;' – xReprisal

+0

仍然收到相同的警告和錯誤。 – MinjaNinja

相關問題