Domanda

Ho un certo numero di stored procedure effettuate con il MySQL Workbench. Essi funzionano bene quando l'uso di MySQL Workbench per metterli nel mio test di DB.

Ora mi sto preparando gli script di creazione di DB per la distribuzione, e questo è l'unico a darmi problemi. Quando uso il / shell mysql riga di comando, lo script funziona perfettamente a. E 'solo quando si utilizza l'interfaccia PHP MySQL (i) per eseguire lo script - viene a mancare. Senza commento.

Io uso gli script di creazione procedura MySQL Workbench genera per me; Cioè, si ha questo schema:

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

all'inizio dello script, quindi ripetendo per ogni procedura:

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

... procedura va qui

;
END$$
DELIMITER ;

Questo script funziona bene se eseguito da MySQL Workbench. Funziona bene anche se provo lo stesso da MySQL a riga di comando. Ma non riesce a realizzare qualcosa quando eseguo attraverso l'interfaccia PHP mysqli (esecuzione con mysqli_multi_query, che funziona bene per gli altri script che creano e popolano il DB). Non v'è alcun errore restituito sull'interfaccia, nessun risultato (!). Tutto quello che ottiene è "false", e questo è tutto. codice di errore è a 0, nessun messaggio di errore.

E 'un grande WTF per me, e spero mi si può puntare nella giusta direzione -? Come posso risolvere questo problema e installare le procedure da PHP

PS:. Accesso root / amministratore è dato e verificato (dopo tutto, ho appena creato il DB con la stessa connessione, gli utenti creati, tavoli inserito e così via)

È stato utile?

Soluzione

non ho ancora testato, ma non sarà sorpreso dalla mysqli_multi_query() in attesa di avere lo stesso delimitatore di ogni query. Provare per imballare la creazione stored procedure in una singola query, senza utilizzare il modificatore DELIMITER?

Così, invece di

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

    ;
    END$$
    DELIMITER ;
');
?>

Basta fare questo

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

E dirci se funziona:)

Altri suggerimenti

Per riassumere:

DELIMITER è implementato sul lato client, non serverside.

Se si dispone di un driver bene o API, si può prendere cura di questo. PHP mysql / mysqli, a partire da ora, non farlo.

Se avete bisogno di usare un delimitatore diverso (ad esempio perché il delimitatore di default appare script all'interno), è necessario codificare / sfuggire SQL te o rompere in modo non c'è bisogno di cambiare il delimitatore. Nessun aiuto da PHP qui.

DELIMITER è qualcosa che l'applicazione client MySQL utilizza in realtà. Credo che l'applicazione client è responsabile per rompere le query che invia al Mysql. Questo è ciò che fa PHPMyAdmin, per esempio.

Invece di spendere una notte intera scrivendo uno script per analizzare MySQL in query, utilizzare il codice che ho scritto. Lo troverete nella funzione scriptToQueries, qui:

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

GODERE

EDIT: Dopo aver scritto questa risposta ho implementato il codice nella piattaforma Q libera in cui si può studiare il codice: https://github.com/EGreg/Platform/blob/master/platform/classes/Db/Mysql.php#L824

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top