PHP- modification table MYSQL

Fermé
desesphp Messages postés 9 Date d'inscription mardi 17 novembre 2009 Statut Membre Dernière intervention 24 novembre 2009 - 18 nov. 2009 à 17:56
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 - 24 nov. 2009 à 16:41
Bonjour,
Débutant en php, je tente de créer un panier virtuel en utilisant les sessions (session start...). Le client peut naviguer sur le site et remplir son panier au fur et à mesure. A chaque fois qu'il ajoute un article, une ligne se crée dans ma table panier: id (générée automatiquement) / article (avec le nom du produit) / quantite (avec la quantite qu'il peut modifier)/ client (que je désire compléter plus tard)

Quand il veut valider ses achats, le client doit se connecter afin que je puisse récupérer ses coordonnées.
Tout ça fonctionne. Sauf quand je veux compléter ma table panier avec les coordonnées de mon client (admettons son mail). Je tente de mettre à jour le panier: je récupère le mail de mon client, mais seulement pour la première ligne de ses achats... C'est ballot s'il commande différents articles, car seul le premier qu'il a mis dans son panier est complété!!

Auriez-vous une idée lumineuse et géniale de la façon dont je peux procéder pour que php vérifie tout le contenu de la table panier et complète toutes les lignes dévolues à mon client avec son adresse mail?
Merci d'avance pour votre aide
;-)
A voir également:

4 réponses

Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
19 nov. 2009 à 16:23
Bonjour,

Peux-tu nous donner :
- les colonnes de ta table Panier ;
- la requête que tu effectues aujourd'hui.

Xavier
0
desesphp Messages postés 9 Date d'inscription mardi 17 novembre 2009 Statut Membre Dernière intervention 24 novembre 2009
19 nov. 2009 à 16:47
Bonjour Xavier et merci de ta réponse,
Ma table panier contient 4 colonnes: id / client / article / quantité...
Pour le moment, la requête que j'effectue pour mettre à jour la table panier avec le mail de mon client est:

if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form1")) {
$updateSQL = sprintf("UPDATE boutique_panier SET client=%s, article=%s, quantite=%s WHERE id=%s",
GetSQLValueString($_POST['client'], "text"),
GetSQLValueString($_POST['article'], "int"),
GetSQLValueString($_POST['quantite'], "int"),
GetSQLValueString($_POST['id'], "int"));

mysql_select_db($database_boutique, $boutique);
$Result1 = mysql_query($updateSQL, $boutique) or die(mysql_error());

La table est mise à jour pour la première ligne du panier de mon client, mais pas pour les suivantes. Il faudrait que je crée une requête php pour que chaque ligne de la table panier soit vérifiée, et que la colonne client soit remplie pour toutes les lignes du panier de mon client actuel. Pour le moment, je transfère les données du client grâce à session_start...
Je dois faire un compteur? Ou une boucle while? Mais je ne sais pas vraiment comment m'y prendre, ni surtout comment nommer cette condition: "pour le client actuellement connecté" (surtout s'il y en a plusieurs en ligne en même temps...)
Une petite idée? Je ne sais pas si je suis très clair...
En tous cas, merci pour ton aide...
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
20 nov. 2009 à 22:55
Bonjour,

Désolé pour le retard...
Je ne suis pas sûr de bien comprendre comment est censée être remplie ta table boutique_panier.
Normalement, tu veux, dedans, une ligne par type de produit et par client ?
Que fait ce "id" là-dedans ? C'est un id auto-incrémenté de la table boutique_panier ?
Peut-on dire avec certitude que dans ta table, chaque couple (client, article) est unique ?

Xavier
0
desesphp Messages postés 9 Date d'inscription mardi 17 novembre 2009 Statut Membre Dernière intervention 24 novembre 2009
22 nov. 2009 à 19:41
Bonjour Xavier,
Merci pour ta réponse... OUi, en fait chaque fois qu'un client met un produit dans son panier, une ligne est créée automatiquement (avec un id auto-incrémenté), le produit placé dans cette ligne avec la quantite désirée, et pour le client, j'utilise d'abord l'identification de session de mon client (le chiffre créé automatiquement à la connexion). Cette table est temporaire et me servira plus tard à remplir une table commande... Mais pour ça, je dois absolument remplacer l'id session de mon client par son mail (MM_Username) quand il s'identifie enfin pour valider son panier... Donc, on peut dire avec certitude que chaque couple client / article est unique...
J'arrive à faire l'update pour la première ligne du panier du client, mais s'il y a plusieurs produits, ma requête ne les détecte pas... Je dois écrire une boucle while, mais je ne suis pas très au point et il manque un petit quelque chose dans mon code...

