php
  • mysql
  • sql
  • 2015-07-19 21 views 0 likes 
    0

    我有這個查詢,顯示一些待售建築物以及用戶可以選擇「plaats」(區域)和slaapkamers(數字的臥室)。它們存儲在變量中,並且此查詢有效:如果變量等於「全部」,則選擇列中的所有字段,否則只選擇等於變量的字段

    $p = $_POST['plaats']; 
    $s = $_POST['slaapkamers']; 
    
    $sSql = "select * from tblpand WHERE PandPostcodeGemeente='". mysql_real_escape_string($p) ."' AND PandSlaapkamers='". mysql_real_escape_string($s) ."'; 
    

    只要變量等於一個字段,它就會工作。例如,如果$ s等於3,則顯示所有帶3間臥室的建築物。但是,也可以選擇所有臥室(「全部」),與區域相同,如果應選擇所有區域,則$ p爲「全部」。我不知道如何將其添加到查詢中。也許是這樣的:

    ​​

    這只是一個理論的例子,我知道這是行不通的。有關於此的任何想法?謝謝你們。

    回答

    2

    試試這個:

    $p = $_POST['plaats']; 
    $s = $_POST['slaapkamers']; 
    
    $sSql = "select * from tblpand WHERE 1=1"; 
    if ($p !== 'all') { 
        $sSql .= " AND PandPostcodeGemeente='" . mysql_real_escape_string($p) . "'"; 
    } 
    if ($s !== 'all') { 
        $sSql .= "AND PandSlaapkamers='" . mysql_real_escape_string($s) . "'"; 
    } 
    
    +0

    我會嘗試一下,彙報儘快。 –

    +0

    完美地工作,謝謝!接受它作爲答案。 –

    2

    允許我推薦了不同的方法,使用此:

    $p = filter_input(INPUT_POST, 'plaats', FILTER_SANITIZE_STRING); 
    $s = filter_input(INPUT_POST, 'slaapkamers', FILTER_SANITIZE_STRING); 
    
    $query = 'select * from tblpand '; 
    
    if (strcasecmp($p, 'all') !== 0) { 
    
        $query .= " WHERE PandPostcodeGemeente='". $p . "'"; 
        $wherehasBeenSet = true; 
    } 
    
    if (strcasecmp($s, 'all') !== 0) { 
    
        if (isset($wherehasBeenSet)}) { 
         $query .= ' AND '; 
        } else { 
         $query .= ' WHERE '; 
        } 
        $query .= " PandSlaapkamers='" . $s . "'"; 
    } 
    
    +0

    有趣的方法。你爲什麼會建議這個與其他建議? –

    +1

    嗨@KevinVerhoeven,您用於轉義輸入參數的函數已被棄用。使用filter_input應該注意消毒您的輸入,當然,另一種方法是使用PDO並準備語句以避免sql注入(強烈推薦)。另外,我個人不喜歡在我的數據庫查詢中添加WHERE 1 = 1,這就是爲什麼我添加了一些額外的代碼行以避免這樣做。我個人認爲它使查詢更清晰,但這僅僅是我個人的看法。我正在編輯我的答案並刪除filter_var函數,因爲它們不是必需的。 – Edgar

    +0

    謝謝,我會研究filter_input。幾年前,我使用了PHP,幾周後又開始使用它。有些事情可能改變了。我也刪除了查詢中的Where 1 = 1。 –

    相關問題