Probleme avec une requete mysql.

Fermé
beren57 Messages postés 7 Date d'inscription jeudi 27 mars 2008 Statut Membre Dernière intervention 9 décembre 2009 - 9 janv. 2009 à 15:30
 toto - 12 janv. 2009 à 15:42
bonjour

je suis en train de faire une page web sur laquelle j'aimerais proposer un formulaire. Le nombre de champs de ce formulaire serait évolutif. J'ai d'ores et déjà réalisé toutes les pages qui me serviront a moi pour ajouter de nouvelles cases a ce formulaire. J'ai également fait en sorte qu'a chaque fois que je rajoute une case, j'en profite du même coup pour insérer un nouveau champ a un tableau mysql supposé recueillir les infos de ce fameux formulaire.

Jusqu'ici tout fonctionne très bien. Je récupère donc une page pleine de cases a remplir, ainsi qu'un tableau mysql comprenant autant de champs qu'il y a de cases a mon formulaire. J'essaie maintenant de valider ce formulaire et de permettre a mon tableau mysql de recuperer les informations du formulaire. Problème : comme je n'ai pas un nombre de cases dans le formulaire, ainsi que de champs dans le tableau, fixes et immuables, il faut que je réussisse a faire un haut de page avec une requête mysql changeante.

J'ai essayé, ca donne ça ($infos c'est un raccourci pour un $_session qui me donne toutes les infos sur l'utilisateur. Obj_joueur c'est mon tableau mysql. idprofil la premiere case d'obj_joueur qui va me permettre d'associer la liste des infos recueillies via mon formulaire a l'id de l'utilisateur.) :

___________________________________________________________________________
<?php
$id = $infos['UserID'];
$retour = mysql_query('SHOW COLUMNS FROM obj_joueur');
$fin = mysql_num_rows($retour);
$decompte = 0;
$checkid = mysql_query("SELECT * FROM obj_joueur WHERE idprofil = '.$id.'");
$joueur = mysql_num_rows($checkid);

echo "<?php if (";
while ($donnees = mysql_fetch_array($retour))
{
$decompte++;
if ($decompte != $fin)
{
echo "isset(\$_POST['" . $donnees[''] . "']) && ";
}
else if ($decompte == $fin)
{
echo "isset(\$_POST['" . $donnees[''] . "']))";
echo "{";
}
}

while ($donnees = mysql_fetch_array($retour))
{
echo "\$" . $donnees[''] . " = addslashes(\$_POST['" . $donnees[''] . "']);<br />";
}

echo "if (\$joueur == 0)";
echo "{";
echo "\$queryinsert=\"INSERT INTO obj_joueur VALUES(";
while ($donnees = mysql_fetch_array($retour))
{
echo "\'\" . \$" . $donnees[''] . " . \"\'";
}
echo ")\";";
echo "mysql_query(\$queryinsert);";
echo "}";

echo "else if (\$joueur == 1)";
echo "{";
echo "mysql_query(\"UPDATE obj_joueur SET ";
while ($donnees = mysql_fetch_array($retour))
{
echo $donnees[''] . "='\" . \$" . $donnees[''] . " . \"', ";
}
echo "WHERE idprofil='\" . \$_POST['idprofil'] . \"'\");";
echo "}";

echo "}";


echo "else";
echo "{";

echo "if (\$joueur == 1)";
echo "{";
echo "\$details = mysql_fetch_array(\$checkid);";
while ($donnees = mysql_fetch_array($retour))
{
echo "\$" . $donnees[''] . " = stripslashes(\$details['" . $donnees[''] . "']);";
}
echo "}";

echo "else if (\$joueur == 0)";
echo "{";
while ($donnees = mysql_fetch_array($retour))
{
echo "\$" . $donnees[''] . " = '0'";
}
echo "}";
echo "}";
echo "?>";
?>

________________________________________________________

et donc ensuite vient le formulaire proprement dit...

