2015-04-04 56 views
0

PDO功能我在HTML複選框一些選擇,我需要通過一個數組來傳遞這些選擇:HTML表單,並與陣列

<div> 
<input type="checkbox" name="language[]" id="anglais" value="anglais" /> Anglais 
<input type="checkbox" name="language[]" id="allemand" value="allemand" /> Allemand 
<input type="checkbox" name="language[]" id="espagnol" value="espagnol" /> Espagnol 
<input type="checkbox" name="language[]" id="francais" value="francais" /> Francais 
<input type="checkbox" name="language[]" id="italien" value="italien" /> Italien 
<input type="checkbox" name="language[]" id="russe" value="russe" /> Russe 
<input type="checkbox" name="language[]" id="chinois" value="chinois" /> Chinois 

<br/> 
<input type="submit" value="Actualiser !"> 
</div> 

然後,該數組被髮送到以下PDO查詢:

function retrieve_events_by_type ($DB, $type, $language, $date) { 
     $sql = "SELECT organizer, eventname, eventplace, language, eventdate, eventhour, eventminutes FROM events where eventtype = :type"; 

     if (!empty($language)) { 
      $place_holders = implode(',', array_fill(0, count($language), '?')); 
      $sql .= " AND language IN ($place_holders)"; 
    } 

     $sql .= empty($date) ? "" : " AND eventdate = :date "; 

     $req = $DB->prepare($sql); 
     $req -> bindParam(':type', $type, PDO::PARAM_STR); 
     if (!empty($language)) { 

      $req -> bindParam(':language', $language, PDO::PARAM_STR); 
    } 

    if (!empty($date)) { 
      $req -> bindParam(':date', $date, PDO::PARAM_STR); 
    } 

    $req -> execute(); 
    $events = $req->fetchAll(PDO::FETCH_ASSOC); 
    $req->closeCursor(); 
    return ($events); 

}

我試圖通過數組PDO以PDO ::執行或PDO :: PARAM_STR,但它不工作..

是否可以將命名參數和佔位符傳遞給PDO?
有沒有辦法在'IN'sql子句中傳遞多個字符串?

+0

看到http://stackoverflow.com/questions/920353/can-i-bind-an-array-to-an-in-condition – 2015-04-04 17:28:17

回答

1

的一個問題是,你要插入佔位符?到SQL查詢,但那麼你結合給定參數:language。 PDO如何在兩者之間建立聯繫? 命名參數當你有一個固定的已知變量列表時工作,但是當你有一個數組數組時,佔位符更簡單。

在這裏,使用PHP PDO佔位符?爲所有變量,而不是命名參數,然後將所有值的數組傳遞給PDO execute方法。

function retrieve_events_by_type ($DB, $type, $language, $date) { 
    $sql = 'SELECT organizer, eventname, eventplace, language, eventdate, eventhour, eventminutes FROM events where eventtype = ?'; 
    $exec_array = array($type); 

    if (!empty($language)) { 
     //$place_holders = str_repeat('?,', count($language) - 1) . '?'; // alternate 
     $place_holders = implode(',', array_fill(0, count($language), '?')); 
     $sql .= " AND language IN ($place_holders)"; 
     $exec_array = array_merge($exec_array, $language); 
    } 

    if (!empty($date)) { 
     $sql .= ' AND eventdate = ?'; 
     $exec_array = array_merge($exec_array, array($date)); 
    } 

    $req = $DB->prepare($sql); 
    $req -> execute($exec_array); 

    $events = $req->fetchAll(PDO::FETCH_ASSOC); 
    $req->closeCursor(); 
    return ($events); 
} 
+0

謝謝,我有一些問題得到那個工作。我是否被迫將$ date和$ type更改爲一個數組,將它合併等等......?即使只有$語言真的是一個數組?而且我不明白該行的結尾。 '?');'爲什麼最後一個佔位符?我的錯誤涉及'$ place_holders = str_repeat'這行:不支持的操作數類型。 (我已經試圖改變括號。) – Isador 2015-04-04 22:42:31

+0

關於'str_repeat'的使用,你的工作正常。我只是認爲'str_repeat'方法更簡單。我將'str_repeat'重新命名並放回。* FYI *,額外的'?'僅適用於每個字符之間的逗號,而不是每個字符之後的逗號。注意還有一個'count($ language) - 1'。如果我用'str_repeat'完整計數而沒有額外的'?',那麼最終會有一個額外的逗號:'?,?,?,?,?,'。 – bloodyKnuckles 2015-04-04 22:45:55

+0

我把所有的值放在數組中的原因是我可以將它們全部一次性傳遞給'execute'方法。你*可以*也可以使用'bindParam'並單獨傳遞值作爲標量(而不是數組)。但是接下來你需要遍歷'$ language'數組來將每個數組傳遞給一個'bindParam'。我認爲將所有的標量推入一個數組,將它與'$ language'數組合並,並將這個數組傳遞給'execute'會更簡單。 – bloodyKnuckles 2015-04-04 22:53:31