尝试添加额外的语句来处理查询时,我收到来自 MariaDb 的错误

时间:2021-04-03 11:46:59

标签: php mariadb codeigniter-3 codeigniter-4

我有一张有很多记录的表。我需要检查重复项。 我有以下查询:

public function findduplicates(){
        $query =  $this->db->query(
            'SELECT book_id, auth_last , ebooks.ebook_title, storage_sys, ebook_path, AZ FROM ebooks
            INNER JOIN( SELECT ebook_title FROM ebooks  GROUP BY ebook_title HAVING COUNT(ebook_title) >1 ) temp ON ebooks.ebook_title = temp.ebook_title'
        );

        if($query->num_rows() > 0){
            return $query->result();
        }else{
            return FALSE;
        }
    }

查询在我看来产生以下结果,这就是我要寻找的:

Array
(
    [0] => stdClass Object
        (
            [book_id] => 31
            [auth_last] => Aardenburg
            [ebook_title] => 06 Bas Banning en de Tour de France.epub
            [storage_sys] => 1
            [ebook_path] => Aardenburg, A van - 06 Bas Banning en de Tour de France.epub
            [AZ] => A
        )

    [1] => stdClass Object
        (
            [book_id] => 46
            [auth_last] => Van
            [ebook_title] => 06 Bas Banning en de Tour de France.epub
            [storage_sys] => 1
            [ebook_path] => Aardenburg A van - 06 Bas Banning en de Tour de France.epub
            [AZ] => B
        )

)

因为表非常大,我想限制我的选择,向我的方法添加两个参数:

public function findduplicates($sys_code,$folder_name){
        $query =  $this->db->query(
            'SELECT book_id, auth_last , ebooks.ebook_title, storage_sys, ebook_path, AZ FROM ebooks WHERE storage_sys = $sys_code AND AZ = $folder_name
            INNER JOIN( SELECT ebook_title FROM ebooks  GROUP BY ebook_title HAVING COUNT(ebook_title) >1 ) temp ON ebooks.ebook_title = temp.ebook_title'
        );
        if($query->num_rows() > 0){
            return $query->result();
        }else{
            return FALSE;
        }
    }

这给了我来自 MariaDb near 'INNER JOIN...' 的错误 我试过:

WHERE storage_sys = '.$sys_code.' AND AZ = '.$folder_name.'

具有相同的结果和:

WHERE (storage_sys = `'.$sys_code.'` AND AZ = `'.$folder_name.'`

也没有运气。

2 个答案:

答案 0 :(得分:1)

JOIN 位于任何 WHERE 子句之前。 PHP 变量不应该直接放在 SQL 中,它们需要单独绑定。用占位符 ? 替换变量,然后使用 bind_param() 绑定它们。

如果您使用的是 CodeIgniter,那么它应该是这样的:

public function findduplicates():array {
    $sql = 'SELECT book_id, auth_last, ebooks.ebook_title, storage_sys, ebook_path, AZ 
        FROM ebooks 
        INNER JOIN( SELECT ebook_title FROM ebooks  GROUP BY ebook_title HAVING COUNT(ebook_title) >1 ) temp ON ebooks.ebook_title = temp.ebook_title
        WHERE storage_sys = ? AND AZ = ?';
    $db->query($sql, [$sys_code, $folder_name]);
    return $query->result();
}

答案 1 :(得分:0)

JOINFROM 的一部分而不是 WHERE 的一部分:

SELECT book_id, auth_last , ebooks.ebook_title, storage_sys, ebook_path, AZ FROM ebooks
INNER JOIN( SELECT ebook_title FROM ebooks  GROUP BY ebook_title HAVING COUNT(ebook_title) >1 ) temp ON ebooks.ebook_title = temp.ebook_title'
 WHERE storage_sys = '$sys_code' AND AZ ='$folder_name'
            

你也会遗漏字符串周围的单引号。

并且你应该了解准备好的语句以防止 SQL 注入