douzhao5656 2015-04-02 19:56
浏览 58
已采纳

当php var为空时,SQL param对应于'*'?

I have some SQL functions, an HTML/JS form and a PHP script (which calls SQL functions with form parameters). The form just sends two parameters :

  • date
  • language

If date is empty, no problem, I can get the date of the day by PHP and pass it to my SQL request. But when $language is empty, I want to display results for all languages..

The php part :

$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);

My SQL function :

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);

}

Can I get all languages with this SQL function ? Or am I forced to create other functions for all cases ..?

Thanks.

  • 写回答

1条回答 默认 最新

  • dongtu1789 2015-04-03 01:43
    关注

    You can build your SQL statement to only include the WHERE portions for language and type if the corresponding vars are set:

    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);
    }
    

    EDIT

    Changed to named parameters instead of ?, as the index numbers would be different if you only passed two parameters instead of three.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题