Frage

Ich habe eine Reihe von gespeicherten Verfahren mit der MySQL Workbench durchgeführt. Sie funktionieren gut, wenn Sie MySQL Workbench verwenden, um sie in meinen Test -DB zu stecken.

Jetzt bereite ich die DB -Erstellungsskripte für die Bereitstellung vor, und dies ist die einzige, die mir Probleme gibt. Wenn ich die Befehlszeile / Mysql -Shell verwende, funktioniert das Skript perfekt gut. Nur wenn ich die Schnittstelle von PHP Mysql (i) verwende, um das Skript auszuführen - schlägt es fehl. Ohne Kommentar.

Ich benutze die Skripte zur Erstellung von Verfahren, wie MySQL Workbench für mich generiert. Das heißt, es hat dieses Muster:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

Zu Beginn des Skripts und wiederholen Sie dann für jede Prozedur:

DELIMITER $$
USE `dbname`$$
CREATE PROCEDURE `procname`(IN inputparameters)
BEGIN

... Verfahren geht hier

;
END$$
DELIMITER ;

Dieses Skript funktioniert gut, wenn Sie von MySQL Workbench ausgeführt werden. Es läuft auch gut, wenn ich das gleiche von MySQL Commandline versuche. Aber es kann nichts erreicht, wenn ich es über die PHP MySQLI -Schnittstelle ausführe (es wird mit MySQLI_Multi_Query ausgeführt, was für die anderen Skripte gut funktioniert, die die DB erstellen und bevölkert). Auf der Schnittstelle wird kein Fehler zurückgegeben, keine Ergebnisse (!). Alles was ich bekomme ist "falsch", und das war's. Fehlercode ist bei 0, keine Fehlermeldung.

Es ist ein großes WTF für mich, und ich hoffe, Sie können mich in die richtige Richtung weisen - wie kann ich dies beheben und die Prozeduren von PHP installieren?

PS: Root/Admin -Zugriff wird gegeben und verifiziert (schließlich habe ich gerade die DB mit derselben Verbindung erstellt, Benutzer erstellt, Tabellen eingefügt und so weiter).

War es hilfreich?

Lösung

Ich habe nicht getestet, aber ich werde nicht überrascht sein von mysqli_multi_query() Erwarten Sie den gleichen Trennzeichen jeder Fragen. Versuchen Sie, die Erstellung gespeicherter Prozeduren in einer einzelnen Abfrage zu packen, ohne den Trennzeichenmodifikator zu verwenden?

Also statt

<?php
$results = mysqli_multi(
    'DELIMITER $$
    USE `dbname`$$
    CREATE PROCEDURE `procname`(IN inputparameters)
    BEGIN
    ... procedure goes here

    ;
    END$$
    DELIMITER ;
');
?>

Mach das einfach

<?php
$result = mysqli_query('CREATE PROCEDURE `procname`(IN inputparameters) BEGIN ...; END');

Und sag uns, ob es funktioniert :)

Andere Tipps

Etwas zusammenfassen:

Der Gremiter ist eine clientseitige und nicht Serverside implementiert.

Wenn Sie einen guten Fahrer oder eine gute API haben, kann sich dies darum kümmern. Php Mysql / mysqli bis jetzt nicht.

Wenn Sie einen anderen Trennzeichen verwenden müssen (z. B. weil der Standard -Trennzeichen innerhalb von Skripten angezeigt wird), müssen Sie sich Ihrem SQL selbst codieren/entkommen oder es aufschlüsseln, damit Sie den Trennzeichen nicht ändern müssen. Keine Hilfe von PHP hier.

Der Gremiter ist etwas, das die MySQL -Client -Anwendung tatsächlich verwendet. Ich glaube, dass die Client -Anwendung dafür verantwortlich ist, die Anfragen, die sie an MySQL sendet, aufzubrechen. Das ist es, was PhpMyAdmin zum Beispiel tut.

Verwenden Sie den Code, den ich geschrieben habe. Hier finden Sie es in der Funktion "ScriptToQueries" hier:

http://wush.net/svn/luckyapps/pie/trunk/framework/classes/db/mysql.php

VIEL SPASS

Bearbeiten: Seit dem Schreiben dieser Antwort habe ich den Code in die kostenlose Q -Plattform portiert, in der Sie den Code untersuchen können: https://github.com/egreg/platform/blob/master/platform/classes/db/mysql.php#l824

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top