我已经重写了我的网站PHP代码并添加了MySQL存储过程。
在我的本地版本中一切正常,但是在将网站上传到托管服务器后,我不断地收到致命错误“Prepared statement needs to be re-prepared”。
有时页面可以加载,有时加载失败并出现此错误。这是什么原因?
/etc/my.cnf
文件(在[mysqld]
部分下)中添加了table_definition_cache=5000
并重新启动mysqld
时,错误消失了。请注意,你的my.cnf
文件可能存放在不同的位置。 - Sygmoral@docwhat的回答看起来很好,但在共享托管服务器上,并不是每个人都被允许更改table_open_cache
或table_definition_cache
选项。
由于这个错误与预处理语句有关,我尝试通过提供以下选项来“模拟”PDO中的预处理语句:
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, [
PDO::ATTR_EMULATE_PREPARES => true
]);
config/database.php
中添加了这个选项:'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
'options' => [
PDO::ATTR_EMULATE_PREPARES => true,
],
],
(...)
],
SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared
。table_definition_cache
是最合适的解决方案。但是当我阅读你提供的链接时,我开始怀疑了。实际上,我仍然面临这个问题,并且我观察到这在服务器php 7.0上发生,但不会在php 5.6上发生(这是我设置的特定情况)。 - josevoidtable_definition_cache
更可靠。 - Parsa_Gholipour首先获取 mysql
shell 访问权限:
mysql
检查table_definition_cache的值:
show global variables like '%table_definition_cache%';
它可能是400或1400。
将其放大:
set global table_definition_cache = 4000;
准备就绪!
只需按照以下步骤操作:
SET GLOBAL table_definition_cache = 4096;
SET GLOBAL table_open_cache = 4096;
4096 可能会太小,因此请将其设置为更高的值。但是请确保两个值相同。
在使用Doctrine ORM时,对数据库运行FLUSH TABLES命令可以解决我的问题。
DELIMITER $$
--
-- Procedimientos
--
DROP PROCEDURE IF EXISTS `dch_content_class_content`$$
CREATE DEFINER=`renuecod`@`localhost` PROCEDURE `dch_content_class_content`(IN $classId INTEGER)
BEGIN
-- vw_content_class_contents is a VIEW (UNIONS)
select * from vw_content_class_contents;
END$$
好的,我们被困在一台笔记本电脑上,它无法让Tableau更新或从我们的MariaDB 10.3.31数据库视图中检索数据。我们做了通常的事情,谷歌和堆栈溢出,有很多解决方案,但都不起作用。然而,我们有另一台可以连接并正常运行的笔记本电脑。所以在多次挠头之后,一个灵光乍现的时刻来了。 有问题的笔记本电脑安装了V5.3.14和V8.0.26 ODBC连接器。我们删除了V8.0.26 ODBC连接器,所有视图问题都消失了。 希望有人会发现这个解决方案有用。
我遇到了一个由于 group_concat_max_len
语句过长而导致的错误。
SET SESSION group_concat_max_len = 1000000000000000000;
将其删除后,错误消失了。