猿问

Laravel DB::statement 无法为涉及列表达式的查询正确准备值

我想知道 DB::statement 和 DB::unprepared 查询之间出现的问题,所以显然 DB::statement 方法不能用于对列本身执行表达式的查询,如下所示:


更新标签集?= ? + 2 哪里?> ? AND user_id = ? AND tree_id = ?


这将导致 SQL 为:


更新标签 SET rgt = rgt + 2 WHERE rgt > 2 AND user_id = 1 AND tree_id = 1


^这个查询在 mysql 解释器中使用时绝对可以正常工作,但使用 laravel 的 DB::statement 方法(顺便说一句,它可以正常工作与未准备的方法一起使用)。


这种不匹配背后的原因是什么?


它弹出的错误很SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax奇怪,因为它的语法正确并且已经可以在 mysql 上正常工作。


所以语句方法是这样做的:


    {

        return $this->run($query, $bindings, function ($query, $bindings) {

            if ($this->pretending()) {

                return true;

            }

            $statement = $this->getPdo()->prepare($query);

            $this->bindValues($statement, $this->prepareBindings($bindings));

            $this->recordsHaveBeenModified();

            return $statement->execute();

        });

    }

而毫无准备的人:


    {

        return $this->run($query, [], function ($query) {

            if ($this->pretending()) {

                return true;

            }

            $this->recordsHaveBeenModified(

                $change = ($this->getPdo()->exec($query) === false ? false : true)

            );

            return $change;

        });

    }

我认为问题在于prepare方法。


慕容森
浏览 457回答 1
1回答
随时随地看视频慕课网APP
我要回答