与'*';当php-var为空时


SQL param corresponding to '*' when php var empty?

我有一些SQL函数、一个HTML/JS表单和一个PHP脚本(用表单参数调用SQL函数)。表单只发送两个参数:

  • 日期
  • 语言

如果日期为空,没问题,我可以通过PHP获取当天的日期,并将其传递给我的SQL请求。但是当$language为空时,我希望显示所有语言的结果。。

php部分:

$date = isset($_GET['date']) ? $_GET['date'] : '';
if (empty($date)) {
    $date = date("Y-m-d");
}
$language = isset($_GET['language']) ? $_GET['language'] : '';
if (empty($language)) {
    $language = '%';
}
$events = retrieve_events_by_type ($DB, $query, $language, $date);

我的SQL函数:

function retrieve_events_by_type ($DB, $type, $language, $date) {
    $req = $DB->prepare("SELECT organizer, eventname, eventplace, language, eventdate, eventhour, eventminutes FROM events where eventtype = ? AND language like ? AND eventdate = ?");
    $req -> bindParam(1, $type, PDO::PARAM_STR);
    $req -> bindParam(2, $language, PDO::PARAM_STR);
    $req -> bindParam(3, $date, PDO::PARAM_STR);
    $req -> execute();
    $events = $req->fetchAll(PDO::FETCH_ASSOC);
    $req->closeCursor();
    return ($events);

}

我可以用这个SQL函数获取所有语言吗?还是我被迫为所有情况创建其他函数。。?

谢谢。

如果设置了相应的变量,则可以构建SQL语句以仅包括语言和类型的WHERE部分:

function retrieve_events_by_type ($DB, $type, $language, $date) {
    $sql = "SELECT organizer, eventname, eventplace, language, eventdate, eventhour, eventminutes FROM events WHERE eventdate = :date ";
    $sql .= empty($language) ? "" : " AND language LIKE :language ";
    $sql .= empty($type) ? "" : " AND eventtype LIKE :type ";
    $req = $DB->prepare($sql);
    $req -> bindParam(':date', $date, PDO::PARAM_STR);
    if (!empty($language)
        $req -> bindParam(':language', $language, PDO::PARAM_STR);
    if (!empty($type)
        $req -> bindParam(':type', $type, PDO::PARAM_STR);
    $req -> execute();
    $events = $req->fetchAll(PDO::FETCH_ASSOC);
    $req->closeCursor();
    return ($events);
}

编辑

已更改为命名参数,而不是?,因为如果只传递两个参数而不是三个参数,则索引号会有所不同。