Page 1 sur 5

URGENT ECOLE : Insertion MySQL dans une boucle FOR (php)

Posté : 01 mai 2005, 11:47
par cyberappz
Bonjour,

j'aimerais effectuer une requête d'insertion MySQL dans une boucle for (php).
La requête ne s'éxecute qu'une fois alors que si je fais un echo sur elle,
il m'affiche bien ce qu'il...devrait...insérer.

INSERT INTO `nombres_premiers` (`colonne1`,`colonne2`,`colonne3`) VALUES ('2', '0', '0');
INSERT INTO `nombres_premiers` (`colonne1`,`colonne2`,`colonne3`) VALUES ('3', '0', '0');
INSERT INTO `nombres_premiers` (`colonne1`,`colonne2`,`colonne3`) VALUES ('5', '0', '0');
INSERT INTO `nombres_premiers` (`colonne1`,`colonne2`,`colonne3`) VALUES ('7', '0', '0');
INSERT INTO `nombres_premiers` (`colonne1`,`colonne2`,`colonne3`) VALUES ('11', '0', '0');
... jusqu'a 97.


Voici la boucle:

for($i = 2; $i <= 97; $i++) {

$j = 2;

// calcul de la racine de $i
$k = sqrt($i);

while(($i%$j) && $j < $k) {
$j++;
}

if($j > $k) { (dans cette partie le problème)
-->$requete = "INSERT INTO `nombres_premiers` (`colonne1`,`colonne2`,`colonne3`) VALUES ('$i', '0', '0');";

// Affichage de ce qui devrait s'insérer dans la base mais qui ne veut pas !
echo '<br>'.$requete;

$execution = mysql_db_query("nombres1ers", $requete)
or die ("<br>Erreur d'insertion MySQL.");
}

}

Seul "INSERT INTO `nombres_premiers` (`colonne1`,`colonne2`,`colonne3`) VALUES ('2', '0', '0');" est éxecuté. :(

S'il vous plait, aidez-moi car c'est pour l'ecole pour demain (lundi 2 mai).
Un immense merci d'avance. :lol:

Posté : 01 mai 2005, 12:01
par Cyrano
Tu utilises une fonction un peu obsolète d'exécution avec mysql_db_query() qui peut être remplacée par mysql_query()

D'autre part, je ne comprends pas le modulo que tu fais dans le while : ($i%$j)
Est-ce que ce ne devrait pas être : ($i%$j == ?qqch?)
Si cette condition n'est remplie qu'au premier tour de boucle, au tour suivant, $j n'est pas incrémenté et du coup, la condition dans le if() suivant n'est plus remplie.... donc pas d'insertion.

:-)

Posté : 01 mai 2005, 12:48
par cyberappz
Voilà, pour mysql_db_query, j'ai remplacé par mysql_query et fais un mysql_select_db avant. :-)

Pour le while, en fait il s'agit de vérifier si $i (de 2 à 97 donc) est divisble par $j (qui vaut 2) ET si $j (2) est bien plus petit que $k (racine carré de $i (2->97)). Apparemment, c'est OK pcq sinon, le "echo" ne serait pas se faire non? Hors il m'affiche bien toutes les commandes qu'il devrait exécuter...

INSERT INTO `nombres_premiers` (`colonne1`,`colonne2`,`colonne3`) VALUES ('2', '0', '0');
INSERT INTO `nombres_premiers` (`colonne1`,`colonne2`,`colonne3`) VALUES ('3', '0', '0');
INSERT INTO `nombres_premiers` (`colonne1`,`colonne2`,`colonne3`) VALUES ('5', '0', '0');
INSERT INTO `nombres_premiers` (`colonne1`,`colonne2`,`colonne3`) VALUES ('7', '0', '0');
INSERT INTO `nombres_premiers` (`colonne1`,`colonne2`,`colonne3`) VALUES ('11', '0', '0');
INSERT INTO `nombres_premiers` (`colonne1`,`colonne2`,`colonne3`) VALUES ('13', '0', '0');

etc.

Mais c'est à l'insertion que ça ne marche pas. On dirait que mysql_query ne veut pas prendre $i alors que "echo" l'accepte... C'est bizarre.
J'ai cru comprendre sur le net qu'il y avait moyen en utilisant des variables dynamiques (assez rare mais parfois utile), est-ce vrai? Sinon, comment faire?

Merci vraiment de m'aider car c'est la fin de l'année et sans cette exercice qui est presque fini (y a que l'insertion qui foire :'(), je risque de rater mon module (baccalauréat informatique).

Posté : 01 mai 2005, 12:56
par Cyrano
Essaye quelque chose :
- ré-écris la ligne de requête en séparant convenablement le SQL du PHP comme ceci :
$requete = "INSERT INTO `nombres_premiers` (`colonne1`,`colonne2`,`colonne3`) VALUES (". $i .", 0, 0);";
Attention, tes valeurs insérées étant des entiers, il est inutile de les encadrer d'apostrophes;
- Au lieu de tenter l'insertion dans l'immédiat, fais afficher avec un echo($requete) dans la boucle toutes les requêtes générées: Si il ne s'en affiche qu'un seule, le problème ne vient pas de ta connexion mais du traitement préliminaire.

Vala

Posté : 01 mai 2005, 13:12
par cyberappz
:D Merci vraiment de ton aide tout d'abord!

J'ai maintenant mis la requête sans apostrophes et en séparant le php du mysql:

$requete = "INSERT INTO `nombres_premiers` (colonne1,colonne2,colonne3) VALUES (". $i .", 0, 0);";

