加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – Laravel:一般错误:1615准备好的声明需要重新准备

发布时间:2020-12-14 19:46:56 所属栏目:大数据 来源:网络整理
导读:我在宅基地虚拟机(流浪汉)中使用最新版本的laravel(5.1). 我将我的项目连接到本地mariaDB服务器,其中我有一些表和2个db-view. 由于我只在db-view表上做了一些select,所以我随机收到了这个错误: General error: 1615 Prepared statement needs to be re-prep
我在宅基地虚拟机(流浪汉)中使用最新版本的laravel(5.1).

我将我的项目连接到本地mariaDB服务器,其中我有一些表和2个db-view.

由于我只在db-view表上做了一些select,所以我随机收到了这个错误:

General error: 1615 Prepared statement needs to be re-prepared

从今天开始,我只在db视图上选择时才会出现此错误.
如果我打开我的phpMyAdmin并进行相同的选择它会返回正确的结果.

我试图打开php artisan tinker并选择db-view的一条记录,但它返回相同的错误:

// Select one user from user table
>>> $user = new AppUser
=> <AppUser #000000006dc32a890000000129f667d2> {}
>>> $user = AppUser::find(1);
=> <AppUser #000000006dc32a9e0000000129f667d2> {
       id: 1,name: "Luca",email: "luca@email.it",customerId: 1,created_at: "2015-08-06 04:17:57",updated_at: "2015-08-11 12:39:01"
   }
>>> 
// Select one source from Source db-view
>>> $source = new AppSource
=> <AppSource #000000006dc32a820000000129f667d2> {}
>>> $source = AppSource::find(1);
IlluminateDatabaseQueryException with message 'SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: select * from `sources` where `sources`.`id` = 1 limit 1)'

我该如何解决这个问题?
我读到了mysqldump的一个问题(但不是我的情况)并且增加了table_definition_cache的值,但它不确定它是否可行,我无法修改它们.

这是一种laravel bug吗?

我怎么能弄明白呢?

编辑:

如我所知,我添加了我的模型源代码.
Source.php:

<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class Source extends Model
{
    protected $table = 'sources';


    /*
    |--------------------------------------------------------------------------
    | FOREIGN KEYS
    |--------------------------------------------------------------------------
    */

    /**
     * 
     * @return [type] [description]
     */
    public function customersList(){
        return $this->hasMany("AppCustomerSource","sourceId","id");
    }


    /**
     * 
     * @return [type] [description]
     */
    public function issues(){
        return $this->hasMany("AppIssue","id");
    }
}

编辑2:

如果我使用mysqli在项目中执行相同的查询,它可以工作:

$db = new mysqli(getenv('DB_HOST'),getenv('DB_USERNAME'),getenv('DB_PASSWORD'),getenv('DB_DATABASE'));
if($db->connect_errno > 0){
    dd('Unable to connect to database [' . $db->connect_error . ']');
}
$sql = "SELECT * FROM `sources` WHERE `id` = 4";
if(!$result = $db->query($sql)){
    dd('There was an error running the query [' . $db->error . ']');
}

dd($result->fetch_assoc());

编辑3:
Afeter 2个月,我还在那里.相同的错误,没有找到解决方案
我决定尝试一下aritsan tinker的小解决方案,但没有好消息.
我报告了我尝试过的内容:

首先尝试获取表模型:

>>> $user = AppUser::find(1);
=> AppUser {#697
     id: 1,email: "luca.d@company.it",updated_at: "2015-10-27 11:28:14",}

现在尝试获取视图表模型:

>>> $ir = AppContentRepository::find(15);
IlluminateDatabaseQueryException with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'dbname.content_repositories' doesn't exist (SQL: select * from `content_repositories` where `content_repositories`.`id` = 1 limit 1)'

当contentRepository在模型ContentRepository.php中没有正确的表名设置时:

