Tabelle wird nicht angelegt

Spelmann

Erfahrenes Mitglied
Ich habe mich bis jetzt immer um das dynamische Erstellen von MySql Tabellen gedrückt weil es mir bisher nie gelungen ist. Jetzt habe ich aber keine Wahl.
Ich speichere in einer bestehenden Tabelle einen Datensatz. Im gleichen Zug soll eine neu Tabelle erzeugt werden. Hier streikt mein Script egal was ich versuche.
Das ist ein Weg von vielen die ich versucht habe:

PHP:
class Singleton{
	static $db = null;
	
	function holeVerbindung() {
		if (self::$db == null){
			self::$db = new mysqli ('localhost', 'root', 'meinPasswort');
			}
		return self::$db;
		}
}
$sql=$db->prepare('insert INTO rubriken (rubrik, rang) VALUES (?, ?)');
$sql->bind_param('si', $_POST['rubrik'], $_POST['rang']);
if($sql->execute()) {
	$idNew=$db->insert_id; //Autowert der neuen ID
	echo 'Rubrik wurde gespeichert';
	}
//Bis hier hin funktioniert alles aber dann:
$tabelleNeu = mysql_query('CREATE TABLE gerichte (rubrik INT NOT NULL , content TEXT NOT NULL)');

Die Fehlermeldungen lauten:

Code:
Warning: mysql_query() [function.mysql-query]: Access denied for user 'ODBC'@'localhost' (using password: NO) in...
Code:
Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in

Da werd ich aber nicht schlau draus. Ich würde mich sehr freuen wenn mir jemand zeigt wie es geht. Die Datenbankverbindung möchte ich aber gerne so behalten wie sie ist. Es funktioniert ja sonst alles prächtig.
Vielen Dank.
 
Zuletzt bearbeitet:
Moin,



...aus deinem Code ist nicht ersichtlich, dass überhaupt eine Verbindung zum Server/zur DB herstellst.

Richtig, aber nicht nur das, die Klasse nennt sich "Singleton", falls davon keine Referenz/Instance erstellt wurde, soll eine neue von der Klasse "mysqli" erstellt werren, das ist aber keine Klasse, sondern eine Funktion.
Die Methoden "bind_param", "prepare" und "insert_id" sind nicht in der Klasse verfügbar, von welcher aus der Object "$db" stammt.
In "holeVerbindung()" fehlern die 3 Parameter, welche in "new mysqli();" angegeben wurden.


Ich tippe jetzt mal wild darauf, das hier ein paar Kenntnisse in Sachen OOP fehlen ;)
 
Mmmmh, verstehe leider kein Wort von euren Antworten, denn die Datenbankverbindung stand ja. Das Einfügen der Datensätze in Rubriken hat ja von Anfang an funktioniert.
Hab dann das Erstellen der Tabelle nach Stunden trotzdem mit try and error hingefingert.
PHP:
$sql_befehl = "CREATE TABLE gerichte".$idNew." (rubrik INT NOT NULL , content TEXT NOT NULL)";
		$db->query($sql_befehl);

Vielen Dank trotzdem.
Ich hoffe, den Rest bekomme ich schneller hin.
 
Mmmmh, verstehe leider kein Wort von euren Antworten, denn die Datenbankverbindung stand ja.

Das war aber aus deinem Code nicht ersichtlich.

Du hast dort zwar die Singleton-Klasse, es ist auch ersichtlich, was sie machen soll(was so auch OK ist), es ist jedoch nicht zu sehen, wo du die Instanz der Klasse Singleton erzeugst....das geschieht anscheinend woanders.

Das Problem in deinem Fall dürfte gewesen sein:
Die Instanz der Singleton-Klasse erzeugt ja ein MySQLi-Objekt, dieses hast du aber nicht benutzt, denn du verwendest das alteingesessene mysql_query()


Ansonsten:
Wie sähe das Script denn weniger verletzend aus?

Ich kann nichts Schlechtes an dem erkennen, wie du es jetzt hast :)
 
bofh1337 hat gesagt.:
Die SQL-Query, wo Tabellen mit willkürlicher ID angelegt werden (woran erkannt dein Script, welche dann irgendwann wieder gelöscht werden soll)?

Das SQL-Injecten mit den ungeprüften _POST-Vars und zum schluss noch die gewöhnlichen Mysql-Querys, obwohl dort eine Klasse für ein SQL-Layer angefangen wurde.
Was ist willkürlich an der ID?
Es ist die eindeutige ID eines Datensatzes, und sofern die Tabelle einmal gelöscht werden soll, lässt sich über eben diesen Datensatz sehr gut herausfinden, was gelöscht werden soll.

Ich erkenne dort auch keinen Einstieg für Injections.
Die POST-Variablen werden per bind_param() an das Statement gebunden, was Injections verhindert, weil Daten von Anweisungen separat verarbeitet werden können.
 
Sorry !,
ich hatte hier tatsächlich nicht den ganzen verwendeten Code gepostet. Ist natürlich blöd. Aber ich hatte zu dem Zeitpunkt schon stundenlang rumprobiert und war recht müde.
Natürlich fehlte hier noch:
PHP:
$db = Singleton::holeVerbindung();
$db->select_db('DB0815');

@Sven Mintel
Es ist die eindeutige ID eines Datensatzes, und sofern die Tabelle einmal gelöscht werden soll, lässt sich über eben diesen Datensatz sehr gut herausfinden, was gelöscht werden soll
genau so hatte ich es vor. Und funktioniert auch.

Mein Problem war, wie es aussieh, doch eigentlich nur die Syntax und nicht das Prozedere an sich oder?
Ich habe mir die Methode mit der Singleton Klasse von einer Seite gezogen die neue Wege mit MySql 5 zeigte. Wenn ich das richtig verstehe sind mit mysqli irgendwie neue Klassen implementiert die den Code vereinfachen und sicherer machen. Ist das richtig?
Auch wenn ich nicht wirklich weiß, was sich hinter mysqli verbirgt läuft alles was ich so wie oben aufbaue ganz prima.
Viele Posts zum Thema verwenden nur eben abweichende Methoden. Ich finde es dann immer schwer den Code entsprechend anzupassen. Manchmal sind es ja nur Details.
 
Zurück