en voici la forme (ici, le tableau ressources est celui qui me sert, parmi d'autres, a inserer de nouvelles cases a mon formulaire) :

_________________________________________________________
<form method="post" action="objectifs.php">
<input type="hidden" name="idprofil" value="<?php echo $id?>" />

<fieldset>
<legend>
<H3 ID=obj_ressources>les ressources<BR />
<A HREF="#titre"><img src="images/retour.gif" alt="up" title="retour au titre de la page" /></A>
<A HREF="#valider"><img src="images/valider.gif" alt="ok" title="valider" /></A>
</H3>
</legend>

<?php
$retour = mysql_query('SELECT * FROM ressources WHERE groupe_ressource=\'1-de base\' ORDER BY ressource');
while ($donnees = mysql_fetch_array($retour))
{
?>
<label for="<?php echo $donnees['ressource']?>"><img src="images/<?php echo $donnees['image_ressource']?>" alt="X " title="<?php echo $donnees['ressource']?>" /><?php echo $donnees['ressource']?></label><input type="text" name="<?php echo $donnees['ressource']?>" id="<?php echo $donnees['ressource']?>" size="10" value="0" /><br class="finlabel" />
<?php
}
?>
</fieldset>

_________________________________________________

et ainsi de suite avec les différents groupes du tableau ressources, puis d'un second tableau nommé objets, puis d'un troisième nommé bâtiments et quêtes. En ce qui concerne l'apparition des différentes cases du formulaire, tout marche comme sur des roulettes.

deux problèmes se posent a moi :

d'une part je ne sais absolument pas quoi mettre dans $donnees[''], puisqu'il ne s'agit pas d'infos contenues dans un tableau et au dessus desquelles il y aurait un titre de colonne, mais il s'agit des titres de colonnes de mon tableau...
Quand je fais une requete mysql directement dans wamp en ecrivant "SHOW COLUMNS FROM obj_joueur", il me donne tous mes titres de colonne dans une colonne appelée "field". Seulement, j'ai essayé $donnees['field'], sans le moindre succès...

Deuxième souci : seul le premier while fonctionne. Les autres non, je ne sais pas du tout pourquoi...

Au final, quand je regarde le code source de ma page, ca me donne ceci (je rajoute des retours a la ligne sinon c'est illisible)

_______________________________________________________
<?php
if (isset($_POST['']) && isset($_POST['']) && isset($_POST['']))
{
if ($joueur == 0)
{
$queryinsert="INSERT INTO obj_joueur VALUES()";
mysql_query($queryinsert);
}
else if ($joueur == 1)
{
mysql_query("UPDATE obj_joueur SET WHERE idprofil='" . $_POST['idprofil'] . "'");
}
}
else
{
if ($joueur == 1)
{
$details = mysql_fetch_array($checkid);
}
else if ($joueur == 0)
{
}
}
?>

______________________________________________

et ce que j'aimerais avoir, c'est cela :

_________________________________________________
<?php
if (isset($_POST['champ1']) && isset($_POST['champ2']) && isset($_POST['champ3']))
{

$champ1 = addslashes($_POST['champ1']);
$champ2 = addslashes($_POST['champ2']);
$champ3 = addslashes($_POST['champ3']);

if ($joueur == 0)
{
$queryinsert="INSERT INTO obj_joueur VALUES('" . $champ1 . "', '" . $champ2 . "', '" . $champ3 . "',);
mysql_query($queryinsert);
}
else if ($joueur == 1)
{
mysql_query("UPDATE obj_joueur SET champ1='" . $champ1 . "', '" . $champ2 . "', '" . $champ3 . "' WHERE idprofil='" . $_POST['idprofil'] . "'");
}
}
else
{
if ($joueur == 1)
{
$details = mysql_fetch_array($checkid);
$champ1 = stripslashes($details['champ1']);
$champ2 = stripslashes($details['champ2']);
$champ3 = stripslashes($details['champ3']);
}
else if ($joueur == 0)
{
$champ1 = '0'
$champ2 = '0'
$champ3 = '0'
}
}
?>

_____________________________________________

voila. En gros, il manque tout ce qui est contenu dans les while, sauf le premier, et dans le premier il manque tous les noms des colonnes de mon tableau. Et je ne vois pas tellement comment faire autrement pour pouvoir rajouter un champ4, un champ5, et ainsi de suite, autant que je veux, chaque fois que j'en rajoute un dans mon formulaire, sans avoir a tout faire a la main a chaque fois...

Si l'un d'entre vous pouvait m'aider a comprendre quoi faire pour que ca marche, je serais super heureux et reconnaissant et tout et tout...

10 réponses

pitxu Messages postés 689 Date d'inscription vendredi 7 septembre 2007 Statut Membre Dernière intervention 25 mars 2015 94
9 janv. 2009 à 17:06
bonjour,

la commande SQL "INSERT TO" nécessite d'avoir autant de valeurs qu'il existe de champs dans la table, donc c'est impossible à moins de créer une nouvelle table en fonction du nombre de champs.
0
beren57 Messages postés 7 Date d'inscription jeudi 27 mars 2008 Statut Membre Dernière intervention 9 décembre 2009
9 janv. 2009 à 17:36
d'ou mes while qui devraient avoir pour effet de faire une boucle dans laquelle viennent s'insérer les différents noms de champ de ma table... Je pense que ça peut marcher j'ai juste comme souci que je ne sais pas comment faire un while en prenant comme base le nom des champs de la table plutôt que ce qu'elle contient...
0
Bonjour

"SHOW COLUMNS FROM obj_joueur", il me donne tous mes titres de colonne dans une colonne appelée "field". Seulement, j'ai essayé $donnees['field']

Pour ce point là, il y a la fonction mysql_list_fields qui devrait t'aider
0
Deuxième souci : seul le premier while fonctionne. Les autres non, je ne sais pas du tout pourquoi...
Quand tu as fini ton premier while ($donnees = mysql_fetch_array($retour)) , tu as parcouru toute la ressource $retour. Les autres mysql_fetch_array($retour) te rendront toujours FALSE, donc tu n'entres dans aucun des autres while. Pour revenir au début de ta resource, il faut faire mysql_data_seek ( $retour,0 ); avant chaque nouveau while.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
beren57 Messages postés 7 Date d'inscription jeudi 27 mars 2008 Statut Membre Dernière intervention 9 décembre 2009
11 janv. 2009 à 00:44
merci grandement pour ta réponse. Par contre j'ai tenté la chose et ça me met un tas d'erreurs, toutes liées au fait que désormais $retour n'est plus une requête mysql qui peut être traitée en array ou dont on peut compter le nombre d'entrées. Comment puis-je traiter le problème et faire en sorte que cette requête particulière soit traitée comme un array banal ?
0
ça me met un tas d'erreurs, . Quand on de mande de l'aide sur une erreur, il faut TOUJOURS mettre le message d'erreur. C'est l'information la plus utile.

désormais $retour n'est plus une requête mysql qui peut être traitée en array
Je crois que tu mélanges pas mal de choses. Ta variable $retour contient le résultat d'une requête, c'est une ressource. Or une ressource, une requête et un array sont trois choses différentes : ta variable $retour n'a jamais été ni une requête, ni un array.
Requête désigne la commande qui est passée au gestionnaire de base de données, sous forme de chaîne de caractères. "SELECT * FROM `matable`" est une requête. On appelle souvent aussi 'requête' l'appel à la fonction qui soumet la requête (la ligne mysql_query(..))
ressource est un type de données, disons un objet, assez général en PHP. Son contenu exact dépend de la fonction qui l'a créée. Mysql_query rend false s'il y a un problème et une ressource s'il n'y en a pas. Cette ressource N'EST PAS un array. On n'a pas directement accès au contenu de cette ressource, il faut en parcourir les lignes une par une grâce à la fonction mysql_fetch_array (dans un while bien souvent). mysql_fetch_array, elle, rend bien un array dont les indices sont les noms des champs (ou FALSE quand on est rendu à la fin de la ressource). mysql_data_seek te permet de revenir au début de la ressource si tu veux la parcourir une autre fois.

dont on peut compter le nombre d'entrées. Si. Il y a la fonction mysql_num_rows qui te donne le nombre de lignes de réponses à ta requête.
0
beren57 Messages postés 7 Date d'inscription jeudi 27 mars 2008 Statut Membre Dernière intervention 9 décembre 2009
11 janv. 2009 à 13:29
bon pour être plus clair : si j'ajoute simplement les mysql_data_seek qui manquaient, j'obtiens tout ce que je voulais, sauf que ce qui dans mon code est indiqué par $donnees[''], a savoir ce qui devrait contenir les noms de champ de mon tableau, est toujours aussi vide.

Au niveau des while, le problème est donc résolu. Je passe a la requête mysql qui foirait, je la change donc en mysql_list_fields. J'ai donc comme code :

_________________________________________
$liste = mysql_query('SELECT * FROM obj_joueur');
$retour = mysql_list_fields($liste);
_________________________________________

a la place de :

_________________________________________
$retour = mysql_query('SHOW COLUMNS FROM obj_joueur');
_________________________________________

et voila ce que j'obtiens :

Warning: Wrong parameter count for mysql_list_fields() in C:\wamp\www\650km\objectifs.php on line 48

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\wamp\www\650km\objectifs.php on line 49
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\wamp\www\650km\objectifs.php on line 55

Warning: mysql_data_seek(): supplied argument is not a valid MySQL result resource in C:\wamp\www\650km\objectifs.php on line 69

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\wamp\www\650km\objectifs.php on line 70
if ($joueur == 0){$queryinsert="INSERT INTO obj_joueur VALUES(
Warning: mysql_data_seek(): supplied argument is not a valid MySQL result resource in C:\wamp\www\650km\objectifs.php on line 78

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\wamp\www\650km\objectifs.php on line 79
)";mysql_query($queryinsert);}else if ($joueur == 1){mysql_query("UPDATE obj_joueur SET
Warning: mysql_data_seek(): supplied argument is not a valid MySQL result resource in C:\wamp\www\650km\objectifs.php on line 90

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\wamp\www\650km\objectifs.php on line 91
WHERE idprofil='" . $_POST['idprofil'] . "'");}}else{if ($joueur == 1){$details = mysql_fetch_array($checkid);
Warning: mysql_data_seek(): supplied argument is not a valid MySQL result resource in C:\wamp\www\650km\objectifs.php on line 107

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\wamp\www\650km\objectifs.php on line 108
}else if ($joueur == 0){
Warning: mysql_data_seek(): supplied argument is not a valid MySQL result resource in C:\wamp\www\650km\objectifs.php on line 116

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\wamp\www\650km\objectifs.php on line 117
}}?>


