Page 1 sur 3

problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 12:18
par luigi77270
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

Re: problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 12:23
par Saian
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.

Re: problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 12:30
par luigi77270
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

Re: problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 12:59
par Saian
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.

Re: problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 14:15
par luigi77270
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 ?

Re: problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 14:30
par luigi77270
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

Re: problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 14:36
par Saian
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.

Re: problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 14:41
par luigi77270
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

Re: problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 14:47
par tof73
<OPTION VALUE="0" <?php echo $row["available"] ? '' : 'selected="selected"'; ?>>Not Available</OPTION>

manque le ;

Re: problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 14:48
par Saian
<?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 */
} ?>

Re: problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 14:51
par Saian
@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'; ?>

Re: problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 14:58
par luigi77270
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 :/

Re: problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 14:58
par Saian
@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>';

Re: problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 15:01
par luigi77270
En effet j'ai déjà plus le message d'erreur là :)
Mais toujours aucune nouvelle de l'update :/

Re: problème variables/updates/ SELECT OPTION

Posté : 21 mai 2015, 15:02
par Saian
Pourrais je voir tes codes (complets) modifiés ?