3 Utilisateur(s) en ligne

Oltana.net 02 Décembre 2023 à 19:08:41 *
Bienvenue, Invité. Veuillez vous connecter ou vous inscrire.


Connexion avec identifiant et mot de passe
Nouvelles:
Bascule sur SMF faite!
 
 
Accueil Aide Rechercher
Pages: [1]   Bas de page
Imprimer
Auteur Fil de discussion: [Résolu][PHP] Enregistrement multichamps dans une table  (Lu 25762 fois)
0 Membres et 1 Invité sur ce fil de discussion.
Norore
Animateurs
****
Hors ligne Hors ligne

Sexe: Femme
Messages: 369



Voir le profil WWW
« le: 30 Avril 2008 à 09:30:38 »

Bonjour, bonjour ^^ ! Bon, comme, avec moi, un problème en programmation n'arrive jamais seul ( :ange !

Voici le script en question (côté administration, cela va sans dire :oO ! Autrement dit, si je note que l'on recrute 5 templiers noirs, cela va indiquer que l'on recrute 5 joueurs par classe 8| ...) : que la case soit cochée ou décochée, elle me renvoi toujours "checked", un ami m'a demandé si les checkbox ne renvoient pas plutôt une donné booléenne, je préférerais vérifier auprès d'experts en php avant de devenir complètement chauve :love !

Merci d'avance ;) !

Edit : le réel besoin réside dans le fait que nous avons récemment reçu nos premiers postulants et que nous allons donc avoir besoin d'indiquer à d'éventuels futurs postulants quelles sont leurs chances d'être acceptés dans la guilde ^^ !
Journalisée

Citation de: Secondat de Montesquieu
Je me croirais le plus heureux des mortels si je pouvais faire que les hommes puissent se passer de leur préjugé.
superjun
Posteur assidu
****
Hors ligne Hors ligne

Messages: 137



Voir le profil
« Répondre #1 le: 30 Avril 2008 à 11:13:20 »

Commenceons par le plus simple  :haha )

Donc :
Code:
WHERE `recru_class` LIKE "'.$i.'"'

Ce n'est peut-être pas le seul endroit où il y a cette erreur. Donc corrige ça et teste, voir si ça va mieux ;)
Journalisée


What isn't remembered never happened...
Norore
Animateurs
****
Hors ligne Hors ligne

Sexe: Femme
Messages: 369



Voir le profil WWW
« Répondre #2 le: 30 Avril 2008 à 13:52:10 »

Pour le UPDATE, au niveau du WHERE, tu en es sûr ? Ce n'est pas le premier UPDATE que j'utilise, dans d'autres scripts l'opérateur est un simple "=" et ceux-ci marchent parfaitement bien, j'ai donc du mal à comprendre pourquoi ça ne marcherai pas ici Clin d'oeil !
Journalisée

Citation de: Secondat de Montesquieu
Je me croirais le plus heureux des mortels si je pouvais faire que les hommes puissent se passer de leur préjugé.
superjun
Posteur assidu
****
Hors ligne Hors ligne

Messages: 137



Voir le profil
« Répondre #3 le: 30 Avril 2008 à 20:11:25 »

C'est peut-être effectivement moi qui me trompe, et il faudrait relire la doc pour en être sûr ^^
Mais logiquement, l'opérateur '=' est un opérateur qui assigne une valeur à quelque chose (J'ai dit logiquement, car presque partout en programmation, ou il me semble, c'est le cas). Lorsqu'on veut utiliser la comparaison homologue à un '=', on devrait utiliser '=='. Je sais qu'avec MySQL il faut utiliser 'LIKE' à la place.
Or, la clause WHERE est nécessairement (par définition) suivie d'une instruction comparative, ce qui voudrait dire qu'il faut utiliser 'LIKE' (ou autre opérateur de comparaison).
Et normalement, si tu opère une assignation et qu'elle réussi (je vois pas pourquoi ça ne serait pas le cas), ça renvoie une valeur booléenne TRUE.
Donc ça reviendrait à dire 'WHERE [l'assertion a été effectuée avec succès]', donc partout.

