Problème de boucle Sqlite (php5 ZF)

Mammouth du PHP | 1029 Messages

26 nov. 2007, 16:07

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.
L'expérience est la somme de toutes nos erreurs.

Mammouth du PHP | 19672 Messages

26 nov. 2007, 17:12

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
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 4039 Messages

26 nov. 2007, 17:24

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).
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Mammouth du PHP | 1029 Messages

27 nov. 2007, 09:14

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
L'expérience est la somme de toutes nos erreurs.