Pregunta

Tengo un número de procedimientos almacenados realizadas con el MySQL Workbench. Ellos trabajan muy bien cuando el uso de MySQL Workbench ponerlos en mi prueba de DB.

Ahora estoy preparando los scripts de creación de base de datos para el despliegue, y este es el único que me daba problemas. Cuando uso la línea de comandos / shell de MySQL, el script funciona perfectamente bien a. Es sólo cuando se utiliza la interfaz de PHP MySQL (i) para ejecutar la secuencia de comandos - se produce un error. Sin comentarios.

Yo uso los comandos de creación de procedimiento que MySQL Workbench genera para mí; es decir, que tiene este patrón:

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

al comienzo de la secuencia de comandos, a continuación, repetir para cada procedimiento:

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

... procedimiento va aquí

;
END$$
DELIMITER ;

Este script funciona bien si se ejecuta desde MySQL Workbench. También funciona muy bien si trato de la misma línea de comandos mysql. Pero falla en lograr cualquier cosa cuando yo haga a través de la interfaz PHP mysqli (ejecutándolo con mysqli_multi_query, que funciona bien para las otras secuencias de comandos Crear y llenar la base de datos). No hay ningún error devuelto en la interfaz, no hay resultados (!). Todo lo que consigo es "falsa", y eso es todo. código de error está en 0, ningún mensaje de error.

Es un gran WTF para mí, y espero que usted me puede apuntar en la dirección correcta - ¿cómo puedo solucionar este problema e instalar los procedimientos de PHP

PS:. Se da acceso root / admin y verificado (después de todo, acabo de crear la base de datos con la misma conexión, los usuarios creados, inserta tablas, etc.)

¿Fue útil?

Solución

No he probado, pero no será sorprendido por mysqli_multi_query() esperando tener el mismo delimitador de cada consultas. Trate de empacar la creación de procedimiento almacenado en una sola consulta, sin necesidad de utilizar el modificador DELIMITER?

Así que en lugar de

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

    ;
    END$$
    DELIMITER ;
');
?>

Sólo hacer esto

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

Y nos dicen si funciona:)

Otros consejos

Para resumir:

delimitador es implementado en el cliente, no serverside.

Si usted tiene un buen conductor o API, puede hacerse cargo de esto. PHP MySQL / mysqli, a partir de ahora, no lo hacen.

Si es necesario utilizar un delimitador diferente (por ejemplo, debido a que el delimitador predeterminado aparece dentro de las secuencias de comandos), usted tiene que codificar / escapar de su SQL sí mismo o dividirla por lo que no es necesario cambiar el delimitador. Sin la ayuda de PHP aquí.

delimitador es algo que la aplicación cliente utiliza MySQL realidad. Creo que la aplicación cliente es responsable de la ruptura de las consultas que se envía a MySQL. Eso es lo que phpMyAdmin, por ejemplo.

En lugar de pasar una noche entera escribiendo un guión para analizar MySQL en consultas, utilice el código que he escrito. Lo encontrará en la función scriptToQueries, aquí:

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

DISFRUTAR

EDIT: Después de haber escrito esta respuesta he portado el código en la plataforma Q libre en el que se puede estudiar el código: https://github.com/EGreg/Platform/blob/master/platform/classes/Db/Mysql.php#L824

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top