2014-09-24 13 views
9

Ho creato uno script CLI PHP progettato per consentirmi di eseguire script di aggiornamento sul mio database. Lo script funziona come previsto, esegue i file di aggiornamento sequenziali, ripristina gli errori, ecc. Tuttavia, l'unica cosa che non riesco a fare correttamente è creare funzioni. Cosa mi manca?Problemi nella creazione di una funzione MySQL tramite PDO


Script

Ecco le basi di come funziona lo script:

$sql = file_get_contents($file); 
$sql = "USE `$database`;" . $sql; 
$stmt = $pdo->prepare($sql); 

try 
{ 
    $stmt->execute(); 

    if($stmt->errorCode() !== '00000') 
    { 
     throw new Exception("Error: Unable to run update $file\n" . print_r($stmt->errorInfo(), true)); 
    } 
} 
catch(Exception $ex) 
{ 
    $pdo->rollBack(); 
    echo "Error: Exception occured running update $file\n" . print_r($ex, true) . "\n"; 
    throw $ex; 
} 

SQL

Ed ecco un esempio delle porzioni funzione dei SQL co de:

DELIMITER ;; 
CREATE DEFINER=CURRENT_USER FUNCTION `uuid_from_bin`(b BINARY(16)) RETURNS char(36) CHARSET latin1 
    DETERMINISTIC 
BEGIN 
    DECLARE hex CHAR(32); 
    SET hex = HEX(b); 
    RETURN LOWER(CONCAT(LEFT(hex, 8), '-', MID(hex, 9,4), '-', MID(hex, 13,4), '-', MID(hex, 17,4), '-', RIGHT(hex, 12))); 
RETURN 1; 
END ;; 

Se faccio funzionare questo codice all'interno di MySQL Workbench viene eseguito come previsto. Quando lo eseguo attraverso il mio script usando PDO tutto tranne le funzioni vengono create e popolate. Non ottengo errori e senza eccezioni.


So Far ...

Ho provato a rimuovere il definitore, pensando che l'utente che è stato "CURRENT_USER" potrebbe essere 'user @ randomip' e l'utente nel sistema è definito come 'utente @%'.

Ho anche rimosso il definatore dall'SQL. Funziona ancora in MySQL Workbench, ma non in questo script.

Ho anche estratto le funzioni nel proprio SQL, lo stesso risultato.


Altri Info

MySQL 5.5.37-0ubuntu0.14.04.1

PHP 5.5

Quando mi collego con PDO non sto impostando la DB, dal momento che la lo script potrebbe aver bisogno di creare il database. Ma gli script sono aggiunti con una dichiarazione USE USE. Di nuovo tutte le altre istruzioni DDL funzionano.

L'utente ha tutto ma Concessione autorizzazioni per lo schema sulla base di un modello, specificamente CI_%


soluzione, aggiornamento DELIMITER

Aggiornato il codice per rimuovere il DELIMITER

#DELIMITER USED TO BE HERE 
CREATE DEFINER=CURRENT_USER FUNCTION `uuid_from_bin`(b BINARY(16)) RETURNS char(36) CHARSET latin1 
    DETERMINISTIC 
BEGIN 
    DECLARE hex CHAR(32); 
    SET hex = HEX(b); 
    RETURN LOWER(CONCAT(LEFT(hex, 8), '-', MID(hex, 9,4), '-', MID(hex, 13,4), '-', MID(hex, 17,4), '-', RIGHT(hex, 12))); 
RETURN 1; 
END; 
+0

Qual è il nome della stored procedure? Normalmente si chiamerebbe "CALL sp_nameOfStoredProc;" –

+0

Quali autorizzazioni si stanno collegando al DB con workbench e dal proprio codice PHP? Utenti diversi = set di autorizzazioni diversi. –

+0

@JayBlanchard Questo è un file con codice SQL che sta definendo una funzione, non una stored procedure. Una delle funzioni è elencata nella domanda. – Chris

risposta

7

Non è necessario utilizzare DELIMITER quando si invia una dichiarazione tramite un'API come PDO.

In effetti, si non utilizzare DELIMITER, perché non viene riconosciuto dal parser SQL del server. È riconosciuto solo nel client mysql.

+0

In realtà l'avevo provato prima senza successo, e immagino di allontanarmi dal problema e riprovare ho fatto qualcosa di diverso. Aggiornata la domanda con il codice risolto. Grazie. – Chris

Problemi correlati