Je regarderai à nouveau ton code tantôt, pour essayer d'y déceler autre chose ^^
Journalisée


What isn't remembered never happened...
Patami
Administrateur
*****
Hors ligne Hors ligne

Messages: 599



Voir le profil WWW
« Répondre #4 le: 30 Avril 2008 à 22:03:07 »

salut

pas le temps de m'amuser sur le code, mais je confirme le fait qu'il ne faut qu'un seul " = " en SQL et MySQL pour effectuer une comparaison, tandis qu'il en faut deux avec php :)
Journalisée

Votre site 100% configurable en un tour de main, c'est désormais possible avec KwsPHP
Norore
Animateurs
****
Hors ligne Hors ligne

Sexe: Femme
Messages: 369



Voir le profil WWW
« Répondre #5 le: 30 Avril 2008 à 22:38:33 »

Citation de: "Patami"
pas le temps de m'amuser sur le code, mais je confirme le fait qu'il ne faut qu'un seul " = " en SQL et MySQL pour effectuer une comparaison, tandis qu'il en faut deux avec php :langue ! Merci Patami ^^ !
Journalisée

Citation de: Secondat de Montesquieu
Je me croirais le plus heureux des mortels si je pouvais faire que les hommes puissent se passer de leur préjugé.
superjun
Posteur assidu
****
Hors ligne Hors ligne

Messages: 137



Voir le profil
« Répondre #6 le: 01 Mai 2008 à 00:33:52 »

Au temps pour moi  Clin d'oeil

Normalement, ça devrait afficher 12 lignes avec les 12 requêtes effectuées. Ca permettra déjà d'y voir un peu plus clair. Si c'est pas le cas, tu peux executer séparément chaque requête à partir de PHPMyAdmin (ou autre) et étudier le résultat afin de déduire l'origine de l'erreur.

--Edit--

Ne serait-ce pas en fait simplement que pour chaque passage de la boucle, seule $i change ?
Je m'explique : La requête est effectuée pour toutes les valeurs de $i comprises entre 0 et 11, mais il n'y a rien dans la boucle qui modifie $nb et $open en fonction de $i, si bien que ces deux variables resteront identiques pour chaque valeur de $i, donc pour chaque MàJ de la BDD. (Typiquement, la méthode empirique décrite au-dessus aurait permis de mettre ce genre de problème en évidence ;) )
Journalisée


What isn't remembered never happened...
Norore
Animateurs
****
Hors ligne Hors ligne

Sexe: Femme
Messages: 369



Voir le profil WWW
« Répondre #7 le: 03 Mai 2008 à 15:06:46 »

En fait, il semblerait que le problème provienne clairement du formulaire :/ !

Citation
UPDATE `recrutement` SET `recru_nb`="0", `recru_open`="Y" WHERE `recru_class`="0"
UPDATE `recrutement` SET `recru_nb`="0", `recru_open`="Y" WHERE `recru_class`="1"
UPDATE `recrutement` SET `recru_nb`="0", `recru_open`="Y" WHERE `recru_class`="2"
UPDATE `recrutement` SET `recru_nb`="0", `recru_open`="Y" WHERE `recru_class`="3"
UPDATE `recrutement` SET `recru_nb`="0", `recru_open`="Y" WHERE `recru_class`="4"
UPDATE `recrutement` SET `recru_nb`="0", `recru_open`="Y" WHERE `recru_class`="5"
UPDATE `recrutement` SET `recru_nb`="0", `recru_open`="Y" WHERE `recru_class`="6"
UPDATE `recrutement` SET `recru_nb`="0", `recru_open`="Y" WHERE `recru_class`="7"
UPDATE `recrutement` SET `recru_nb`="0", `recru_open`="Y" WHERE `recru_class`="8"
UPDATE `recrutement` SET `recru_nb`="0", `recru_open`="Y" WHERE `recru_class`="9"
UPDATE `recrutement` SET `recru_nb`="0", `recru_open`="Y" WHERE `recru_class`="10"
UPDATE `recrutement` SET `recru_nb`="0", `recru_open`="Y" WHERE `recru_class`="11"

