2015-04-04 69 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