如何解决MySQL错误“Prepared statement needs to be re-prepared”

29
我已经重写了我的网站PHP代码并添加了MySQL存储过程。 在我的本地版本中一切正常,但是在将网站上传到托管服务器后,我不断地收到致命错误“Prepared statement needs to be re-prepared”。 有时页面可以加载,有时加载失败并出现此错误。这是什么原因?

1
以下答案没有涉及到问题的核心。更多答案请参考此重复问题 - reinierpost
1
你的评论已经不再正确了。多年来出现了更多的答案,现在下面的答案似乎为重复问题增添了很多内容(而这些重复问题实际上并没有什么帮助)。 - Kar.ma
13个回答

0

我尝试运行一个连接视图和表的UPDATE查询,结果遇到了同样的错误。由于我没有用户输入,所以我决定运行DB::unprepared来解决这个问题。

您可以在Laravel文档中阅读更多相关信息。


0
这是一个针对共享主机上的人们的解决方法,他们不想冒着 SQL 注入的风险。根据这篇文章: Laravel Fluent Query Builder Join with subquery 你可以将视图的定义存储在一个函数中。
private function myView(){
    return DB::raw('(**definition of the view**) my_view_name)');
}

然后像这样使用它:

public function scopeMyTable(Builder $query)
{
    return $query->join($this->myView(),'my_view_name.id','=','some_table.id');
}

这是一个 Laravel 的方法,但我相信它可以应用于大多数情况,并且不需要进行大量的代码重构或架构更改。此外,由于您的语句保持准备状态,因此它相对安全。


-3

我在共享托管环境中使用Ruby on Rails时遇到了同样的错误。这可能不是最安全的解决方案,但禁用预处理语句可以为我消除错误消息。

您可以通过将"prepared_statements: false"设置添加到您的database.yml文件来实现此目的:

production:
  prepared_statements: false

这似乎是一个合理的解决方案,当你无法控制MySQL服务器上的配置设置时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接