Laravel: Allgemeine Fehler: 1615 Vorbereitete Anweisung muss neu vorbereitet
Ich bin mit der letzten version von laravel (5.1) in ein Gehöft virtuellen Maschine (Gast).
Verbinde ich mein Projekt in einer lokalen mariaDB-server, bei dem ich noch einige Tisch-und 2-db-view.
Da ich einige auswählen nur auf die db-Tabellen anzeigen, erhalte ich wieder zufällig dieser Fehler:
Allgemeine Fehler: 1615 Vorbereitete Anweisung muss neu vorbereitet
Ab heute bekomme ich immer diese Fehlermeldung, wenn die Option nur auf die db-views.
Wenn ich mein phpMyAdmin machen und gleichzeitig wählen Sie das korrekte Ergebnis zurück.
Ich versuchte, Sie zu öffnen php artisan tinker
und wählen Sie einen Datensatz aus der db-Sicht, aber es wieder der gleiche Fehler:
//Select one user from user table
>>> $user = new App\User
=> <App\User #000000006dc32a890000000129f667d2> {}
>>> $user = App\User::find(1);
=> <App\User #000000006dc32a9e0000000129f667d2> {
id: 1,
name: "Luca",
email: "[email protected]",
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 App\Source
=> <App\Source #000000006dc32a820000000129f667d2> {}
>>> $source = App\Source::find(1);
Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: select * from `sources` where `sources`.`id` = 1 limit 1)'
Wie kann ich das beheben?
Ich habe gelesen über ein problem mit mysqldump (aber nicht in meinem Fall) und um die Erhöhung der Wert der table_definition_cache
aber es ist nicht sicher, dass es funktionieren wird und ich kann es nicht ändern.
Ist dies eine Art von laravel bug?
Wie kann ich das herausfinden?
Edit:
Da fragte ich meine model source code.
Source.php:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Source extends Model
{
protected $table = 'sources';
/*
|--------------------------------------------------------------------------
| FOREIGN KEYS
|--------------------------------------------------------------------------
*/
/**
*
* @return [type] [description]
*/
public function customersList(){
return $this->hasMany("App\CustomerSource", "sourceId", "id");
}
/**
*
* @return [type] [description]
*/
public function issues(){
return $this->hasMany("App\Issue", "sourceId", "id");
}
}
Edit 2:
Wenn ich die gleiche Abfrage ausführen, die in das Projekt mit mysqli funktioniert es:
$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());
EDIT 3:
Afeter 2 Monat, ich bin immer noch da. Gleichen Fehler und noch keine Lösung gefunden.
Ich entscheiden, zu versuchen, ein wenig Lösung in aritsan basteln aber keine guten Nachrichten.
Ich Berichte, was ich versucht habe:
Ersten versuchen zu Holen eine Tabelle, Modell:
>>> $user = \App\User::find(1);
=> App\User {#697
id: 1,
name: "Luca",
email: "[email protected]",
customerId: 1,
created_at: "2015-08-06 04:17:57",
updated_at: "2015-10-27 11:28:14",
}
Nun versuchen zu Holen eine Ansicht, Tabelle, Modell:
>>> $ir = \App\ContentRepository::find(15);
Illuminate\Database\QueryException 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)'
Wenn contentRepository nicht die richtigen Tabellennamen setup im Modell 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,
],
}
>>>
Änderungstabelle-WERT in Modell ContentRepository.php:
>>> $ir = \App\ContentRepository::find(15);
Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: select * from `contentRepository` where `contentRepository`.`id` = 15 limit 1)'
Wenn es richtig ist, achten Sie auf die "errorInfo" fehlt:
>>> $pdo = DB::connection()->getPdo();
=> PDO {#690
inTransaction: false,
attributes: [
"CASE" => NATURAL,
"ERRMODE" => EXCEPTION,
"AUTOCOMMIT" => 1,
"PERSISTENT" => false,
"DRIVER_NAME" => "mysql",
"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",
"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,
],
}
Zeigen db-Tabellen:
>>> $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",
},
]
Versuchen mit normal wählen Sie:
>>> $results = DB::select('select * from dbname.contentRepository limit 1');
Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: select * from dbname.contentRepository limit 1)'
Versuchen unvorbereitet Abfrage:
>>> DB::unprepared('select * from dbname.contentRepository limit 1')
=> false
Versuchen zweites mal unvorbereitet Abfrage:
>>> DB::unprepared('select * from dbname.contentRepository limit 1')
Illuminate\Database\QueryException 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)'
Versuchen 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 'Illuminate\Database\MySqlConnection' does not have a method 'fetchAll' in /Users/luca/company/Laravel/dbname/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php on line 296
Versuchen, die zweite PDOStatement::fetchAll():
>>> $pdo::fetchAll('select * from dbname.contentRepository limit 1');
[Symfony\Component\Debug\Exception\FatalErrorException]
Call to undefined method PDO::fetchAll()
Try-Anweisung... :
>>> $pdos = DB::statement('select * from dbname.contentRepository limit 1')
Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: select * from dbname.contentRepository limit 1)'
Danke
Hinzugefügt. danke
InformationsquelleAutor Tenaciousd93 | 2015-08-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es zu funktionieren hinzufügen
Innen
projectName/config/database.php
Datei in der DB-Konfiguration. Es wird so sein:Laravel 5.1. Hoffe, es wird helfen!
Hallo David, danke für deinen Hinweis! Haben Sie eine bessere Lösung gefunden, statt von diesem trick? Danke.
Die meisten Lösungen vorschlagen, die Erhöhung der Wert der
table_definition_cache
in der MySQL-config.@David erwähnt,
SET GLOBAL table_definition_cache = 1024
für mich gearbeitet. mariadb.com/kb/en/library/server-system-variables/...Funktioniert auf Laravel 5.6 🙂
InformationsquelleAutor Tenaciousd93
Gemäß den Kommentaren in der akzeptierten Antwort,
läuft
SET GLOBAL table_definition_cache = 1024
in der MariaDB das problem gelöst.
https://mariadb.com/kb/en/library/server-system-variables/#table_definition_cache
InformationsquelleAutor TimoSolo
Scheint, wie es eine MySQL Fehler, die dokumentiert wurde.
Edit:
Ist Ihr Modell mit der Kennung 'id' als Primärschlüssel? Ich möchte legen Sie den Primärschlüssel explizit in das Modell, auch wenn es ist.
protected $primaryKey = 'id'; //If different than id, definitely need to set the column here
Können Sie auch versuchen, das auskommentieren der
hasMany()
Funktionen und versuchen Sie es erneut. Manchmal Laravel tun können seltsame Dinge auf eagerLoad, vor allem, wenn es gibt EINE MENGE von Aufzeichnungen, die es versucht Karte zu.Aktualisierte Antwort
danke für Sie Bearbeiten. Nein, es ist kein primary key. Versuchen Sie es trotzdem, aber es funktioniert nicht. Ich habe versucht, zu kommentieren
customersList()
undissues()
Methoden und call$s = Source::find(1);
aber es funktioniert nicht zu.Was sind Ihre ausfüllbare Spalten? Sie können die reservierten Worte oder etwas anderes, bricht die Abfragen.
Ich habe nicht ausfüllbare Spalten, ich lese nur Daten aus der DB.
InformationsquelleAutor Blake