html表单和带有数组的PDO函数


html form and PDO function with array

我在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::execute或PDO::PARAM_STR将数组传递给PDO,但它不起作用。。

是否可以将命名参数AND占位符传递给PDO
有没有办法在'in'sql子句中传递多个字符串?

一个问题是,在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);
}