>>> $pdo = DB::connection()->getPdo();
=> PDO {#690
     inTransaction: false,errorInfo: [
       "00000",1146,"Table 'dbname.content_repositories' doesn't exist",],attributes: [
       "CASE" => NATURAL,"ERRMODE" => EXCEPTION,"AUTOCOMMIT" => 1,"PERSISTENT" => false,"DRIVER_NAME" => "mysql","SERVER_INFO" => "Uptime: 2513397  Threads: 12  Questions: 85115742  Slow queries: 6893568  Opens: 1596  Flush tables: 1  Open tables: 936  Queries per second avg: 33.864","ORACLE_NULLS" => NATURAL,"CLIENT_VERSION" => "mysqlnd 5.0.11-dev - 20120503 - $Id: id_here $","SERVER_VERSION" => "5.5.5-10.0.17-MariaDB-1~wheezy-wsrep-log","STATEMENT_CLASS" => [
         "PDOStatement","EMULATE_PREPARES" => 0,"CONNECTION_STATUS" => "localiphere via TCP/IP","DEFAULT_FETCH_MODE" => BOTH,}
>>>

更改表值内部模型ContentRepository.php:

>>> $ir = AppContentRepository::find(15);
IlluminateDatabaseQueryException with message 'SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: select * from `contentRepository` where `contentRepository`.`id` = 15 limit 1)'

如果正确,请注意缺少的“errorInfo”:

>>> $pdo = DB::connection()->getPdo();
=> PDO {#690
     inTransaction: false,"SERVER_INFO" => "Uptime: 2589441  Threads: 13  Questions: 89348013  Slow queries: 7258017  Opens: 1604  Flush tables: 1  Open tables: 943  Queries per second avg: 34.504","CONNECTION_STATUS" => "localIPhere via TCP/IP",}

显示db的表:

>>> $tables = DB::select('SHOW TABLES');
=> [
     {#702
       +"Tables_in_dbname": "table_name_there",},{#683
       +"Tables_in_dbname": "table_name_there",{#699
       +"Tables_in_dbname": "table_name_there",{#701
       +"Tables_in_dbname": "table_name_there-20150917-1159",{#704
       +"Tables_in_dbname": "contentRepository",*/ VIEW TABLE IS THERE!!!! /*
     },{#707
       +"Tables_in_dbname": "table_name_there",{#684
       +"Tables_in_dbname": "table_name_there",]

尝试正常选择:

>>> $results = DB::select('select * from dbname.contentRepository limit 1');
IlluminateDatabaseQueryException with message 'SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: select * from dbname.contentRepository limit 1)'

尝试毫无准备的查询:

>>> DB::unprepared('select * from dbname.contentRepository limit 1')
=> false

尝试第二次无准备查询:

>>> DB::unprepared('select * from dbname.contentRepository limit 1')
IlluminateDatabaseQueryException with message 'SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active.  Consider using PDOStatement::fetchAll().  Alternatively,if your code is only ever going to run against mysql,you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. (SQL: select * from dbname.contentRepository limit 1)'

试试PDOStatement :: fetchAll():

>>> DB::fetchAll('select * from dbname.contentRepository limit 1'); 
PHP warning:  call_user_func_array() expects parameter 1 to be a valid callback,class 'IlluminateDatabaseMySqlConnection' does not have a method 'fetchAll' in /Users/luca/company/Laravel/dbname/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php on line 296

尝试第二个PDOStatement :: fetchAll():

>>> $pdo::fetchAll('select * from dbname.contentRepository limit 1');
  [SymfonyComponentDebugExceptionFatalErrorException]  
  Call to undefined method PDO::fetchAll()

试试声明……:

>>> $pdos = DB::statement('select * from dbname.contentRepository limit 1')
IlluminateDatabaseQueryException with message 'SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: select * from dbname.contentRepository limit 1)'

谢谢

它似乎有用
'options'   => [
                PDO::ATTR_EMULATE_PREPARES => true
            ]

在DB配置中的projectName / config / database.php文件内.它会是这样的:

'mysql' => [
    'driver'    => 'mysql','host'      => env('DB_HOST','localhost'),'database'  => env('DB_DATABASE','forge'),'username'  => env('DB_USERNAME','password'  => env('DB_PASSWORD',''),'charset'   => 'utf8','collation' => 'utf8_unicode_ci','prefix'    => '','strict'    => false,'options'   => [
        PDO::ATTR_EMULATE_PREPARES => true
    ]
],

Laravel 5.1.希望它会有所帮助!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读