簡體   English   中英

PDO使用“ where”子句從表中選擇所有數據

[英]PDO select all data from table with “where” clause

我想將$ variable參數傳遞給php函數,並根據此參數從表中獲取數據。 此參數可以為null,這意味着db request應該從表中獲取所有數據,也可以為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;

如果我理解您的“問題”正確,則代碼可以是:

$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自動檢測數據類型)

這里有2種可能的情況:

  1. :user為NULL-在SQL中,第一個條件匹配,返回所有行;
  2. :user是整數-在SQL中,第二個條件匹配,返回一行(假設id是唯一列)。

該語句不返回任何行,因為它意義不大。

也許這是思考這種情況的更好方法

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

對於准備好的語句,您始終必須以“文字”方式生成它們,因此不能避免您使用RiggsFolly描述的過程。 如果需要“最佳”解決方案,則可以通過其他方式詢問變量是否為null。 例如:如該線程所解釋。

希望對您有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM