Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 01-12-2010 15:42:37

probitaille
Membre
Lieu: Montréal
Date d'inscription: 20-04-2009
Messages: 336
Site web

Création de multiple table dans la même requête, est-ce possible ?

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:

Code:

$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é:

Code:

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 wink ?

Hors ligne

 

#2 01-12-2010 16:06:54

probitaille
Membre
Lieu: Montréal
Date d'inscription: 20-04-2009
Messages: 336
Site web

Re: Création de multiple table dans la même requête, est-ce possible ?

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:

Code:

 
//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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages