[RESOLU] problème variables/updates/ SELECT OPTION

Eléphanteau du PHP | 25 Messages

21 mai 2015, 12:18

Bonjour,

Je galère depuis une semaine sur un problème que je pense être tout bête mais je sais pas pourquoi, je ne trouve pas.

En gros, J'ai un formulaire qui affiche toute les données de la bdd, et à côté de chaque donnée j'ai mis un SELECT avec 2 option pour activé ou désactivé l'objet. Le bouton submit est bien relié à ma page d'action mais rien ne se passe. Et je n'ai aucun message d'erreur.

Avez-vous une solution ?
home.php :
<form action="update.php" method="POST" >
                            <?php
                                $select = 'SELECT * FROM cream';
                                $result = mysqli_query($connexion, $select) or die ('Erreur : '.mysql_error() );
                                $total = mysqli_num_rows($result);
 
                                    if($total) {
                                // debut du tableau
                                 
                                echo '<table border="1px solid black">'."\n";
                                // première ligne on affiche les titres prénom et surnom dans 2 colonnes
                                echo '<tr>';
                                echo '<td><b><u>ID</u></b></td>';
                                echo '<td><b><u>CREAM</u></b></td>';
                                echo '<td><b><u>AVAILABILITY</u></b></td>';
                                echo '</tr>'."\n";
                                // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.
                                    while($row = mysqli_fetch_array($result)) {
                                            // 0 = Not Available 1 = Available                 
                                            if ($row["available"] == 0) {
                                                $row["available"] = "Not Available";
                                                $row["availability"] = $row["available"];
                                                $row["available"] = 0;
                                            }
                                            else {
                                                $row["available"] = "Available";
                                                $row["availability"] = $row["available"];
                                                $row["available"] = 1;
                                            }
                                echo '<tr>';
                                echo '<td>'.$row["id"].'</td>';
                                echo '<td>'.$row["name"].'</td>';
                                echo '<td>
                                    <SELECT name="available">
                                        <OPTION VALUE="'.$row["available"].'">'.$row["availability"].'</OPTION>
                                        <OPTION VALUE="0">Not Available</OPTION>
                                        <OPTION VALUE="1">Available</OPTION>
                                    </SELECT>
                                    </td>';
                                echo '</tr>'."\n";
                                }
                                echo '</table>'."\n";
                                 
                                // fin du tableau.
                                }
 
                            ?>
                            <input type="submit" value="Apply" name="submit" />
                            </form>
update.php:
<?php
    session_start();
    include_once('../php/connexion.php');
 
        if(isset($_SESSION["userId"])){
        include('home.html');
    }
    else {
        header("location: connect.php");
    }
 
 
 
        if(isset($_POST["submit"])){
          $id = $_POST['id'];
          $name = $_POST['name'];
          $available = $_POST['available'];
 
          $query = "";
          $query = "UPDATE cream SET available ='".$available."' WHERE id = '".$id."' ";
          $result = mysqli_query($connexion, $query);
                }
?>
Merci à vous ! :D

Avatar du membre
Mammouth du PHP | 1609 Messages

21 mai 2015, 12:23

Salut, as tu essayé d'afficher la requête d'UPDATE pour vérifier qu'elle est bien écrite comme il faut et éventuellement la tester dans phpmyadmin ?

Il te manque un or die (mysql_error()); sur la requête d'UPDATE pour remonter l'erreur s'il y en a une.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

21 mai 2015, 12:30

Merci de ton aide,
La requête fonctionne bien quand je remplace les variables par des chiffres directement.
Sur un autre forum, on m'a dit que ça venait probablement du fait que j'ai plusieurs champs avec le même nom dû au While ( le champ name=available ).

Mais je sais pas comment réglé ça du tout :/

EDIT: J'ai rajouté le or die, et aucune erreur ne s'affiche

Avatar du membre
Mammouth du PHP | 1609 Messages

21 mai 2015, 12:59

Etrange, car je ne vois pas d'input name="id" ou d'input name="name", alors je ne vois pas comment $_POST['id'] et $_POST['name'] pourraient retourner quelque chose. Mais bon j'imagine qu'un update where id = '' ne provoque pas d'erreur.

Sinon $name = $_POST['name']; ne sert à rien étant donné que name n'ai pas utilisé.

Et effectivement il y a bien un problème où si tu as plusieurs lignes, tu as plusieurs fois un select name="available".

Pour rester simple, tu devrais faire un formulaire par ligne de tableau en n'oubliant pas un input type="hidden" name="id" pour pouvoir récupérer $_POST['id']. Chaque formulaire (ligne) disposant de son propre bouton submit.

Si tu veux un submit pour tout le tableau c'est en effet un tout petit peu plus compliqué et désolé mais je n'ai pas le temps ou la patience de t'expliquer cela maintenant.

EDIT
Et concernant ce code :
if ($row["available"] == 0) {
  $row["available"] = "Not Available";
  $row["availability"] = $row["available"];
  $row["available"] = 0;
}
else {
  $row["available"] = "Available";
  $row["availability"] = $row["available"];
  $row["available"] = 1;
}
Tu peux écrire plus simplement :
if ($row["available"] == 0) {
  $row["availability"] = "Not Available";
}
else {
  $row["availability"] = "Available";
}
Et pour le SELECT ça serait plutôt (et du coup le code précédent ne sert plus à rien) :
<SELECT name="available">
  <OPTION VALUE="0" <?php echo $row["available"] ? '' : 'selected="selected"' ?>>Not Available</OPTION>
  <OPTION VALUE="1" <?php echo $row["available"] ? 'selected="selected"' : '' ?>>Available</OPTION>
</SELECT>
L'attribut selected="selected" permettant de définir la ligne sélectionnée.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

21 mai 2015, 14:15

Merci pour ces lignes de codes

Quand tu dis un formulaire par ligne ça veut dire que pour chaque produits, je devrais refaire une requête sql ?

EDIT:
Et dans ce code:
<SELECT name="available">
  <OPTION VALUE="0" <?php echo $row["available"] ? '' : 'selected="selected"' ?>>Not Available</OPTION>
  <OPTION VALUE="1" <?php echo $row["available"] ? 'selected="selected"' : '' ?>>Available</OPTION>
</SELECT>
les ":" servent à quoi et pourquoi les guillemets j'ai l'impression que c'est le bordel ?

Eléphanteau du PHP | 25 Messages

21 mai 2015, 14:30

On ma conseillé ce code là:
<?php foreach($_POST['available'] as $k=>$v) {
  
echo $k .' => '.$v;
  
} ?>
Mais je n'y comprend rien non plus et je ne sais même pas quoi en faire

Avatar du membre
Mammouth du PHP | 1609 Messages

21 mai 2015, 14:36

Quand tu dis un formulaire par ligne ça veut dire que pour chaque produits, je devrais refaire une requête sql ?
Qu'entends tu par la ? le fichier update.php mettra à jour la ligne correspondante selon l'id fournie.
les ":" servent à quoi et pourquoi les guillemets j'ai l'impression que c'est le bordel ?
C'est un opérateur ternaire : condition ? si condition vraie : si condition fausse

Avec :
<?php echo $row["available"] ? '' : 'selected="selected"' ?>
Si $row['available'] est égal à 0 (soit condition false) ça écrira selected="selected" sinon ça n'écrira rien.

Avec :
<?php echo $row["available"] ? 'selected="selected"' : '' ?>
Si $row['available'] est égal à 1 (soit condition true) ça écrira selected="selected" sinon ça n'écrira rien.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

21 mai 2015, 14:41

Ha je ne connaissais pas les ":", merci :)