Mais là, j'en perds mon latin :ouin ...
Journalisée

Citation de: Secondat de Montesquieu
Je me croirais le plus heureux des mortels si je pouvais faire que les hommes puissent se passer de leur préjugé.
superjun
Posteur assidu
****
Hors ligne Hors ligne

Messages: 137



Voir le profil
« Répondre #8 le: 04 Mai 2008 à 02:43:28 »

Citation
// on a cliqué pour valider, on enregistre les données
if(isset($_POST['valider']))
{
$nb = clean($_POST['nb']);
if(isset($_POST['open'])){$open="Y";}else{$open="N";}
for($i = 0 ; $i < 12 ; $i++)
{
mysql_query('UPDATE `recrutement` SET `recru_nb`="'.$nb.'", `recru_open`="'.$open.'" WHERE `recru_class`="'.$i.'"') or die ("Impossible de modifier les donn&eacute;es dans la table `recrutement` !
" .mysql_error(). "
" .mysql_errno());
}

Dans cette partie du code, la valeur de $nb et de $open ne peuvent vraisemblablement pas changer en fonction de la classe qui a été sélectionnée dans le formulaire :
Un seul $nb et un seul $open sont récupérés pour toutes les classes, donc ces deux variables auront les mêmes valeurs pour chaque classe.
En fait, dans ton formulaire, tu as oublié de créer un tableau pour 'nb' (alors que tu l'as fais pour 'open'). Ainsi, le formulaire soumis ne pourra renvoyer qu'une seule valeur pour 'nb'.
Dans le cas de 'open', c'est du coté du traitement qu'il y a une erreur, puisque tu cherches à savoir si 'open' existe (isset($open)) alors qu'il l'est obligatoirement puisque c'est un tableau (à moins qu'il ne soit jamais coché). Donc la valeur de $open est 'Array'.
Pour finir, la fonction clean() que tu utilises assigne peut-être une valeur par défaut en cas d'erreur (qui serait, dans ce cas, 0). Mais comme je n'ai pas le code de la fonction, ce n'est peut-être pas le cas ;)

Voici le code corrigé :

Code:
<?php
/* page d'administration pour le recrutement */
// array pour les classes

// initialisation des classes
$classe = array(=> 'Assassin'
            
=> 'Barbare',
            
=> 'Chaman de l\'Ours',
            
=> 'Conqu&eacute;rant',
            
=> 'D&eacute;monologue',
            
=> 'Eclaireur',
            
=> 'Gardien',
            
=> 'H&eacute;rault de Xotli',
            
=> 'N&eacute;cromancien',
            
=> 'Pr&ecirc;tre de Mitra',
            
10 => 'Temp&ecirc;te de Set',
            
11 => 'Templier noir');

?>

<div id="milieu">
<h1>Modification de l'&eacute;tat du recrutement</h1>
<div class="contenu">
<?php
if(!isset($_POST['valider'&#93;))
{?>

<a href="admin.php?admin=admin" title="Retourner à la page d'administration.">Retour &agrave; la page d'administration.</a>
<form name="formulaire" method="POST" action="admin.php?admin=recrutement">
<?php
$selrecru 
mysql_query('SELECT * FROM `recrutement`') or die ("Impossible de s&ecaute;lectionner les donn&eacute;es concernant le recrutement&#46;<br />" &#46;mysql_error()&#46; "<br />" &#46;mysql_errno());
   
while($affrecru mysql_fetch_assoc($selrecru))
   {
   
extract($affrecru);
   
?>

   <p>
   <strong><?php echo $classe[$recru_class&#93; ;?> :</strong></em>&nbsp;<br />
   <em><strong>Nombre :</strong></em>&nbsp;<input type="text" class="submit" name="nb[<?php echo $recru_class;?>]" maxlength="2" value="<?php echo $recru_nb?>" /><br />
   <em>Ouvert :</em>&nbsp;<input type="checkbox" name="open[<?php echo $recru_class;?>]" value="Y" <?php if($recru_open=='Y'){echo 'checked';}?> />
   </p>
   <?php
   
}
?>

<input type="submit" class="submit" name="valider" value="Valider le recrutement." />
</form>
<?php
}
// on a cliqué pour valider, on enregistre les données
if(isset($_POST['valider'&#93;))
{
$nb clean($_POST['nb'&#93;);
for($i $i 12 $i++)
{
if(isset(
$_POST['open['&#46;$i&#46;'&#93;'&#93;)){$open="Y";}else{$open="N";}

mysql_query('UPDATE `recrutement` SET `recru_nb`="'&#46;$nb[$i&#93;&#46;'", `recru_open`="'&#46;$open&#46;'" WHERE `recru_class`="'&#46;$i&#46;'"') or die ("Impossible de modifier les donn&eacute;es dans la table `recrutement` !<br />" &#46;mysql_error()&#46; "<br />" &#46;mysql_errno());
}
?>

<p>L'&eacute;tat du recrutement a &eacute;t&eacute; modifi&eacute; avec succ&eacute;s.<br />
<a href="admin.php?admin=admin" title="Retourner à la page d'administration.">Retour &agrave; la page d'administration.</a><br />
<a href="admin.php?admin=recrutement" title="Retourner à la page de recrutement.">Retour &agrave; la page d'&eacute;tat du recrutement.</a></p>
<?
}
?>
</div>
</div>

J'ai enlevé le hidden de nom 'class' qui n'est apparemment pas repris dans le traitement (donc à priori inutile).
Il faut juste encore vérifier que la fonction clean() traite correctement les tableaux. Si ce n'est pas le cas, il faut la placer dans la boucle et utiliser
Code:
$nb[$i] = clean($_POST['nb['.$i.']']);
ou
$nb = clean($_POST['nb['.$i.']']);
qui nécessite alors la correction appropriée dans le texte de la requête

Si ça marche toujours pas, il faudrait tester les valeurs que te renvoie le formulaire par $_POST en utilisant ce petit code :

Code:
<pre>
<?php print_r($_POST); ?>
</pre>
Journalisée


What isn't remembered never happened...
Norore
Animateurs
****
Hors ligne Hors ligne

Sexe: Femme
Messages: 369



Voir le profil WWW
« Répondre #9 le: 04 Mai 2008 à 08:23:52 »

Merci, je vais regarder ça Clin d'oeil !). Pour ce qui est de te dire exactement leur fonctionnement respectif, il faudra que tu demandes au créateur de Connectix Board :? ...

Edit : ça me renvoit deux maginifiques erreurs (répétées 12 fois, de 0 à 11 chacune) :

Citation de: "SQL"
Notice: Undefined index: nb[0] in c:\documents and settings\divertissements\mes documents\création site web et +\sites_web\cocordia_aoc\admin\recrutement.php on line 51

Notice: Undefined index: open[0] in c:\documents and settings\divertissements\mes documents\création site web et +\sites_web\cocordia_aoc\admin\recrutement.php on line 52
Journalisée

Citation de: Secondat de Montesquieu
Je me croirais le plus heureux des mortels si je pouvais faire que les hommes puissent se passer de leur préjugé.
superjun
Posteur assidu
****
Hors ligne Hors ligne

Messages: 137



Voir le profil
« Répondre #10 le: 04 Mai 2008 à 14:20:27 »

Argh... j'ai dû me planter dans l'utilisation des tableaux de variables dans un formulaire...
Tu pourrais me dire la valeur de $_POST une fois que tu as envoyé le formulaire ?
Code:
<pre>
<?php print_r($_POST); ?>
</pre>
Et puis aussi me donner le code de la fonction clean() (il faut vérifier qu'elle gère les tableaux).

--Edit--

En fait, tu peux déjà essayer le code suivant, et si ça marche toujours pas, faire ce que je t'ai dis plus haut ;)

Code:
<?php
/* page d'administration pour le recrutement */
// array pour les classes

// initialisation des classes
$classe = array(=> 'Assassin'
            
=> 'Barbare',
            
=> 'Chaman de l\'Ours',
            
=> 'Conqu&eacute;rant',
            
=> 'D&eacute;monologue',
            
=> 'Eclaireur',
            
=> 'Gardien',
            
=> 'H&eacute;rault de Xotli',
            
=> 'N&eacute;cromancien',
            
=> 'Pr&ecirc;tre de Mitra',
            
10 => 'Temp&ecirc;te de Set',
            
11 => 'Templier noir');

?>

<div id="milieu">
<h1>Modification de l'&eacute;tat du recrutement</h1>
<div class="contenu">
<?php
if(!isset($_POST['valider'&#93;))
{?>

<a href="admin.php?admin=admin" title="Retourner à la page d'administration.">Retour &agrave; la page d'administration.</a>
<form name="formulaire" method="POST" action="admin.php?admin=recrutement">
<?php
$selrecru 
mysql_query('SELECT * FROM `recrutement`') or die ("Impossible de s&ecaute;lectionner les donn&eacute;es concernant le recrutement&#46;<br />" &#46;mysql_error()&#46; "<br />" &#46;mysql_errno());
   
while($affrecru mysql_fetch_assoc($selrecru))
   {
   
extract($affrecru);
   
?>

   <p>
   <strong><?php echo $classe[$recru_class&#93; ;?> :</strong></em>&nbsp;<br />
   <em><strong>Nombre :</strong></em>&nbsp;<input type="text" class="submit" name="nb[<?php echo $recru_class;?>]" maxlength="2" value="<?php echo $recru_nb?>" /><br />
   <em>Ouvert :</em>&nbsp;<input type="checkbox" name="open[<?php echo $recru_class;?>]" value="Y" <?php if($recru_open=='Y'){echo 'checked';}?> />
   </p>
   <?php
   
}
?>

<input type="submit" class="submit" name="valider" value="Valider le recrutement." />
</form>
<?php
}
// on a cliqué pour valider, on enregistre les données
if(isset($_POST['valider'&#93;))
{
for(
$i $i 12 $i++)
{
$nb clean($_POST['nb'&#93;[$i&#93;);
if(isset($_POST['open'&#93;[$i&#93;)){$open="Y";}else{$open="N";}

mysql_query('UPDATE `recrutement` SET `recru_nb`="'&#46;$nb&#46;'", `recru_open`="'&#46;$open&#46;'" WHERE `recru_class`="'&#46;$i&#46;'"') or die ("Impossible de modifier les donn&eacute;es dans la table `recrutement` !<br />" &#46;mysql_error()&#46; "<br />" &#46;mysql_errno());
}
?>

<p>L'&eacute;tat du recrutement a &eacute;t&eacute; modifi&eacute; avec succ&eacute;s.<br />
<a href="admin.php?admin=admin" title="Retourner à la page d'administration.">Retour &agrave; la page d'administration.</a><br />
<a href="admin.php?admin=recrutement" title="Retourner à la page de recrutement.">Retour &agrave; la page d'&eacute;tat du recrutement.</a></p>
<?
}
?>
</div>
</div>

J'ai remplacé $_POST['nb['.$i.']'] par $_POST['nb'][$i] (même chose pour 'open'), qui devrait normalement être correct, cette fois, et j'ai mis la fonction clean() directement dans la boucle, ce qui fait qu'on n'a plus besoin de vérifier si elle traite correctement les tableaux (mais ce serait quand même utile de savoir, pour la suite).
Journalisée


What isn't remembered never happened...
Norore
Animateurs
****
Hors ligne Hors ligne

Sexe: Femme
Messages: 369



Voir le profil WWW
« Répondre #11 le: 04 Mai 2008 à 14:48:04 »

Superjun ? Je t'adore ^^ ! C'est exactement ce qu'il faut :haha !

Edit : c'est tellement simple en plus que je ne sais pas pourquoi je n'y ai pas pensé moi-même... Ah si, j'ai des examens demain et après-demain, c'est pour ça :oO !
Journalisée

Citation de: Secondat de Montesquieu
Je me croirais le plus heureux des mortels si je pouvais faire que les hommes puissent se passer de leur préjugé.
Pages: [1]   Haut de page
Imprimer
 
Aller à:  

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines