2016-01-13 21 views
5

Ho un file schema SQL (con errore di sintassi), tra cui più query per database delle impostazioniDoctrine (DBAL) Gestione degli errori durante l'esecuzione di più query

example.sql

CREATE TABLE IF NOT EXISTS `example` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` text COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; 


CREATExxxxxxxxxx TABLE IF NOT EXISTS `example2` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` text COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; 

example.php

$sqlContent = file_get_contents("example.sql"); 
$stmt = $conn->prepare($sqlContent); 
$result = $stmt->execute(); 

metodo execute non genera alcuna eccezione anche che il mio SQL è i nCorreggere. la documentazione dice che restituisce false in caso di fallimento ma restituisce true.

Come devo fare la gestione delle eccezioni qui? Come posso verificare se la mia query ha un errore?

+1

Dottrina DBAL usa il m ysqli driver. Ho controllato l'ultimo codice e il DBAL dovrebbe generare un'eccezione quando la preparazione di mysqli restituisce false per gli errori di sintassi. Problema con il driver mysqli? http://www.doctrine-project.org/api/dbal/2.5/source-class-Doctrine.DBAL.Driver.Mysqli.MysqliStatement.html#83-102 –

+0

@MattS il problema non si trova nel DBAL di Doctrine, è in DOP. Ho aggiunto la mia risposta. – Neodan

risposta

0

Il problema non è presente in Doctrine DBAL ma in PDO. Se si modifica il conducente di mysqli (invece di pdo_mysql), quindi si otterrà un messaggio di errore simile a questo:

[Doctrine \ DBAL \ Exception \ SyntaxErrorException] Si è verificato
un'eccezione durante l'esecuzione 'CREATE TABLE SE NON ESISTE example (

`id` int(11) NOT NULL AUTO_INCREMENT,                                     
`name` text COLLATE utf8_unicode_ci NOT NULL,                                   
PRIMARY KEY (`id`)                                          ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

AUTO_INCREMENT = 1;
CREATExxxxxxxxxx TAVOLO SE NON ESISTE example2 (

`id` int(11) NOT NULL AUTO_INCREMENT,                                     
`name` text COLLATE utf8_unicode_ci NOT NULL,                                   
PRIMARY KEY (`id`)                                          ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

AUTO_INCREMENT = 1; ':
Si ha un errore nella sintassi SQL; controllare il manuale che corrisponde alla versione del server MySQL per la sintassi diritto di utilizzare vicino 'CREATExxxxxxxxxx TAVOLO SE NON ESISTE example2 (
id int (11) NOT AUTO_I NULL' at line 8

Se si utilizza DOP direttamente (non tramite Doctrine), poi anche non viene visualizzato un errore.

Se si vuole che funzioni correttamente, quindi è necessario disabilitare l'emulazione delle istruzioni preparate (set PDO::ATTR_EMULATE_PREPARES-0).