php – Laravel:一般错误:1615准备好的声明需要重新准备
我在宅基地虚拟机(流浪汉)中使用最新版本的laravel(5.1).
我将我的项目连接到本地mariaDB服务器,其中我有一些表和2个db-view. 由于我只在db-view表上做了一些select,所以我随机收到了这个错误:
从今天开始,我只在db视图上选择时才会出现此错误. 我试图打开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)' 我该如何解决这个问题? 这是一种laravel bug吗? 我怎么能弄明白呢? 编辑: 如我所知,我添加了我的模型源代码. <?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: 首先尝试获取表模型: >>> $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.希望它会有所帮助! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |