在 yii2 中运行原始 SQL 时获取 SQL 查询语法错误或访问冲突

山姆

我正在尝试创建一个搜索功能,以便能够搜索产品并按相关性过滤结果,但在查询后出现语法错误。下面是我也得到的错误

 sql error
    SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'mens', 'winter', 'jacket'%',6,0) + if (title LIKE '%'mens'%',5,0) + if (title LI' at line 5
The SQL being executed was: SELECT p.product_id,p.title,p.price,p.unit_sold,
p.profile_img,p.store_name,p.item_number,
(
(-- Title score
if (title LIKE '%'mens', 'winter', 'jacket'%',6,0) + if (title LIKE '%'mens'%',5,0) + if (title LIKE '%'winter'%',5,0) + if (title LIKE '%'jacket'%',5,0)
)+
(-- description
if (description LIKE '%'mens', 'winter', 'jacket'%',5,0) + if (description LIKE '%'mens'%',4,0) + if (description LIKE '%'winter'%',4,0) + if (description LIKE '%'jacket'%',4,0)
)

) as relevance
FROM products p
WHERE p.is_active = '1'
HAVING relevance > 0
ORDER BY relevance DESC,p.unit_sold DESC
LIMIT 10

和搜索功能

function search($q){
            if (mb_strlen(trim($q))===0){
                // no need for empty search
                return false; 
            }
            $query = $this->limitChars(trim($q));

            // Weighing scores
            $scoreFullTitle = 6;
            $scoreTitleKeyword = 5;
            $scoreFullDescription = 5;
            $scoreDescriptionKeyword = 4;

            $keywords = $this->filterSearchKeys($query);
            $escQuery = $this->escape($keywords); 
            $titleSQL = array();
            $descSQL = array();

            /** Matching full occurences **/
            if (count($keywords) > 1){
                $titleSQL[] = "if (title LIKE '%".$escQuery."%',{$scoreFullTitle},0)";
                $descSQL[] = "if (description LIKE '%".$escQuery."%',{$scoreFullDescription},0)";

            /** Matching Keywords **/
            foreach($keywords as $key){
                $titleSQL[] = "if (title LIKE '%".Yii::$app->db->quoteValue($key)."%',{$scoreTitleKeyword},0)";
                $descSQL[] = "if (description LIKE '%".Yii::$app->db->quoteValue($key)."%',{$scoreDescriptionKeyword},0)";
            }

            //add 0 is query string is empty to avoid error
            if (empty($titleSQL)){
                $titleSQL[] = 0;
            }
            if (empty($descSQL)){
                $descSQL[] = 0;
            }
            $sql = "SELECT p.product_id,p.title,p.price,p.unit_sold,
                    p.profile_img,p.store_name,p.item_number,
                    (
                        (-- Title score
                        ".implode(" + ", $titleSQL)."
                        )+
                        (-- description
                        ".implode(" + ", $descSQL)." 
                        )

                    ) as relevance
                    FROM products p
                    WHERE p.is_active = '1'
                    HAVING relevance > 0
                    ORDER BY relevance DESC,p.unit_sold DESC
                    LIMIT 10";
            $results = Yii::$app->db->createCommand($sql)->queryAll();
            if (!$results){
                return false;
            }
            return $results;
        }

我还使用 escape() 方法来转义其他查询字符串以避免 sql 注入,但我不太相信这是最佳实践,因为转义方法所做的是在字符串周围添加单引号,而后者甚至不会返回表中的任何匹配项,我也尝试使用 mysqli_escape_string() 但也无法使其工作,所以我想知道 Yii2 中转义查询字符串并避免 sql 注入攻击的最佳实践是什么。

function escape($values)
        {
                $values = (array)$values;
                $escaped = array();
                foreach($values as $value) {
                        if(!is_scalar($value)) {
                                throw new CException('One of the values passed to values() is not a scalar.');
                        }
                        $escaped[] = Yii::$app->db->quoteValue($value);
                }
                return implode(', ', $escaped);
        }
抢夺006

您应该转义 for 的整个表达式LIKE,包括%通配符:

$value = Yii::$app->db->quoteValue('%' . implode(', ', (array) $keywords) . '%');
$titleSQL[] = "if (title LIKE $value,$scoreFullTitle,0)";

这将产生类似的东西:

if (title LIKE '%mens, winter, jacket%',6,0)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL语法错误,执行几个查询时?

来自分类Dev

使用OleDbCommandBuilder时访问SQL语法错误

来自分类Dev

SQL访问错误-查询表达式中的语法错误

来自分类Dev

PHP中的SQL查询语法错误

来自分类Dev

查询包含多个JOIN时访问SQL语法错误(缺少运算符)

来自分类Dev

处理子群时的SQL查询语法错误

来自分类Dev

在Yii2中执行原始SQL查询?

来自分类Dev

Yii2:获取model-> save()的原始sql

来自分类Dev

使用PDO和SQL Server插入日期时出现“语法错误或访问冲突”

来自分类Dev

Yii2中的SQL查询帮助

来自分类Dev

将原始SQL传递给yii2 active dataProvider

来自分类Dev

在Python中执行原始SQL查询时出现问题:或附近的sqlalchemy.exc.programmingerror语法错误

来自分类Dev

如何在yii2中编写SQL查询

来自分类Dev

在Pandas SQL查询中传递参数时出现语法错误

来自分类Dev

PHP中的SQL查询语法错误

来自分类Dev

查询包含多个JOIN时访问SQL语法错误(缺少运算符)

来自分类Dev

插入查询中的SQL语法错误

来自分类Dev

SQL查询中AND的语法错误

来自分类Dev

处理子群时的SQL查询语法错误

来自分类Dev

使用PDO和SQL Server插入日期时出现“语法错误或访问冲突”

来自分类Dev

语法错误或访问冲突php sql

来自分类Dev

遍历数据库时SQL查询中的语法错误

来自分类Dev

Yii2 querybuilder使用原始SQL的表名的正确语法

来自分类Dev

Laravel SQL 查询不断给出 SQLSTATE[42000]:语法错误或访问冲突:1064

来自分类Dev

使用原始 SQL SELECT 命令时出现语法错误

来自分类Dev

在更改表语法错误或访问冲突时:1064 您的 sql 语法有错误;

来自分类Dev

在 psql 中运行 SQL 脚本时出现语法错误

来自分类Dev

在 sql 查询中使用 LIKE 时出现语法错误

来自分类Dev

错误:“SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误。”。.env 或 PDO 中的问题?

Related 相关文章

  1. 1

    SQL语法错误,执行几个查询时?

  2. 2

    使用OleDbCommandBuilder时访问SQL语法错误

  3. 3

    SQL访问错误-查询表达式中的语法错误

  4. 4

    PHP中的SQL查询语法错误

  5. 5

    查询包含多个JOIN时访问SQL语法错误(缺少运算符)

  6. 6

    处理子群时的SQL查询语法错误

  7. 7

    在Yii2中执行原始SQL查询?

  8. 8

    Yii2:获取model-> save()的原始sql

  9. 9

    使用PDO和SQL Server插入日期时出现“语法错误或访问冲突”

  10. 10

    Yii2中的SQL查询帮助

  11. 11

    将原始SQL传递给yii2 active dataProvider

  12. 12

    在Python中执行原始SQL查询时出现问题:或附近的sqlalchemy.exc.programmingerror语法错误

  13. 13

    如何在yii2中编写SQL查询

  14. 14

    在Pandas SQL查询中传递参数时出现语法错误

  15. 15

    PHP中的SQL查询语法错误

  16. 16

    查询包含多个JOIN时访问SQL语法错误(缺少运算符)

  17. 17

    插入查询中的SQL语法错误

  18. 18

    SQL查询中AND的语法错误

  19. 19

    处理子群时的SQL查询语法错误

  20. 20

    使用PDO和SQL Server插入日期时出现“语法错误或访问冲突”

  21. 21

    语法错误或访问冲突php sql

  22. 22

    遍历数据库时SQL查询中的语法错误

  23. 23

    Yii2 querybuilder使用原始SQL的表名的正确语法

  24. 24

    Laravel SQL 查询不断给出 SQLSTATE[42000]:语法错误或访问冲突:1064

  25. 25

    使用原始 SQL SELECT 命令时出现语法错误

  26. 26

    在更改表语法错误或访问冲突时:1064 您的 sql 语法有错误;

  27. 27

    在 psql 中运行 SQL 脚本时出现语法错误

  28. 28

    在 sql 查询中使用 LIKE 时出现语法错误

  29. 29

    错误:“SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误。”。.env 或 PDO 中的问题?

热门标签

归档