8797 sujets

Développement web côté serveur, CMS

Bonsoir !

Voilà, j'ai une petite question que j'imagine de débutant donc je pense qu'elle ne posera pas trop de problème... Smiley cligne

Donc en fait, j'ai une table que voici :

TELEPHONE        varchar(10)    latin1_general_ci      Non
NOM                 varchar(30)    latin1_general_ci 	  Oui 	 NULL 	
PRENOM        	  varchar(30) 	 latin1_general_ci 	Oui    NULL 		
EMAIL          	    varchar(50)    latin1_general_ci 	  Oui 	 NULL 	
BOUTEILLE 	  varchar(30) 	 latin1_general_ci 	Oui    NULL 		
VOLUME 	          float 			                 Oui 	NULL 		
DIVERS 	           varchar(60) 	  latin1_general_ci      Oui 	NULL


Elle est liée à un formulaire qui vient insérer des valeurs dedans puis les récapitule ensuite.
C'est en fait une sorte de système d'inscription à une soirée. On entre son nom, son prénom, son email, et la bouteille que l'on va ramener, ainsi que le volum qui se selectionne dans une liste déroulante.

Vous pouvez voir un aperçu ici : http://fullmoonpartylogrian.online.fr/testseb/index.php
(le bouton noir ouvre le formulaire pour s'inscrire, c'est vraiment fait à l'arrache... hihi... Smiley confused )

Et ensuite, l'exploitation ici : http://fullmoonpartylogrian.online.fr/liste_invites.php

Donc le problème, c'est qu'il y a une ligne vierge qui s'ajoute dans la table, avec seulement la valeur "0" dans Volume.
Ce qui vient foirer tout, puisque comme vous pouvez le voir il y a 17 enregistrés, mais dans la liste_invites.php, il y a un bug sur le début de la liste avec le 1 et le 2 ensemble, et on peut compter 18 personnes...
Quand j'essaie de supprimer cette ligne vierge, elle revient... Je pense que le problème vient du type pour VOLUME, mais je ne trouve pas la solution...

Le truc c'est que PHP, MySQL, c'est pas trop mon truc, donc du coup c'est un peu n'importe quoi... Smiley confused
Voilà, donc si quelqu'un pouvait m'aider, ce serait génial Smiley ravi

Merci
Modifié par TriskaidekaPiT (05 May 2008 - 20:09)
Si ça peut aider, voici un screenshot du problème...

EDIT : bon en fait, je la vire carrément... ^^

Merci
Modifié par TriskaidekaPiT (06 May 2008 - 00:02)
une ligne que tu supprimes directement dans phpmyadmin ne reviens pas tous seule. moralité c'est que ton programme d'insertion dois surement faire une insertion a un mauvais moment.
C'est pas faux... Smiley langue

Dans ce cas, voici mes codes :

<form method="post" action="index.php"> 
<FIELDSET style='width:250px'> 
<LEGEND align=top> Informations personnelles </LEGEND> 
<br/>
<table> 
<tr><td width="50px">NOM :</td><td><INPUT type="text" name="nom"></td></tr>
<tr><td width="50px">Prénom :</td><td><INPUT  type="text" name="prenom"></td></tr>
<tr><td width="50px">Email :</td><td><INPUT  type="text" name="email"></td></tr>
<tr><td width="50px">Téléphone :</td><td><INPUT  type="text" name="telephone"></td></tr>
<tr><td width="50px">
    Bouteille : </td><td><select name="bouteille">
        <option>Vodka</option>
        <option>Whisky</option>
        <option>Gin</option>
		<option>Bières</option>
    </select> </td></tr>
<tr><td width="50px">
	Volume (en L) ou Packs : </td><td><select name="volume">
        <option>0.75</option>
        <option>1</option>
        <option>2</option>
		<option>pack</option>
    </select> </td></tr>
<tr><td width="50px">Plus (optionnel) :</td><td><INPUT  type="text" name="plus"></td></tr>
</table> 
<br/>
<input type="submit" style="width:100" value="OK" style="background-color:#000000" style="color:white; font-weight:bold"onclick>
<br/>
<input type="button" value="RETOUR" onclick="self.location.href='index.php'" style="background-color:#000000" style="color:white; font-weight:bold"onclick> 
</FIELDSET> 
</form>


Et la partie dans index.php qui y est liée :

<?php
$plus = $_POST['plus'];
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$email = $_POST['email'];
$telephone = $_POST['telephone'];
$bouteille = $_POST['bouteille'];
$volume = $_POST['volume'];
$mysql_host="xxxxxx"; // le serveur
$mysql_login="xxxxxxx"; // le login
$mysql_pass="xxxxxxxxxx"; // mot de passe
$mysql_dbnom="xxxxxxxxxx"; // nom de la base de donnee
$db=mysql_connect($mysql_host,$mysql_login,$mysql_pass);
mysql_select_db($mysql_dbnom,$db) or die("erreur de connexion a la base de donnees");

mysql_query("INSERT INTO personne VALUES('$telephone','$nom','$prenom','$email','$bouteille','$volume','$plus')");

mysql_close();
?>


Voilà, en espérant que ça puisse aider à m'aider.
Merci encore Smiley smile
je vois que tu ne fais aucune verification a l'insertion quoi.

si tu faisais une verification de l'existence de la variable posté et quelle est du contenu ça ferais moins de pb potentiel

genre:

if (isset($_POST['nom']) && !empty($_POST['nom'])) $nom= mysql_real_escape_string($_POST['nom']); else $nom ="";
if (isset($_POST['prenom']) && !empty($_POST['prenom'])) $prenom= mysql_real_escape_string($_POST['prenom']); else $prenom = "";
...
if (isset($_POST['volume']) && $_POST['volume]>0 ) $volume= $_POST['volume'] * 1;
 // * 1 histoire que ce soit bien un entier 
else $volume = 0;
...

if ($nom != ""  && $prenom !="" && $bouteille != "") // en imaginant ces 3 champs obligatoires
 mysql_query("INSERT INTO personne
 VALUES ('$telephone','$nom','$prenom','$email','$bouteille','$volume','$plus')");



PS: ton image de phpmyadmin est trop grande ça etire la mise en page de alsa. t'aurais du utiliser la miniature et apres quand on clique dessus on a l'image en grand.
Modifié par CPascal (05 May 2008 - 23:38)
Salut

+1000 pour les vérifications à l'insertion. Toujours, toujours, toujours contrôler les données provenant de l'utilisateur.

Sinon, pour le type de données, on doit pouvoir utiliser NUMBER(3,2) avec MySQL, non ? I.e. un nombre comportant 3 chiffres, dont 2 après la décimale. Ça me semble plus approprié que FLOAT dans ce cas Smiley cligne

Edit: en passant, j'espère que les adresses mail dans ton listing sont bidons ? C'est dans une image, d'accord, mais ce ne serait pas cool d'exposer ainsi les adresses mail des utilisateurs de ton site Smiley ohwell
Modifié par Thomas D. (05 May 2008 - 23:43)
Bon, et bien merci à tous les deux, car grâce à vos conseils, j'ai réussi à arranger mon script Smiley cligne

Je vous l'ai dit, moi le PHP MySQL, c'est pas trop mon truc, même si c'est très intéressant, et pour cela, j'apprécie votre aide.
C'est un copain qui s'est occupé du code PHP (et ne croyez pas que je dis ça pour me tirer d'affaire, c'est véridique Smiley cligne ) donc je lui dirai pour ce qui est des vérifications, et puis pour moi, ce sera toujours ça de su.

Pour les mails, ils étaient bidons, sauf le miens... mais bon, j'ai tout enlevé, comme ça on en parle plus... Smiley langue

Bon, et par contre, maintenant, je bloque sur un petit truc...
Je le met à la suite de ce topic, puis si besoin je créérai un nouveau sujet.

En fait, une fois que tout est rentré dans la base, je retourne chercher les valeurs pour les afficher dans un tableau.
Là, j'essaie de créer une liste des alcools avec le volume pour chaque alcool.
Cela donc donne quelque chose comme :

// VODKA
$vodka = mysql_query("SELECT SUM(volume) FROM personne where bouteille='Vodka'");
$vvodka=mysql_fetch_row($vodka); 


Que j'affiche ensuite comme suit :

echo "<table id='recapalcool'>
<tr>
<td class='alcool_title'>VODKA</td>
</tr>
<tr>
<td class='alcool_vol'>".$vvodka[0]." Litres</td>
</tr>
echo"</table>";


Voilà, maintenant, le problème, c'est que s'il y a pas encore d'enregistrement pour la valeur "Vodka" dans la table, alors mon Litres fait un peu bête tout seul dans son tableau...
J'ai donc essayé de faire une vérification pour afficher "0" s'il n'y a rien dans la table pour "Vodka".
Voici ce que j'ai essayé :

// VODKA
$vodka = mysql_query("SELECT SUM(volume) FROM personne where bouteille='Whisky'");
	if(empty($vodka)) {
$vvodka="0"; }
	else {
$vvodka=mysql_fetch_row($vodka); } 


Voilà, j'imagine que le problème est dans cette portion de code là...
J'ai essayé pas mal d'autres trucs avant de vous poser la question, et je serai curieux de voir la solution... Smiley ravi

Merci encore en tous cas Smiley smile
en l'occurrence le

 if(empty($vodka)) {


c'est pas ça qu'il faut faire.

mysql_query va executer la requete et retourner un recordset, disons un ensemble de resultat(s).

ou faux s'il y a eut une erreur de requete. s'il y a une erreur dans la requete c'est pas forcement que ça vaut zero c'est que ton code est faux.

si tu as un resultat c'est pas pour autant que la somme ne vaut pas zero.

on peut savoir le nombre de resultat d'une requete avec la fonction mysql_num_rows($vodka); et tu verrais que ça peut être zero dans l'abolu. mais bon là tu demandes une somme donc il y a un et un seul resultat.

$r = mysql_fetch_row($vodka); 

$volume = $r[0];  

echo $volume." Litre".(($volume<=1)?"":"s");


je gere s'il y a un s a la fin si ça depasse 1. tu peux facilement aussi faire des test sur la variable pour ne pas afficher du tous litre si ça vaut zero.

pour ça un(ou des ) if/else fait aussi bien l'affaire que l'operateur ternaire ()?: que j'ai employé là.
ou l'operateur switch s'il y a 3 cas.

$volume tu peux l'appeler $vvodka si tu veux. neanmoins tu verras que tu debuggeras mieux si toutes tes variables ont un nom clair.
Modifié par CPascal (07 May 2008 - 21:41)
Merci CPascal pour ton temps et tes réponses Smiley smile

Je ne suis pas sûr d'avoir bien compris tout ce que tu as dit dans ta réponse et j'ai essayé la solution que tu m'as donné par rapport pour cette histoire de zéro.

Ce qu'il y a, c'est que la requête SQL en question effectue une somme, or s'il n'y a pas d'enregistrements, elle ne peut pas faire cette somme, ou du moins, elle ne pourra pas renvoyer de résultat absolu, je me trompe ?

Parce que quand j'essaie d'effectuer cette requête dans phpMyAdmin :

SELECT SUM( volume )
FROM alcool
WHERE bouteille = 'vodka' 


J'obtiens comme réponse : NULL

Ce qui, je crois, me parait logique, puisqu'il ne trouve aucun enregistrements pour faire la somme...

Ce qui fait qu'avec la solution que tu m'as donné, s'il n'y a pas d'enregistrements pour la bouteille "Vodka", alors seul " Litre" s'affiche.

Alors, est-ce que la solution est bonne, ou bien est-ce moi qui suis encore dans l'erreur quelque part ?
Du côté de la base de donnée peut être ?
Mon champs "volume" dans la table "alcool" a pour valeurs :
Type : float
Null : non
Defaut : 0

Est-ce bien correct ?

Merci encore en tous cas !
Tes conseils et tes solutions m'aident beaucoup, c'est gentil à toi.
Smiley smile
Un jour je rendrais ce savoir. Smiley cligne
erf

j'avais pas testé , et oui je suis un informaticien flemard.... ( qui a dis que c'etait un pleonasme au fond de la classe? Smiley cligne )

bon le empty est bien faux. mes tests me disent qu'il rend faux a chaque fois. normal il y a bien quelque chose.

par contre un print_r de $r donne Array ( [0] => )

donc $r[0] est null. alors 2 solutions.

soit

changer la valeur de $volume

$volume = ($r[0])?$r[0]:"0";  


ainsi tu as 0 litre qui s'affiche même s'il n'y a pas de bouteille de whisky.

soit

changer l'affichage

if ($volume != null)
echo $volume." Litre".(($volume<=1)?"":"s");


ainsi pas d'affichage du tous si aucune bouteille n'existe. mais tu auras 0 litre si une bouteille vide est là.
Modifié par CPascal (12 May 2008 - 15:24)
CPascal a écrit :
et oui je suis un informaticien flemard.... ( qui a dis que c'etait un pleonasme au fond de la classe? Smiley cligne )
C'est moi Smiley lol !
Smiley smile

Voilà, tout marche, tout est nickel !

Encore un grand merci à toi CPascal, merci vraiment Smiley smile
Tu m'as donné envie de me mettre vraiment au php, ça a l'air d'être un langage vraiment intéressant, alors...

A bientôt ! Smiley cligne Smiley biggrin