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