php - 即使用户没有填写表单中的所有条件,也会从 mySQL 返回结果

标签 php mysql pdo

以下代码需要使用用户提供的 3 个变量。默认情况下,所有这些变量都等于 0。

  1. 时间(文本框)
  2. 城市(下拉列表)
  3. 类型(下拉列表)

例如,如果时间和城市由用户给出,但让类型为零,它将不会返回任何结果。 我的问题是什么是修改我现有代码的有效且高效的方法,以便如果用户选择不选择时间、城市或类型或这些的任意组合,将会返回结果?

例如,如果时间 21:00 加上城市 数字3,它将显示所有满足2 个条件的类型被列出。

$question= 'SELECT * FROM events WHERE ABS(TIMESTAMPDIFF( HOUR , `time`, :time )) < 2 AND city=:city AND type=:type';
$query = $db->prepare($question);
$query->bindValue(":time", $time, PDO::PARAM_INT);
$query->bindValue(":city", $city, PDO::PARAM_INT);
$query->bindValue(":type", $type, PDO::PARAM_INT);
$query->execute();

最佳答案

<?php
$question= 'SELECT * FROM events WHERE ';

$hasTime = false;
if(!empty($time)) { // @note better validation here
    $hasTime = true;
    $question .= 'ABS(TIMESTAMPDIFF( HOUR , `time`, :time )) < 2 ';
}

$hasCity = false;
if(!empty($city)) { // @note better validation here
    $hasCity = true;
    $question .= 'AND city=:city ';
}

$hasType = false;
if(!empty($type)) { // @note better validation here
    $hasType = true;
    $question .= 'AND type=:type';
}

$query = $db->prepare($question);

if($hasTime)
    $query->bindValue(":time", $time, PDO::PARAM_INT);
if($hasCity)
    $query->bindValue(":city", $city, PDO::PARAM_INT);
if($hasType)
    $query->bindValue(":type", $type, PDO::PARAM_INT);

$query->execute();
$results = $query->fetchAll();

if(empty($results))
    echo 'no results';
else
    // $results is an array of arrays

关于php - 即使用户没有填写表单中的所有条件,也会从 mySQL 返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11583178/

相关文章:

php - 使用 Laravel 5.8/Cashier/Stripe 设置订阅时遇到问题

mysql - 是否可以在其创建语句之前定义 MySQL 表注释?

php - 多次更新数据库中的同一行

mysql - 使用嵌套查询对行进行排序(查询其他查询的结果)

php - PDO BindParam 和 BindValue 不起作用

php - 带百分比和限制的 PDO 准备语句

php - 如何检查MySQL中是否存在某行? (即检查 MySQL 中是否存在用户名或电子邮件)

php - 如何在 Twig 模板文件中定义全局变量?

php - 使用 Ajax 的 Json 编码 JavaScript 会抛出错误消息

php - 如何使用 javascript 中的 onclick 事件链接到另一个 php 页面?