Sinon quand je remplace par ce que tu m'as donné avec les SELECT, j'ai un message d'erreur disant :
"Parse error: syntax error, unexpected '' : '' (T_CONSTANT_ENCAPSED_STRING), expecting ',' or ';' in..." on line où est
<OPTION VALUE="0" <?php echo $row["available"] ? '' : 'selected="selected"' ?>>Not Available</OPTION>
Par ailleur, j'ai fais ce que tu m'as dis, en mettant l'id dans l'echo en Hidden et j'ai mis un bouton submit a chaque ligne.
Mais toujours rien de nouveau

Mammouth du PHP | 688 Messages

21 mai 2015, 14:47

<OPTION VALUE="0" <?php echo $row["available"] ? '' : 'selected="selected"'; ?>>Not Available</OPTION>

manque le ;

Avatar du membre
Mammouth du PHP | 1609 Messages

21 mai 2015, 14:48

<?php foreach($_POST['available'] as $k=>$v) {
  
echo $k .' => '.$v;
  
} ?>
Pour que ce code puisse fonctionner il faudrait que les select name="available" soient déclarés en select name="available[]" afin que $_POST['available'] soit sous la forme d'un tableau.

Dans ton cas $_POST['available'] est un string et tu ne peux donc pas boucler dessus. La valeur qu'il contient est probablement la valeur du dernier select name="available" de ton formulaire.

Ceci dit, comme je te l'ai fait remarquer précédemment, ton formulaire ne contient pas d'input name="id" et donc le script update.php ne reçoit jamais aucun id et ne peux donc pas mettre la ou les lignes à jour.

Si tu tiens absolument à traiter toutes les lignes en un clic, il faut que tu déclares de la même manière que le select, input name="id[]" avec les crochés pour en faire un tableau.

Et dans la boucle de traitement tu pourras faire ceci :
<?php foreach($_POST['available'] as $index => $value) {
  $available = $value;
  $id = $_POST['id'][$index];
  /* écriture et exécution de la requête */
} ?>
Ca pourrait s'écrire plus simplement :
<?php foreach($_POST['available'] as $index => $available) {
  $id = $_POST['id'][$index];
  /* écriture et exécution de la requête */
} ?>
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1609 Messages

21 mai 2015, 14:51

@tof73, le ; est facultatif quand on ouvre les balises PHP pour exécuter une seule instruction.

Les 2 syntaxes suivantes fonctionnent :
<?php echo 'toto' ?>
<?php echo 'toto'; ?>
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

21 mai 2015, 14:58

Je ne cherche pas forcemment à ce qu'il y ai un seul bouton pour enregistrer le tout, je veux simplement que ça marche et que ce soit assez simple pour que je puisse comprendre ^^

J'ai mis les crochet dans le name="available[]" et le name="id[]" comme ça
et j'ai mis
foreach($_POST['available'] as $index => $available) {
			  $id = $_POST['id'][$index];
			  /* écriture et exécution de la requête */
			}
entre la déclaration de variable et la requête SQL d'update mais rien ne marche :/

Avatar du membre
Mammouth du PHP | 1609 Messages

21 mai 2015, 14:58

@luigi77270 en effet c'est normal pour la syntaxe error car j'ai écrit le code en considérant que j’injecte du PHP dans de l'HTML, or ce n'est pas le cas dans ton code.

Il faudrait l'écrire comme ceci :
echo '<td>
  <SELECT name="available[]">
      <OPTION VALUE="0"'.($row["available"] ? '' : ' selected="selected"').'>Not Available</OPTION>
      <OPTION VALUE="1"'.($row["available"] ? ' selected="selected"' : '').'>Available</OPTION>
  </SELECT>
  </td>';
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

21 mai 2015, 15:01

En effet j'ai déjà plus le message d'erreur là :)
Mais toujours aucune nouvelle de l'update :/

Avatar du membre
Mammouth du PHP | 1609 Messages

21 mai 2015, 15:02

Pourrais je voir tes codes (complets) modifiés ?
Développeur web depuis + de 20 ans