簡體   English   中英

在WHERE子句中編寫兩個條件會在PDO查詢中提供錯誤的輸出

[英]Writing two conditions in WHERE clause gives incorrect output in PDO query

我在一個PDO類中有一個函數,當我在WHERE子句中編寫兩個條件時,它將執行錯誤的查詢。

我嘗試在數組中編寫WHERE,但是它給了我一個未知的列錯誤,因此我以字符串格式編寫了條件。 如果編寫單個條件,查詢將完美工作,但是編寫多個條件,則會產生問題。

我的函數中包含以下代碼:

public function getNewsByDate($date, $lastdate){

    $args = array(
        'fields' => array(
                    'news.id', 
                    'news.title',                       
                    'news.summary',
                    'news.story', 
                    'news.image',                       
                    'news.added_by',
                    'news.status',
                    'news.added_date',                      
                    'news.news_category',
                    '(SELECT users.full_name FROM users WHERE id = news.added_by) as author',

                ),

        'where' => (' date BETWEEN "'.$date.'" AND "'.$lastdate.'"') AND (' archieveCategory = "magazine" '),

    );

    return $this->select($args, true);

}

當我調試上面的代碼時,我得到如下所示的sql:

SELECT news.id, news.title, news.summary, news.story, news.image, 
         news.added_by, news.status, news.added_date, news.news_category,
         (SELECT users.full_name FROM users WHERE id = news.added_by) as author 
   FROM news 
   WHERE 1 
   ORDER BY news.id DESC

而且,我的選擇查詢中包含以下代碼:

final protected function select($args = array(), $is_die = false){
            try {

        $this->sql = "SELECT ";
        if (isset($args['fields'])) {
            if (is_array($args['fields'])) {
                $this->sql .= implode(', ', $args['fields']);
            } else {
                $this->sql .= $args['fields'];
            }
        } else {
            $this->sql .= " * ";
        }
        $this->sql .= " FROM ";
        if (!isset($this->table) || empty($this->table)) {
            throw new Exception("Table not set");
        }
        $this->sql .= $this->table;

        /*Join Query*/
        if (isset($args['join']) && !empty($args['join'])) {
            $this->sql .= " ".$args['join'];
        }
        /*Join Query*/

        if (isset($args['where']) && !empty($args['where'])) {
            if (is_array($args['where'])) {
                $temp = array();
                foreach ($args['where'] as $column_name => $data) {
                    if (!is_array($data)) {
                        $data = array(
                            'value'     => $data,
                            'operator'  => '=',
                        );
                    }
                    $str = $column_name.' '.$data['operator'].' :'.str_replace('.', '_', $column_name);
                    $temp[] = $str;
                }
                $this->sql .= " WHERE ".implode(' AND ', $temp);
            } else {
                $this->sql .= " WHERE ".$args['where'];
            }
        }

        /*Group*/
        if (isset($args['group_by']) && !empty($args['group_by'])) {
            $this->sql .= " GROUP BY ".$args['group_by'];
        }
        /*Group*/

        /*Order*/
        if (isset($args['order_by']) && !empty($args['order_by'])) {
            $this->sql .= " ORDER BY ".$args['order_by'];
        } else {
            $this->sql .= " ORDER BY ".$this->table.".id DESC";
        }
        /*Order*/

        /*Limit*/
        if (isset($args['limit']) && !empty($args['limit'])) {
            if (is_array($args['limit'])) {
                $this->sql .= " LIMIT ".$args['limit'][0].",".$args['limit'][1];
            } else {
                $this->sql .= " LIMIT ".$args['limit'];
            }
        }
        /*Limit*/
        $this->stmt = $this->conn->prepare($this->sql);
        if (is_array($args['where']) || is_object($args['where'])){

            foreach ($args['where'] as $column_name => $data) {
            $value = is_array($data) ? $data['value'] : $data; //check if passed where statement was an array, fetch value if so
            if (is_int($value)) {
                $param = PDO::PARAM_INT;
            }elseif (is_bool($value)) {
                $param = PDO::PARAM_BOOL;
            }elseif (is_null($value)) {
                $param = PDO::PARAM_NULL;
            }else {
                $param = PDO::PARAM_STR;
            }
            if ($param) {
                $this->stmt->bindValue(":".str_replace('.', '_', $column_name), $value, $param);
            }
        }

        }

        if ($is_die) {

            echo $this->sql;

        }

        $this->stmt->execute();
        $data = $this->stmt->fetchAll(PDO::FETCH_OBJ);
        return $data;
        } catch (PDOException $e) {

                error_log(
                    date('Y-m-d h:i:s A').", Select Query: ".$e->getMessage()."\r\n"
                    , 3, ERROR_PATH.'/error.log');
                return false;
            } catch (Exception $e) {
                error_log(
                    date('Y-m-d h:i:s A').", General: ".$e->getMessage()."\r\n"
                    , 3, ERROR_PATH.'/error.log');
                return false;
            }
    }

我的預期結果將是這樣的:

SELECT news.id, news.title, news.summary, news.story, news.image, 
        news.added_by, news.status, news.added_date, news.news_category,
        (SELECT users.full_name FROM users WHERE id = news.added_by) as author
    FROM news WHERE date BETWEEN "2019-03-01" AND "2019-03-31" AND archeiveCategory = "magazine" 
    ORDER BY news.id DESC

在數組的where元素中,引號應為...

    'where' => '( date BETWEEN "'.$date.'" AND "'.$lastdate.'") AND ( archieveCategory = "magazine" )',

在您的版本中

    'where' => (' date BETWEEN "'.$date.'" AND "'.$lastdate.'"') AND (' archieveCategory = "magazine" '),

您會看到引號在開盤后(和收盤前)開始,(我認為)您在邏輯上等效於

    'where' => ('some string') AND ('another string'),

這是輸出中1來源。

暫無
暫無

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

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