PDO使用“where”子句从表中选择所有数据

时间:2015-02-10 18:28:27

标签: php mysql pdo

我想将$ 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;

3 个答案:

答案 0 :(得分: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是唯一列)。

答案 1 :(得分:0)

该语句不返回任何行,因为它没有多大意义。

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

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

答案 2 :(得分:0)

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

Thread

希望它可以帮到你