Ich habe eine Reihe von gespeicherten Prozeduren mit der MySQL Workbench gemacht. Sie funktionieren gut, wenn sie die MySQL-Workbench verwenden, um sie in meine Test-DB zu schreiben.Wie man gespeicherte Prozeduren in mySQL aus PHP einfügt/erstellt?
Jetzt bereite ich die DB-Erstellung Skripte für die Bereitstellung vor, und dies ist der einzige, der mir Probleme bereitet. Wenn ich die Befehlszeile/mysql-Shell verwende, funktioniert das Skript sehr gut. Es ist nur, wenn ich die PHP-mysql (i) -Schnittstelle verwende, um das Skript auszuführen - es schlägt fehl. Ohne Kommentar.
Ich benutze die Prozedurenerstellungsskripte, wie MySQL Workbench für mich generiert; das heißt, es dieses Muster hat:
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL';
zu Beginn des Skripts, dann für jedes Verfahren zu wiederholen:
DELIMITER $$
USE `dbname`$$
CREATE PROCEDURE `procname`(IN inputparameters)
BEGIN
... Prozedur geht hier
;
END$$
DELIMITER ;
Dieses Skript funktioniert gut, wenn es von MySQL Workbench ausgeführt wird. Es läuft auch gut, wenn ich das gleiche von mysql Kommandozeile versuche. Aber es bringt nichts, wenn ich es über die PHP-mysqli-Schnittstelle ausführe (indem ich es mit mysqli_multi_query ausführe, was gut für die anderen Skripte funktioniert, die die DB erstellen und auffüllen). Es wird kein Fehler auf der Schnittstelle zurückgegeben, keine Ergebnisse (!). Alles, was ich bekomme, ist "falsch", und das ist es. Fehlercode ist 0, keine Fehlermeldung.
Es ist eine große WTF für mich, und ich hoffe, Sie können mir in die richtige Richtung zeigen - wie kann ich das beheben und die Verfahren von PHP installieren?
PS: root/admin Zugriff ist gegeben und verifiziert (schließlich habe ich nur die DB mit der gleichen Verbindung erstellt, Benutzer erstellt, Tabellen eingefügt und so weiter).
Versuchen Sie, die Verwendung 'DBName' zu entfernen. Versuchen Sie auch, auszuführen, wenn Sie den Befehl mysqli_query verwenden. – Knubo
Ich habe diese USE-Anweisung entfernt, keinen Effekt. mysqli_query scheitert auch - und in diesem Fall ist es offensichtlich, warum: Die Zeichenkette enthält mehrere Anweisungen. Wenn sie * korrekt ausgeführt würde, würde sie mehrere Ergebnisse zurückgeben - was mysqli_query nicht behandelt. - Für die anderen Skripte funktioniert mysqli_multi_query völlig fehlerfrei und gibt eine Ergebniszeile für jede Anweisung zurück. (leere Zeilen bei Erfolg, Hinweis: 1051 Zeilen als Reaktion auf WARNUNGEN ERKLÄREN; - alle wie erwartet). – foo
Ich komme näher - keine Lösung, aber eine Diagnose. DELIMITER scheint clientseitig (!) Implementiert zu sein. – foo