Question

J'ai un certain nombre de procédures stockées faites avec le Workbench MySQL. Ils fonctionnent très bien que lorsque l'utilisation de MySQL établi pour les mettre dans mon test DB.

Maintenant, je prépare les scripts de création de base de données pour le déploiement, et c'est le seul me donner du mal. Lorsque j'utilise le shell de ligne de commande / mysql, le script fonctionne parfaitement bien. Il est seulement quand j'utilise l'interface PHP MySQL (i) pour exécuter le script - il échoue. Sans commentaire.

J'utilise les scripts de création de procédure établi MySQL génère pour moi; qui est, il a ce schéma:

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';

au début du script, puis en répétant pour chaque procédure:

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

... procédure va ici

;
END$$
DELIMITER ;

Ce script fonctionne très bien si elle est exécutée de MySQL Workbench. Il fonctionne aussi bien si je tente la même chose de MySQL commandline. Mais il ne parvient pas à accomplir quelque chose quand je l'exécute à travers l'interface mysqli PHP (exécution avec mysqli_multi_query, qui fonctionne très bien pour les autres scripts créer et de remplir la base de données). Il n'y a pas d'erreur retourné sur l'interface, aucun résultat (!). Tout get I est « faux », et voilà. code d'erreur est à 0, aucun message d'erreur.

Il est un grand WTF pour moi, et je l'espère, vous pouvez me diriger dans la bonne direction - comment puis-je résoudre ce problème et installer les procédures de PHP

PS:. L'accès root / admin est donnée et vérifié (après tout, je viens de créer la base de données avec la connexion même, les utilisateurs créés, des tables insérées et ainsi de suite)

Était-ce utile?

La solution

Je n'ai pas testé, mais je ne serais pas surpris par mysqli_multi_query() attendant d'avoir le même délimiteur de chaque requêtes. Essayez d'emballer la création de procédure stockée dans une seule requête, sans utiliser le modificateur DELIMITER?

au lieu de

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

    ;
    END$$
    DELIMITER ;
');
?>

Il suffit de le faire

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

Et nous dire si cela fonctionne:)

Autres conseils

Pour résumer:

délimiteur est mis en oeuvre du côté client, et non serverside.

Si vous avez un bon pilote ou API, il peut prendre soin de cela.  PHP MySQL / mysqli, dès maintenant, ne sont pas.

Si vous devez utiliser un séparateur différent (par exemple parce que le séparateur par défaut apparaît à l'intérieur des scripts), vous devez encode / échapper à votre SQL vous-même ou le casser afin que vous n'avez pas besoin de changer le delimiter. Aucune aide de PHP ici.

DELIMITER est quelque chose que l'application client MySQL utilise en fait. Je crois que l'application cliente est responsable de briser les requêtes qu'il envoie à Mysql. C'est ce que PHPMyAdmin fait, par exemple.

Au lieu de passer toute une nuit à écrire un script pour analyser MySQL en requêtes, utilisez le code que j'ai écrit. Vous trouverez dans la fonction scriptToQueries, ici:

http://wush.net/svn /luckyapps/pie/trunk/framework/classes/Db/Mysql.php

PROFITEZ

EDIT: Depuis la rédaction de cette réponse que j'ai porté le code dans la plate-forme libre Q dans laquelle vous pouvez étudier le code: https://github.com/EGreg/Platform/blob/master/platform/classes/Db/Mysql.php#L824

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top