La ligne 48, dans mon code, correspond a mon $retour. Et toutes les autres lignes ou il est indiqué qu'il y a une erreur sont celles qui se rapportent a la fonction $retour. Je me suis dit que j'avais du faire une erreur dans la syntaxe de ma requête. J'ai donc cherché sur internet ce que je pouvais trouver sur cette requête et la facon de l'utiliser. J'ai trouvé ça :

http://www.manuelphp.com/php/function.mysql-list-fields.php

on y indique que la fonction list_fields est obsolète et qu'on lui préfère SHOW COLUMNS FROM table [LIKE 'name']

j'ai essayé de revenir a ma première version et de mettre

________________________________________________
$retour = mysql_query('SHOW COLUMNS FROM obj_joueur LIKE $donnees');
________________________________________________

même résultat... J'ai les mêmes erreurs, aux mêmes endroits. A l'exception d'une : la toute première, wrong parameter... Elle n'apparait plus. En dehors de celle-ci, tout le reste est identique. Et l'erreur est toujours la même : je ne peux pas faire de mysql_num_rows a partir de $retour, et je ne peux pas faire non plus de mysql_fetch_array, ni de mysql_data_seek. Ce que me renvoie la fonction $retour ne peut pas être utilisé de cette manière.
0
La fonction mysql_field_list a besoin de plusieurs arguments, il faut lire le mode d'emploi avant de l'utiliser. Mais tu as raison, elle est obsolète alors autant l'oublier. Il vaut effectivement mieux utiliser mysql_query ('SHOW COLUMS FROM `unetable`')
Ça ne change rien au reste du problème. Le mysql_query te rend une ressource et une ressource n'est pas un tableau. C'est la base même de l'utilisation de mysql (et d'autres bases de données, d'ailleurs) en PHP.
Si tu veux obtenir un tableau qui contient le nom des champs, il suffit de balayer une fois le résultat $retour de ta requête SHOW COLUMNS FROM :
$champs=array();
while ($unchamp=mysql_fetch_array($retour)) $champs[]=$unchamp['Field'];
Et voilà ! tes noms de champs sont dans le tableau $champs
0
beren57 Messages postés 7 Date d'inscription jeudi 27 mars 2008 Statut Membre Dernière intervention 9 décembre 2009
12 janv. 2009 à 15:37
merci a toi pour ton aide et ta patience. Ca marche maintenant.
0
Youppie !
Bonne continuation.
0