Page 1 sur 1

Problème de boucle Sqlite (php5 ZF)

Posté : 26 nov. 2007, 16:07
par Maitrepylos
Bonjour, je crée un base sqlite en mémoire, mais je n'arrive qu'a inséré une seule entrée dans cette base.

Voici le code

		$table = 'CREATE TABLE foo (nombase varchar(255),developpement varchar(255),integration varchar(255),';
		$table.= 'acceptance varchar(255), production varchar(255),reference varchar(255), rdc varchar(255),formation varchar(255))';

		$sqlite = sqlite_open(":memory:", 0777, $sqliteerror);
		sqlite_query($sqlite,$table);



		$count = count($this->nom_base);

		for ($i = 0; $i < $count; $i++)
		{
			$nom = $this->nom_base[$i]['T_NAME'];
			sqlite_query($sqlite,"INSERT INTO foo VALUES ('$nom','','','','','','','')");

		}


J'ai fais un tas de vérification et je confirme que dans this->nom_base, j'ai bien un tableau.

de même si je multiplie les lignes suivantes
sqlite_query($sqlite,"INSERT INTO foo VALUES ('toto','','','','','','','')");
sqlite_query($sqlite,"INSERT INTO foo VALUES ('coco','','','','','','','')");
sqlite_query($sqlite,"INSERT INTO foo VALUES ('toutou','','','','','','','')");
sqlite_query($sqlite,"INSERT INTO foo VALUES ('Moman','','','','','','','')");
Je n'arrive qu'a insérer la première ligne, les autres ne sont pas prise en compte, et je n'ai aucun message d'erreur.

Merci de votre aide.

Posté : 26 nov. 2007, 17:12
par Cyrano
J'ignore ce qui cloche, je viens de faire un test en local. Ne disposant pas de l'objet, j'ai recréé un tableau pour les données et à peine repris le code histoire de le lire plus facilement, ça donne ceci :
<?php
$table = 'CREATE TABLE foo ('.
         '    nombase varchar(255),'.
         '    developpement varchar(255),'.
         '    integration varchar(255),'.
         '    acceptance varchar(255), '.
         '    production varchar(255),'.
         '    reference varchar(255), '.
         '    rdc varchar(255),'.
         '    formation varchar(255)'.
         ')';

$sqlite = sqlite_open(":memory:", 0777, $sqliteerror);
sqlite_query($sqlite, $table);

$nom_base = array();
$nom_base[0] = array('T_NAME' => 'toto');
$nom_base[1] = array('T_NAME' => 'coco');
$nom_base[2] = array('T_NAME' => 'babar');
$nom_base[3] = array('T_NAME' => 'test');
$count = count($nom_base);

for ($i = 0; $i < $count; $i++)
{
    $sql = "INSERT INTO foo VALUES ('". $nom_base[$i]['T_NAME'] ."','','','','','','','')";
    sqlite_query($sql, $sqlite);
}
/* Test de vérification du contenu enregistré... */
$sql2 = "SELECT * FROM foo";
$rs = sqlite_query($sqlite, $sql2);
$resultat = sqlite_fetch_all($rs, SQLITE_ASSOC);
foreach ($resultat as $ligne)
{
    echo("<pre>\n");
    var_dump($ligne);
    echo("</pre>\n");
}
?>
Le résultat est satisfaisant et j'obtiens bien les quatre lignes insérées. Vérifie bien la structure de ton tableau en entrée, le bobo est peut-être là :-k

Posté : 26 nov. 2007, 17:24
par Berzemus
Pour des inserts et des updates, des requêtes pour lesquelles aucune réponse n'est attendue, c'est mieux d'utiliser sqlite_exec.

Le mieux, si tu en as quelques-uns, c'est de la faire de façon transactionelle:

sqlite_exec($handle,"BEGIN;");
sqlite_exec($handle,"INSERT...");
etc...

sqlite_exec($handle,"END;");

Ainsi, il n'effectuera les opérations qu'a la fin de la transaction, ce qui permet de gagner beaucoup de temps (pour plusieurs centaines de requêtes).

Posté : 27 nov. 2007, 09:14
par Maitrepylos
Je ne sais où étais l'erreur, mais avec votre code cela fonctionne nickel, d'autant que j'utilise déjà sqlite dans un autre controller et que cela fonctionnais nickel.

Encore merci à vous deux. :P