if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form1")) 
{
 $updateSQL = sprintf("UPDATE boutique_panier SET client=%s, article=%s, quantite=%s WHERE id=%s",
 GetSQLValueString($_POST['client'], "text"),
 GetSQLValueString($_POST['article'], "int"),
 GetSQLValueString($_POST['quantite'], "int"),
 GetSQLValueString($_POST['id'], "int"));
				 
while ($row_panier= mysql_fetch_assoc($panier)); 
 mysql_select_db($database_boutique, $boutique);
 $Result1 = mysql_query($updateSQL, $boutique) or die(mysql_error());



Si quelqu'un peut compléter ce code pour que ma requête vérifie toutes les lignes de ma table panier, et change chaque fois qu'elle détecte le même identifiant de client par son mail... Pitié!!! Trois jours que je tourne en rond!!!
Merci d'avance
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011 > desesphp Messages postés 9 Date d'inscription mardi 17 novembre 2009 Statut Membre Dernière intervention 24 novembre 2009
22 nov. 2009 à 22:30
Bonjour,

OK, je crois que je comprends le problème. La solution me semble être simplement cette requête :
$sql = sprintf("UPDATE boutique_panier SET client=%s WHERE client=%s",
    GetSQLValueString($_POST['MM_Username'], "text"),
    GetSQLValueString($_POST['client'], "text"));

Cela te convient-il ?

Xavier
0
desesphp Messages postés 9 Date d'inscription mardi 17 novembre 2009 Statut Membre Dernière intervention 24 novembre 2009 > Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021
23 nov. 2009 à 09:40
Bonjour Xavier,
Merci pour ta réponse... C'est ce que je pensais au départ, qu'il suffisait d'un simple where, mais non en fait... Parce que quand la requête trouve la première ligne qui répond à cette demande, elle la remplie puis s'arrête...
Mon problème n'est pas l'update, mais l'update pour toutes les lignes répondant à cette requête... Et le where ne suffit pas... J'ai tenté ton script, et il a le même effet que celui que j'ai posté..
Je suis donc toujours à la recherche de ma boucle while... que je ne sais apparemment pas construire correctement puisque:
while ($row_panier= mysql_fetch_assoc($panier)); 

ne suffit pas...
Il manque quelque chose, mais quoi?

Admettons que j'ai trois ligne de panier (avec 3 id différents mais pour un seul client). Sans ce while, lorsque je poste le formulaire, il ne me remplit que la première ligne. Je peux poster 10 fois de suite le formulaire, rien ne se passera de plus que le remplacement dans la première ligne de l'identifiant de session par le mail.
Avec ce while, chaque fois que je poste le formulaire, l'id de session est remplacé par le mail dans une ligne... Donc je dois poster 3 fois le formulaire pour que mon panier soit correctement mis à jour (4 fois si j'ai 4 produits différents dans mon panier, etc...). Cette opération, j'aimerai la faire en un seul clic...
Je ne sais pas si je suis plus précis...

Je cherche, je cherche, mais... j'y arrive pas! Alors si par hasard...
Merci beaucoup...
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011 > desesphp Messages postés 9 Date d'inscription mardi 17 novembre 2009 Statut Membre Dernière intervention 24 novembre 2009
23 nov. 2009 à 14:23
La clause WHERE de ta requête d'update ne contient QUE client=... ?
Pas d'ID=... ?
Alors toutes les lignes correspondantes devraient être mises à jour !
Si ce n'est pas le cas, je t'avoue que j'en reste sans voix.

