table_exists () - Methode funktioniert möglicherweise nicht ordnungsgemäß
Ich fange an, schreiben Sie eine einfache Model-Klasse mit codeigniter 2.1.0. Alles, was ich will, es jetzt zu tun ist, erstellen und löschen des MySQL-Tabelle es darstellt. Hier ist der code:
<?php
class Users_model extends CI_Model {
public function createTable(){
if( $this->db->table_exists('users') == FALSE ){
$query = "CREATE TABLE users(
id SERIAL PRIMARY KEY,
email VARCHAR(52) NOT NULL check(email <> ''),
UNIQUE (email)
)ENGINE = InnoDB;";
$this->db->query($query);
}
}
public function deleteTable(){
if( $this->db->table_exists('users') ){
$query = "DROP TABLE users;";
$this->db->query($query);
} else {
echo "users not found <br />";
$tables = $this->db->list_tables();
foreach ($tables as $table)
{
echo $table."<br />";
}
}
}
}
?>
- Und dies ist der code den ich ausführen in der main-Klasse:
$this->load->model('users_model');
$this->users_model->deleteTable();
$this->users_model->createTable();
Dem ersten Lauf ist schön und gut. Die Tabellen erstellt werden, einfach nur gut. Aber dann, wenn ich es wieder laufen, bekomme ich die Ausgabe:
users not found
users
Bei weiterer Betrachtung erkenne ich table_exists()
kehrt nie zurück TRUE
. var_dump($this->db->table_exists('users'));
zurück bool(false)
.
So, mache ich etwas falsch? Dies ist so einfach wie es wird, kopieren eingefügt werden aus der Dokumentation. Google nicht wieder alles rund, und ein C-Programmierer, meine Einstellung ist immer "Wenn es ein bug ist, gehört es Ihnen. (Richard Stallman ist nie falsch)"... Aber da Herr Stallman hat das wenig zu tun, es gibt eine Möglichkeit.
TL;DR
Warum table_exists('users')
im obigen code gibt nie zurück TRUE
auch wenn list_tables()
zurück 'Benutzer';
- was bedeutet
var_dump($this->db->table_exists('users'));
sagen? - Danke, jetzt können wir behaupten, es ist in der Tat return bool(false). Was kommt als Nächstes 😛
- ok gut... sieht gut aus. bist du sicher, dass (direkt auf dem mysql-server, vielleicht mit Hilfe von phpMyAdmin), dass der Benutzer-Tabelle nicht existiert (in der richtigen Datenbank) ? scheint seltsam..
- Die Tabelle gibt es, phpMyAdmin und list_tables() beide übereinstimmen, dass die Tabelle gibt es und es nennt sich "Benutzer". Ich überprüfte für Leerzeichen vor und nach, setzen Sie den Namen durch eine ascii zu hex. Weiß nicht, wo das problem sein könnte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie es mit
var_dump()
stattecho
. Boolesche Werte nicht gut mitecho
.Den source code von
table_exists
sieht wie folgt aus:Update Kommentare
Wenn Sie einen Blick auf _protect_identifiers es tut fügen Sie der Datenbank-name der name der Tabelle. Aber sollte es ein . zwischen
db.table
. Vielleicht ist deine db config versaut ist?system/database/DB_driver.php
und var_dump das Ergebnis_protect_identifiers
. Vielleicht ist etwas seltsam. oder ist es ein Leerzeichen nach dem Tabellennamen, oder was?.
zwischen db.Tabelle. Vielleicht ist deine db config versaut ist?Als eine Lösung für Ihr problem in codeigniter können Sie versuchen, diese Funktion
Als eine Lösung, könnte man eine Methode verwenden, um eine Liste aller Tabellen(link), speichern Sie Sie in einem array
Könnten Sie Folgen Beispiel 1 auf den folgenden link:
http://uk.php.net/manual/en/function.mysql-list-tables.php
Ich habe ein ähnliches problem mit dieser Funktion.
Ich verwende ein script um die Tabellen zu erstellen, dass meine Website benötigen, wenn die Funktion table_exists() legt fest, dass jede der benötigten Tabellen vorhanden sind. Ich sehe immer wieder ein seltsames problem, wo auf der ersten Seite laden, mehrere Datenbank-Insertionen schien nicht passiert zu sein. Ich dachte, es war ein problem mit meinem insert-Anweisungen, aber ich konnte nicht einen einzigen Fehler. Auch schien alles zu funktionieren, nach dem ersten laden der Seite. Es stellt sich heraus, dass das Skript zur Erstellung der Tabelle wurde tatsächlich mehrmals genannt, neu zu erstellen, eine leere Tabelle zu jeder Zeit.
Ich gehe davon aus, dass die Ergebnisse durch mehrere Aufrufe table_exists() nicht ändern basiert auf Tabellen, die erstellt werden, nachdem es aufgerufen wird (das erste mal).
Ich auch versucht, auf die Lösung gegeben durch Shayan Husaini. list_tables(); scheint auch auf die gleiche Weise reagieren. Es wird nicht wieder neue Tabellen, die erstellt wurden, nachdem es aufgerufen wurde.
Ich irgendwann behoben dieses problem durch die Verfolgung jeder Tabelle, die erstellt wurde, während eine Seite geladen wird. Trotzdem habe ich das Gefühl, dass diese Funktionen sollten in der Lage sein, neue Tabellen zur Datenbank Hinzugefügt wurde, nachdem diese Funktionen aufgerufen wurden, eine (oder mehr) mal.
Habe das gleiche Problem mit CodeIgniter 3 wenn Sie versuchen, zu verwenden table_exists() in einem Migrationen Kontext. (Es scheint zu funktionieren wie erwartet, in anderen Punkte in meinem code.)
Für MySQL, hier ist Billig und fröhlich Ersatz:
Obwohl, ärgerlich, dieser Ersatz scheint nicht glücklich mit CI Datenbank-caching eingeschaltet.
:-/
OK, also ich habe gerade Angeln um in den code, und während es nicht aussieht wie ein bug, es ist auf jeden Fall gut-zu-wissen:
DB_driver.php
::table_exists (), die abhängig von:
::list_tables (), das ziehen kann der name der Tabelle Liste aus Ihrem eigenen "pro Instanziierung" cache oder von der Abfrage zur Verfügung gestellt von:
::_list_tables() [in der mysqliOrWhatever_driver.php in Frage], die für MySQL ist ein 'SHOW TABLES AUS theSchemaName' Abfrage
DB_forge.php
Folgenden Methoden können potenziell Auswirkungen auf die "pro-Instanziierung"
cache DB_driver.php:
(Macht Sinn, oder?)
war für mich