PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 13-05-2009 22:19:08

Sq78
Membre
Inscription : 13-05-2009
Messages : 47

[Résolu] Update groupé mysql

Bonsoir,
J'ai un petit souci pour mettre à jour une table mysql qui comprend 7 champs.
Voici le bout de code

 for ( $c=0; $c<7; $c++ ){
 if (isset($_POST['score'][$c]) && $_POST['score'][$c] != '') {
        $query="UPDATE matable SET prono = '".$_POST['score'][$c]."' WHERE id_match='".$_POST['id'][$c]."' AND login='".$_SESSION['login']."'";
        $result = mysql_query($query) or die('Erreur SQL !'.$sql.''.mysql_error());
 }

Ca fonctionne très bien si je modifie les 7 enregistrements.
Seulement, si je ne modifie pas tous les enregistrements, les modifications se font sur les premiers champs dans l'ordre des ID de ceux ci.
Par ex, si je modifie seulement les champs 3, 6 et 7, soit 3 champs seulement, les modifs se font sur 1 2 et 3...
Je comprends bien mon erreur mais je ne vois pas comment faire ma boucle.
Quelqu'un a une idée svp ?

Hors ligne

#2 13-05-2009 22:48:57

ManicoW
Cowrespondant
Lieu : Tours
Inscription : 08-05-2009
Messages : 192
Site Web

Re : [Résolu] Update groupé mysql

Bonsoir,

Je pense que pour répondre à cette question, il faudrait aussi l'extrait du formulaire correspondant, car selon comment il est fait, il peut y avoir un comportement différent pour cette boucle.


@+


la v2, c'est tabou, on en viendra tous a bout

Hors ligne

#3 15-05-2009 12:26:58

Sq78
Membre
Inscription : 13-05-2009
Messages : 47

Re : [Résolu] Update groupé mysql

Bonjour,
Je vais essayer d'être le plus clair possible. Mon formulaire utilise de l'ajax.
Voici un morceau du code

$i='1';
        echo "<select name='prono".$i."' id='prono".$i."' style='width: 140px' onchange='go_prono(this.id, \"liste".$i."\")'>";
        echo "<option value=''></option><option value='V1'>".$row['2']."</option><option value='V2'>".$row['4']."</option>";
        echo "</select>";
$i=$i+1;

La fonction js

function go_prono(prono, liste){
var xhr = getXhr();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
   leselect = xhr.responseText;
   document.getElementById(liste).innerHTML = leselect;
   }
}
 xhr.open("POST","scores.php",true);
 xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
 sel = document.getElementById(prono);
 choix = sel.options[sel.selectedIndex].value;
xhr.send("prono="+choix);
 }

et le fichier scores.php où sont prises les valeurs

<?php
  if ($_POST['prono'] == 'V1'){
    echo "<select name='score[]'>";
    echo "<option value='30'>3 / 0</option>";
    echo "<option value='31'>3 / 1</option>";
    echo "<option value='32'>3 / 2</option>";
  }else{
    echo "<select name='score[]'>";
    echo "<option value='03'>0 / 3</option>";
    echo "<option value='13'>1 / 3</option>";
    echo "<option value='23'>2 / 3</option>";
}
?>

Ensuite en gros, si la personne prend l'equipe recevante vainqueur, ajax propose 30, 31 ou 32. Dans le cas contraire, c'est 03, 13 et 23 qui sont proposés.
La personne a donc 7 mini listes déroulantes dynamiques proposées pour ses pronostics.
Tout ceci fonctionne très bien si la personne pronostique pour les 7 listes déroulantes puisque ma fameuse boucle (dans mon 1er msg de ce topic) fait une série de 7 update consécutifs.
Seulement où ca cloche, c'est si elle laisse des vides. Par ex, elle pronostique seulement sur les rencontres 1  4 et 7. L'update à cause de cette fichue boucle se fait sur les champs 1 2 et 3.
A noter que mon problème est identique sur un INSERT en cas de pronostic initial.
C'est donc là que je cherche une solution pour faire un update multiple en "omettant" des champs.
J'espère être assez clair dans mes explications et ne pas avoir trop surchargé le message de code.

Hors ligne

#4 15-05-2009 12:40:52

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [Résolu] Update groupé mysql

Saluton,
Je pense que la solution consiste à forcer toi-même l'indexation de score[XX] dans scores.php.
XX correspondant à l'identifiant de la rencontre.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#5 15-05-2009 13:17:34

ManicoW
Cowrespondant
Lieu : Tours
Inscription : 08-05-2009
Messages : 192
Site Web

Re : [Résolu] Update groupé mysql

Plop,

En effet, c'est ce que je soupsonnais aussi.

Pour mieux faire comprendre le problème de la non indexation manuelle, il faut ajouter un petit élément : lors de la soumission d'un formulaire tel que celui la, quand un champs n'est pas rempli, il n'est pas créé dans les paramètres POST.

Autrement dit, si la personne ne pronostique que 3 rencontres, cela ne créé que trois éléments POST score[], donc l'indexation faite par php est 1, 2, 3

Il faut donc faire l'indexation manuellement comme le conseil MK.

Au passage, je serai partisan de modifier également la boucle de parcours du resultat, pourquoi parcourir 7 éléments quand il n'y en a que 3 par exemple smile

Ca donnerai quelque chose comme :


foreach ( $_POST['score'] as $c => $cescore) {
   if (isset($cescore) && $cescore!= '') {
    $query="UPDATE matable SET prono = '".$cescore."' WHERE id_match='".$_POST['id'][$c]."' AND login='".$_SESSION['login']."'";
    $result = mysql_query($query) or die('Erreur SQL !'.$sql.''.mysql_error());
  }
}
 

Idéalement, si le XX indiqué par MK est directement l'id du match, il peut meme y avoir un id_match="'.$c.'" directement.

ATTENTION

Ce code n'est pas du tout sécurisé, et est un bon candidat pour une injection SQL. En effet, seul le fait que le score ne soit pas vide est vérifié, par du tout ce qu'il peut contenir. Si quelqu'un force manuellement un score à '; DELETE FROM matable --  (par exemple), ben la table est vide (et encore, il a été gentil, il n'a pas fait un drop sur la base de données). Le nom de la table n'est pas si dur a obtenir, il suffit de faire un score qui provoque une erreur de requete, et elle s'affichera vu le code.

Il est donc très important, comme toujours, de s'assurer que les valeurs passées a une requete mysql soient un minimum filtrées, surtout quand elles viennent de l'utilisateur (POST, GET). Une petit expression rationnelle (régulière pour ceux qui préférent) pour vérifier que les variables utilisées pour la requete mysql ne sont que des chiffres serait une bonne idée dans ce cas.

@+


la v2, c'est tabou, on en viendra tous a bout

Hors ligne

#6 27-05-2009 11:20:45

Sq78
Membre
Inscription : 13-05-2009
Messages : 47

Re : [Résolu] Update groupé mysql

Finalement j'ai entièrement revu mon code, très nettement simplifié et ça fonctionne du tonnerre

Hors ligne

Pied de page des forums