Si tu fais un echo de cette requête, pour l'afficher à l'écran, tu obtiens quoi exactement ?
Et si tu copies-colles cette requête dans un requêteur (phpMyAdmin, si c'est ce que tu utilises), elle marche ou pas ?
0
desesphp Messages postés 9 Date d'inscription mardi 17 novembre 2009 Statut Membre Dernière intervention 24 novembre 2009 > Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021
23 nov. 2009 à 18:14
OUi, ma requête WHERE ne contient que client=... et ça ne marche pas...
Pourquoi? Vraiment aucune idée... Parce que je ne précise pas pour quel client exactement je demande ça? Il s'agit du client dont la session est en cours... Donc celui dont $id=session_id()...
Voici le code entier de ma page de test pour cette requête... Peut-être comprendrez-vous mieux ce qui se passe (sachant que pour atteindre cette page le client doit être connecté avec son mail et mot de passe... Mais je vous fais grâce de ce morceau de code qui fonctionne)...

<?php

if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form1")) {
$updateSQL = sprintf("UPDATE boutique_panier SET client=%s, article=%s, quantite=%s WHERE id=%s",
                       GetSQLValueString($_POST['client'], "text"),
                       GetSQLValueString($_POST['article'], "int"),
                       GetSQLValueString($_POST['quantite'], "int"),
                       GetSQLValueString($_POST['id'], "int"));
					   
while ($row_panier= mysql_fetch_assoc($panier)); 
				   
  mysql_select_db($database_boutique, $boutique);
  $Result1 = mysql_query($updateSQL, $boutique) or die(mysql_error());

  $updateGoTo = "../projets.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $updateGoTo .= (strpos($updateGoTo, '?')) ? "&" : "?";
    $updateGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $updateGoTo));
}

$paramclient_panier = "0";
if (isset($id)) {
  $paramclient_panier = $id;
}
mysql_select_db($database_boutique, $boutique);
$query_panier = sprintf("SELECT * FROM boutique_panier WHERE client=%s", GetSQLValueString($paramclient_panier, "int"));
$panier = mysql_query($query_panier, $boutique) or die(mysql_error());
$row_panier = mysql_fetch_assoc($panier);
$totalRows_panier = mysql_num_rows($panier);
?>

<body>
<form id="form1" name="form1" method="POST" action="<?php echo $editFormAction; ?>">
  <input name="id" type="hidden" id="id" value="<?php echo $row_panier['id']; ?>" />
  <input name="client" type="hidden" id="client" value="<?php echo $_SESSION["MM_Username"]; ?>" />
  <input name="article" type="hidden" id="article" value="<?php echo $row_panier['article']; ?>" />
  <input name="quantite" type="hidden" id="quantite" value="<?php echo $row_panier['quantite']; ?>" />
  <label for="test"></label>
  <input type="submit" name="test" id="test" value="Envoyer" />
  <input type="hidden" name="MM_update" value="form1" />
</form>
</body>
</html>
<?php
mysql_free_result($panier);
?>



Bon, c'est un peu long et laborieux... Mais peut-être que ce sera plus clair...
Je suis comme toi, perplexe. Je ne comprends pas le petit truc qui manque pour que ça fonctionne sur toutes les lignes et pas juste sur une seule...
Peut-être que pour le WHERE il faut entrer une valeur précise pour que ça agisse sur toutes les lignes. client= $id n'est pas assez précis... Mais je ne peux pas connaître cette valeur par avance... C'est pour ça que je pensais qu'avec une boucle while, ça solutionnait le problème... Mais je ne sais pas la construire aparemment...
Peut-être as-tu une autre idée aux vues de ce code...
Merci en tous cas de te pencher sur mon problème...
0
fatim1 Messages postés 17 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 21 novembre 2009
21 nov. 2009 à 22:15
Bonjour à tous.
J'ai un problème.
J'ai une table contrat qui a par exemple quatre champs( objet,date_debut,date_fin, nombre_jours,nombre_jour_restant)
Comment faire de telle sorte que si on ajoute en enregistrement via un formulaire php dans la table,
on calcule le nombre de jours pour renseignerle champ "nombre_jours"; et aussi s'arranger à ce que
chaque jour le nombre de jours soit décrémenté.

Et un autre problème changer le format des dates MySQL (YYYY-MM-JJ) en format français.
S'il vous plait j'ai vraiment besoin d'aide en ce moment.
Merci.
0