【问题标题】:PDO select all data from table with "where" clausePDO 使用“where”子句从表中选择所有数据
【发布时间】:2015-02-10 18:28:27
【问题描述】:

我想将 $variable 参数传递给 php 函数并根据此参数从表中获取数据。该参数可以为null,表示db请求应该从表中获取所有数据,也可以是int值。这是我尝试的代码:

$stmt = $this->_db->prepare("SELECT * FROM ki_cities 
                              WHERE id IS NULL OR id = :user");
$stmt->bindValue(':user',$variable,PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

此查询不返回任何行。

对于那些对我的问题感到困惑的人来说,这是一个隐含的问题。 我要sql查询:

 SELECT * FROM ki_cities WHERE id = *

此查询应与以下内容相同:

 SELECT * FROM ki_cities

我想我的问题很清楚。

========================================

如果有人感兴趣,这是我扭曲的“解决方案”:

$que = "SELECT * FROM ";
            $que = $que . " ki_students where season=4";
            if($type!=null) { $que = $que . " and type =".$type; }
            if($city!=null) { $que = $que . " and city =".$city; }
            $stmt = $this->_db->prepare($que);
            $stmt->execute();
             $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
             return $result;

【问题讨论】:

  • 你说“我想我的问题很清楚”。但你没有问任何问题
  • 好吧,你说...'我想将 $variable 参数传递给 php 函数'。那么为什么不创建一个并给它一个参数呢?

标签: php mysql pdo


【解决方案1】:

如果我理解你的“问题”正确,代码可以是:

$stmt = $this->_db->prepare('SELECT * FROM `ki_cities` WHERE ((:user IS NULL) OR (`id` = :user));');
$stmt->bindValue(':user', $variable, is_null($variable) ? PDO::PARAM_NULL : PDO::PARAM_INT);

(或者您可以省略参数 #3 到 bindValue() 并让 PDO 自动检测数据类型)

这里有两种可能的情况:

  1. :user 为 NULL - 在 SQL 中,第一个条件匹配,返回所有行;
  2. :user 是整数 - 在 SQL 中,第二个条件匹配,返回一行(前提是 id 是唯一列)。

【讨论】:

    【解决方案2】:

    该语句没有返回任何行,因为它没有什么意义。

    也许这是考虑这种情况的更好方式

    if ( empty($variable) ) {
        $stmt = $this->_db->prepare("SELECT * FROM ki_cities");
    } else {
        $stmt = $this->_db->prepare("SELECT * FROM ki_cities WHERE id = :user");
        $stmt->bindValue(':user',$variable,PDO::PARAM_INT);
    }
    
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    

    【讨论】:

    • 是的,但我将在此查询中有许多“where”子句,因此参数将为空或具有任何值的许多组合。在这种情况下,您的方法应该不是最优的。
    • 在这种情况下,您没有正确设计系统,或者不了解如何正确编写代码。
    • 我想也许有任何直接的方法可以做到这一点。如果没有直接的方法,我有一个想法如何处理。
    • 很难知道如何具有建设性,因为我们只知道您告诉我们的内容,在这种情况下并不多。
    【解决方案3】:

    对于准备好的语句,您始终必须以“字面”方式生成它们,这样就不会让您避免 RiggsFolly 描述的过程。如果您想要一个“最佳”解决方案,您可以通过其他方式询问变量是否为空。例如:正如这个线程所解释的那样。

    Thread

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 2017-01-02
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多