2014-03-27 76 views
0

因此,我正在使用我的搜索引擎腳本,它運行良好。但我想添加功能來搜索同一列中的兩個選擇。例如,我希望搜索引擎爲用戶提供在安大略省和阿爾伯塔省獲得結果的能力。我的輸入表單允許用戶在同一字段中選中兩個框,但我的腳本僅搜索所選的第二個條件。PHP搜索功能....使用來自同一變量的兩個條件

這是搜索腳本。

<?php 
    require_once("models/config.php"); 
    define("NUMBER_PER_PAGE", 5); 

    function pagination($current_page_number, $total_records_found, $query_string = null) 
    { 
     $page = 1; 

     echo "Page: "; 

     for ($total_pages = ($total_records_found/NUMBER_PER_PAGE); $total_pages > 0; $total_pages--) 
     { 
      if ($page != $current_page_number) 
       echo "<a href=\"?page=$page" . (($query_string) ? "&$query_string" : "") . "\">"; 

      echo "$page "; 

      if ($page != $current_page_number) 
       echo "</a>"; 

      $page++; 
     } 
    } 

    $page = ($_GET['page']) ? $_GET['page'] : 1; 
    $start = ($page-1) * NUMBER_PER_PAGE; 

    $personid = ($_POST['personid']) ? $_POST['personid'] : $_GET['personid']; 
    $firstname = ($_POST['firstname']) ? $_POST['firstname'] : $_GET['firstname']; 
    $surname = ($_POST['surname']) ? $_POST['surname'] : $_GET['surname']; 
    $address = ($_POST['address']) ? $_POST['address'] : $_GET['address']; 
    $city = ($_POST['city']) ? $_POST['city'] : $_GET['city']; 
    $province =($_POST['province']) ? $_POST['province'] : $_GET['province']; 
    $postalcode = ($_POST['postalcode']) ? $_POST['postalcode'] : $_GET['postalcode']; 
    $phone = ($_POST['phone']) ? $_POST['phone'] : $_GET['phone']; 
    $email = ($_POST['email']) ? $_POST['email'] : $_GET['email']; 

    $sql = "SELECT * FROM persons WHERE 1=1"; 

    if ($personid) 
     $sql .= " AND personid='" . mysqli_real_escape_string($mysqli,$personid) . "'"; 

    if ($firstname) 
     $sql .= " AND firstname='" . mysqli_real_escape_string($mysqli,$firstname) . "'"; 

    if ($surname) 
     $sql .= " AND surname='" . mysqli_real_escape_string($mysqli,$surname) . "'"; 

    if ($address) 
     $sql .= " AND address='" . mysqli_real_escape_string($mysqli,$address) . "'"; 

    if ($city) 
     $sql .= " AND city='" . mysqli_real_escape_string($mysqli,$city) . "'"; 

    if ($province) 
     $sql .= " AND province='" . mysqli_real_escape_string($mysqli,$province) . "'"; 

    if ($postalcode) 
     $sql .= " AND postalcode='" . mysqli_real_escape_string($mysqli,$postalcode) . "'"; 

    if ($phone) 
     $sql .= " AND phone='" . mysqli_real_escape_string($mysqli,$phone) . "'"; 

    if ($email) 
     $sql .= " AND email='" . mysqli_real_escape_string($mysqli,$email) . "'"; 

    $total_records = mysqli_num_rows(mysqli_query($mysqli,$sql)); 

    $sql .= " ORDER BY surname"; 
    $sql .= " LIMIT $start, " . NUMBER_PER_PAGE; 


    pagination($page, $total_records, "personid=$personid&firstname=$firstname&surname=$surname&address=$address&city=$city&province=$province&postalcode=$postalcode&phone=phone&email=$email"); 


    $loop = mysqli_query($mysqli,$sql) 
     or die ('cannot run the query because: ' . mysqli_error($mysqli,i)); 

    echo "<table border='1' cellpadding='10'>"; 
      echo "<tr> <th>First Name</th> <th>Surname</th> <th>Email</th> <th></th> <th></th></tr>"; 

    while ($record = mysqli_fetch_assoc($loop)) { 
     echo "<tr>"; 
        echo '<td>' . $record['firstname'] . '</td>'; 
        echo '<td>' . $record['surname'] . '</td>'; 
        echo '<td>' . $record['email'] . '</td>'; 

        echo ("<td><a href=\"records.php?$record[personid]\">Edit</a></td>"); 

        echo '<td><a href="delete.php?id=' . $record['personid'] . '">Delete</a></td>'; 
        echo "</tr>"; 


    } 
    echo "</table>"; 

    echo "<center>" . number_format($total_records) . " search results found</center>"; 


    pagination($page, $total_records, "personid=$personid&firstname=$firstname&surname=$surname&address=$address&city=$city&province=$province&postalcode=$postalcode&phone=phone&email=$email"); 
    ?> 

如果你需要看看吧,這裏是我的腳本的一部分呼應出省作爲一個複選框列表(當然還有很多缺失的名單,但它只是給你一個想法)

<p><b>Province:</b> 
<? 
while ($row = mysqli_fetch_assoc($result)) { 
echo "<input type='checkbox' name='province' value=' {$row['province']} '> {$row['province']} "; 
    } 
    ?> </p><br /> 

關於如何使這項工作的任何想法?提前致謝。

+0

如果您使用的是MySQLi,請使用BIND VARIABLES! –

+1

您需要一個SQL語句,它會這樣說:WHERE city = Ontario或city = Alberta。如何從多個複選框中檢索值,請閱讀此處:http://stackoverflow.com/questions/4997252/get-post-from-multiple-checkboxes –

+0

爲您的html表單,您可以使用啓用多個選擇的選擇輸入,或者我認爲您需要爲省份的每個複選框使用不同的「名稱」,例如province_1 province_2 – dboals

回答

1

使複選框的數組:

name='province[]' 

implode然後在陣列並使用IN()構建體在查詢中。

WHERE province IN(?) 

如果您使用mysqli,請使用預準備語句mysqli_stmt_bind_param來構造查詢。我更喜歡PDO。

+0

即使沒有任何內容正在寫入表格,我仍然需要'mysqli_stmt_bind_param'嗎? – JLA

+0

@JLA:未寫入,但正在向數據庫發送語句。準備好的陳述是首選和安全的,儘管你可以像現在這樣做。 – AbraCadaver

+0

嗨AbraCadaver,我仍然有問題。我現在得到一個錯誤'不能運行查詢,因爲:你的SQL語法有錯誤;請檢查與您的MySQL服務器版本相對應的手冊,以便在'WHERE province IN('Alberta','Ontario')ORDER BY surname LIMIT 0,5'in line 1'附近使用正確的語法。問題可能是什麼? – JLA