Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
Je suis coincé avec un truc qui pourtant, je croyais si simple est je suis même surpris de ne pas avoir rencontré ce problème plus tôt.
Mon application doit installé/désinstallé un module en créant 1 ou des tables dans la bases de donnés.
Voici comment je fais l'installation des champs SQL:
$db = Zend_Registry::get('db'); $sql = file_get_contents(dirname(__FILE__) . '/../config/install.sql'); $db->getConnection()->exec($sql);
Tout fonctionne sans problème sauf lorsque mon fichier install.sql comprend 2 commandes de création de table, donc 2 "create table":
Version simplifié:
CREATE TABLE IF NOT EXISTS `album` ( `idAlbum` int(11) NOT NULL AUTO_INCREMENT, `title_fr` varchar(80) NOT NULL, PRIMARY KEY (`idAlbum`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; CREATE TABLE IF NOT EXISTS `image` ( `idImage` int(11) NOT NULL AUTO_INCREMENT, `title_fr` varchar(80) DEFAULT NULL, `idAlbum` int(11) NOT NULL, PRIMARY KEY (`idImage`), KEY `fk_image_album1` (`idAlbum`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
Et ben là, tout bloque...impossible de créer dans la même requête 2 tables via PHP. Par contre, cette même requête "copier" en ligne de commande SQL fonctionne sans problème !
Je tiens à ce que le code sql soit dans un fichier à part. J'ai lu que la seulement serait de faire la création des tables en plusieurs étapes ce qui me demanderait de faire 1 fichier par table ? Et si mon module à 10 tables ? Ouch...
Au niveau de Zend, "$db->query" je crois que c'est tout simplement impossible de mettre plus qu'une requête dans le même "query"
Il y aurait pas une petite solution parmis vous qui pourrait m'aider ?
Hors ligne
Et bien ce n'était pas si simple que ça, en fait, la réponse est que c'est tout simplement impossible.
Mais pourtant ? Magento le fait lui ? Les modules aussi ont des fichiers SQL et ont plusieurs tables...
Et oui...et magento a justement contourner le problème et étendant la classe Zend_Db_Adapter_Pdo_Mysql pour ajouter des méthodes dont celle-ci qui divise le script SQL pour l'exécuter en plusieurs parties:
//class Varien_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Mysql ... public function multi_query($sql) { ##$result = $this->raw_query($sql); #$this->beginTransaction(); try { $stmts = $this->_splitMultiQuery($sql); $result = array(); foreach ($stmts as $stmt) { $result[] = $this->raw_query($stmt); } #$this->commit(); } catch (Exception $e) { #$this->rollback(); throw $e; } $this->resetDdlCache(); return $result; } /** * Split multi statement query * * @param $sql string * @return array */ protected function _splitMultiQuery($sql) { $parts = preg_split('#(;|\'|"|\\\\|//|--|\n|/\*|\*/)#', $sql, null, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); $q = false; $c = false; $stmts = array(); $s = ''; foreach ($parts as $i=>$part) { // strings if (($part==="'" || $part==='"') && ($i===0 || $parts[$i-1]!=='\\')) { if ($q===false) { $q = $part; } else if ($q===$part) { $q = false; } } // single line comments if (($part==='//' || $part==='--') && ($i===0 || $parts[$i-1]==="\n")) { $c = $part; } else if ($part==="\n" && ($c==='//' || $c==='--')) { $c = false; } // multi line comments if ($part==='/*' && $c===false) { $c = '/*'; } else if ($part==='*/' && $c==='/*') { $c = false; } // statements if ($part===';' && $q===false && $c===false) { if (trim($s)!=='') { $stmts[] = trim($s); $s = ''; } } else { $s .= $part; } } if (trim($s)!=='') { $stmts[] = trim($s); } return $stmts; }
Dernière modification par probitaille (01-12-2010 16:07:27)
Hors ligne
Pages: 1