et echo "<br>"; echo($requete);

me donne tout les numéros premiers (divisibles seulement par lui-même et par 1) avec les commandes insert into:

INSERT INTO `nombres_premiers` (colonne1,colonne2,colonne3) VALUES (2, 0, 0);
INSERT INTO `nombres_premiers` (colonne1,colonne2,colonne3) VALUES (3, 0, 0);
INSERT INTO `nombres_premiers` (colonne1,colonne2,colonne3) VALUES (5, 0, 0);
INSERT INTO `nombres_premiers` (colonne1,colonne2,colonne3) VALUES (7, 0, 0);
INSERT INTO `nombres_premiers` (colonne1,colonne2,colonne3) VALUES (11, 0, 0);
INSERT INTO `nombres_premiers` (colonne1,colonne2,colonne3) VALUES (13, 0, 0);

Je comprends plus :'( Pourquoi l'écho sur la requête m'affiche bien la commande et mysql_query ne veut prendre que la première?

Un très très grand merci d'avance. :oops:

Posté : 01 mai 2005, 13:15
par cyberappz
Peut-être ca va trop vite pour lui alors qu'echo lui s'est faire des actions plus rapidement? Faudrait pas mettre une time entre les requêtes de la boucle sinon mysql_query ne suit plus?

Posté : 01 mai 2005, 13:22
par Cyrano
Sais pas trop, on va tester: remplace la ligne d'exécutionactuelle par :
        $execution = mysql_query("nombres1ers", $requete);
        if(!$execution)
        {
            echo("<p>Erreur lors de l'insertion : Erreur numéro ". mysql_errno() ."<br>\nDescription de l'erreur : ". mysql_error() ."</p>\n");
        }
Et dis moi ce que ça donne.

Posté : 01 mai 2005, 13:30
par cyberappz
Pas con du tout !

Voilà le résultat (fois beaucoup) :

Erreur lors de l'insertion : Erreur numéro 1062
Description de l'erreur : Duplicate entry '0' for key 1

Peut-être pcq je n'ai pas mis de colonne id avec une incrémentation automatique? (ou peut-être que je suis complètement à côté de la plaque lol).

Thanks you very muchhh. :roll: :lol:

Posté : 01 mai 2005, 13:32
par cyberappz
PS: Par contre c'est soit :

séléction de la base +
$execution = mysql_query($requete);

ou

$execution = mysql_db_query("nombres1ers", $requete);

mais pas

$execution = mysql_query("nombres1ers", $requete);
(sinon erreur)

Posté : 01 mai 2005, 13:36
par Cyrano
La sélection de la base doit être faite avant la boucle for;

Pour l'erreur affichée, ça veut dire que tu as une clé UNIQUE sur la colonne de ta table et comme tu envoies une nouvelle fois la même valeur, il te jette.

Posté : 01 mai 2005, 13:44
par cyberappz
Pour la séléction de la base, oui dans le cas là, elle doit bien sûr être effectuée avant la boucle (comme chez moi).

Ah ouais ok. Voilà la création de la table ($tablename est déclaré plus haut (=nombres_premiers)) :

Code : Tout sélectionner

$createtable="CREATE TABLE IF NOT EXISTS `$tablename` ( `colonne1` VARCHAR(50) NOT NULL, `colonne2` VARCHAR(50) NOT NULL, `colonne3` VARCHAR(50) NOT NULL, PRIMARY KEY (`colonne3`) );"; $createtableresult=mysql_query($createtable) or die ("<br>Creation could not be executed."); echo "<br>The table \"$tablename\" has been created successfully (if it not exist already).";
J'ai essayé en enlevant la ligne PRIMARY KEY mais alors j'ai le message "Creation could not be executed. Une idée? :) Enfin, ca s'éclaircit, vive l'entraideeeeeee. :lol: Jusqu'à 3h du mat' hier ! Lol.

Posté : 01 mai 2005, 13:47
par cyberappz
J'ai essayé aussi en laissant la ligne primary key mais en mettant :

$requete = "INSERT INTO `$tablename` (colonne1,colonne2) VALUES (". $i .", 0);";

à la place pour la requête. J'ai le message d'erreur de ta commande (description de l'erreur, etc).

Posté : 01 mai 2005, 13:56
par Cyrano
Tu peux très bien laisser la primary key là où elle est mais ce que tu peux faire, c'est la mettre en auto_increment et tu n'y envoies pas de valeur du tout lors de l'insertion, raccourcis la requête en supprimant toute référence à cette colonne et ça devrait fonctionner.

CECI DIT , avant d'aller plus loin : des colonnes en VARCHAR(50) pour mettre des entiers, c'est pas terrible:
essaye comme ceci :
 $createtable = "CREATE TABLE `". $tablename ."` ("
        . " `colonne_1` INT NOT NULL, "
        . " `colonne_2` INT NOT NULL, "
        . " `colonne_3` INT NOT NULL AUTO_INCREMENT,"
        . " PRIMARY KEY (`colonne_3`)"
        . " )"
        . " TYPE = myisam";

Posté : 01 mai 2005, 14:02
par cyberappz
Ca marche !!!!!!!!!!!!!!!!!!!!!!!!!
J'ai mis au final 2 colonnes avec:

la 1ère : incrémenté automatiquement
la 2ème : prend les valeurs des nombres premiers

Comment je peux te remercier??????!!!!
Merci pour tout et vive php france!

Posté : 01 mai 2005, 14:17
par Cyrano
Pas de quoi, un jour, si tu continues à venir régulièrement, c'est toi qui aura une réponse pour un plus débutant ;)

Bon code :)