recuperer une donnée

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : recuperer une donnée

par nicko77 » 02 févr. 2007, 17:59

Merci pour tout et à tous, j'ai fait finalement un script un peu compliqué mais qui marche bien. Voilà la solution pour ceux qui auraient envie de voir
if (isset($_POST['pseudo']) AND isset($_POST['note']) AND isset($_POST['message']) )
{
   if ($_POST['pseudo'] != NULL  AND $_POST['note'] != NULL AND $_POST['message'] != NULL)
	{
	mysql_connect("localhost", "*****", "******");
	mysql_select_db("comffvii");
		
    $pseudo = htmlentities($_POST['pseudo'], ENT_QUOTES); // On utilise htmlentities par mesure de sécurité
        $date = date('d/m/Y');
        $heure = date('H\hi');
        $note = intval($_POST['note']);
       
    $message = htmlentities($_POST['message'], ENT_QUOTES); // De même pour le message
    $message = nl2br($message); // Pour le message, comme on utilise un textarea, il faut remplacer les Entrées par des <br />
	
	$un_message = mysql_query ("SELECT * FROM comffvii");
	
	if ($un_message < 1)
       {
    // On peut enfin enregistrer :o)
    mysql_query("INSERT INTO comffvii VALUES('', '" . $pseudo . "', '". $date ."', '". $heure ."', '". $note ."', '" . $message . "')");
		}
	else
	{
	$dernier_mess = mysql_query("SELECT * FROM comffvii ORDER BY id DESC LIMIT 0,1");
	
	$controle = mysql_fetch_array($dernier_mess);
	if ($pseudo != $controle['pseudo'] OR $note != $controle['note']  OR $message != $controle['message'])
		{
		mysql_query("INSERT INTO comffvii VALUES('', '" . $pseudo . "', '". $date ."', '". $heure ."', '". $note ."', '" . $message . "')");
		}
	}
	}
	
	
}
[/quote]

par Invité » 02 févr. 2007, 17:41

La fonction header permet de faire une redirection vers une autre page de manière transparente en php :)

Le pattern PRG (Post Redirect Get) a pour but de récupérer et traiter les données d'un formulaire envoyées en Post (insert, update, delete, ...) puis de rediriger l'utilisateur vers une autre page qui sera ouverte en Get.

Ainsi si l'utilisateur s'acharne sur le bouton "actualiser", c'est la page ouverte en Get qui se recharge et pas celle qui traite les données (donc pas d'insertions multiples involontaires) :)

par nicko77 » 02 févr. 2007, 16:20

merci pour tout, tu pourrais m'en dire plus sur l'utilisation de header, car malgré le lien que tu m'as donné, je n'ai pas vraiment saisi..

merci d'avance

par Ryle » 02 févr. 2007, 13:58

Bah euh.... décalle l'affichage pour qu'il ne se fasse qu'une fois les traitements php terminés, tu auras la dernière valeur :)

L'avantage également, c'est que si tu n'affiches pas de html avant le traitement php, tu pourras utiliser la fonction header() pour rediriger l'utilisateur après l'insertion de son commentaire. Ceci te permet de recharger la page qui prendra en compte la nouvelle donnée, et surtout inhibera l'effet du F5 ou de l'actualisation, puisqu'au lieu de renvoyer les données du formulaire, cela ne rechargera que la page finale :) (cf. pattern PRG)

par nicko77 » 02 févr. 2007, 13:45

nickel, ca marche...

Il me faut maintenant régler ce probleme de redondance à l'actualisation de la page...

En fait la moyenne s'actualise qu'en actualisant la page (du fait que la requete soit placée et affichée avant que l'internaute ne mette sa note), sauf qu'un F5 fait un effet de redondance et la note de l'internaute s'affiche 2 fois au lieu d'une...

Si quelqu'un a une solution, ce serait sympa, mon script serait fini :D

par Ryle » 02 févr. 2007, 13:12

Si tu veux spécifier un nombre constant de décimales à afficher, tu peux utiliser la fonction php number_format().

Si tu veux juste supprimer les 0 inutiles, il te suffit de convertir explicitement la chaine en nombre avec floatval() par exemple ou en la castant. (les zéros seront automatiquement retirés)

Je te recommande toutefois la première option si jamais ta moyenne contient des 0.6666666666... :)

par nicko77 » 02 févr. 2007, 12:55

Merci beaucoup t'es un chef, ca marche nickel ...

Une dernière question.

La moyenne s'affiche ainsi : 12,5000.
Comment enlever tous les zeros qu'il y a derrière? En gros comment arrondir à un chiffre apres la virgule ?



Autres petit probleme : le fait d'actualiser la page renvoie une seconde fois la note... comment régler ce problème ?

par Ryle » 02 févr. 2007, 12:43

C'est parce que ta requête SQL n'est pas correcte que tu as ce message d'erreur... peut être une erreur dans le nom de la table que tu n'auras pas rectifié (ffvii au lieu de comffvii) ? :)

par nicko77 » 02 févr. 2007, 12:17

Merci, j'ai essayé la requete et voilà le message d'erreur:

Code : Tout sélectionner

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /mnt/141/sdb/9/9/paratexta/ffvii.php on line 81
J'vais donc essayer avec le return pour voir si ca marche

par Ultim4T0m » 02 févr. 2007, 04:10

Bonsoir,

Tu n'as pas mis de return à ta fonction, donc elle ne renverra rien (ce qui est embêtant si tu veux qu'elle te permette d'afficher un résultat)

Remplaces tes echo par des return, cela devrait être mieux.

Cependant, pourquoi s'embêter avec ce code alors qu'en une requête SQL, tu peux avoir le même résultat ?
$requete = mysql_fetch_assoc(mysql_query("SELECT AVG(note) AS moyenne FROM ffvii"));
   $moyenne = $requete['moyenne'];
Ce n'est qu'un exemple pas testé, il y a moyen de faire mieux.

Tu fais donc cette requête avant l'endroit où tu souhaites afficher la moyenne. Et pour l'afficher, un simple echo $moyenne; et le tour est joué.

par Invité » 02 févr. 2007, 03:00

<form method="post" action="ffvii.php">
    <p>Vous n'êtes pas d'accord ou au contraire vous voulez nous appuyez, laissez votre commentaire</p>
   
    <p>
        Pseudo <br/><input name="pseudo" /><br />
		<label>
                                        Votre note sur 20 :
                                        <select name="note">
                                                <option value="1"> 1 </option>
                                                <option value="2"> 2 </option>
                                                <option value="3"> 3 </option>
                                                <option value="4"> 4 </option>
                                                <option value="5"> 5 </option>
                                                <option value="6"> 6 </option>
                                                <option value="7"> 7 </option>
                                                <option value="8"> 8 </option>
                                                <option value="9"> 9 </option>
                                                <option value="10"> 10 </option>
												<option value="11"> 11 </option>
												<option value="12"> 12 </option>
												<option value="13"> 13 </option>
												<option value="14"> 14 </option>
												<option value="15"> 15 </option>
												<option value="16"> 16 </option>
												<option value="17"> 17 </option>
												<option value="18"> 18 </option>
												<option value="19"> 19 </option>
												<option value="20"> 20 </option>
                                        </select>
                                </label><br/>
        Message <br/>
        <textarea name="message" rows="8" cols="35"></textarea> <br />
        <input type="submit" value="Envoyer" />
    </p>
    </form>
<p class="pages">
<?php
mysql_connect("localhost", "********", "********");
mysql_select_db("********");

// --------------- Etape 1 -----------------
// Si un message est envoyé, on l'enregistre
// -----------------------------------------

if (isset($_POST['pseudo']) AND isset($_POST['note']) AND isset($_POST['message']) )
{
   
    $pseudo = htmlentities($_POST['pseudo'], ENT_QUOTES); // On utilise htmlentities par mesure de sécurité
	$date = date('d/m/Y');
	$heure = date('H\hi');
	$note = intval($_POST['note']);
       
    $message = htmlentities($_POST['message'], ENT_QUOTES); // De même pour le message
    $message = nl2br($message); // Pour le message, comme on utilise un textarea, il faut remplacer les Entrées par des <br />
	
    // On peut enfin enregistrer :o)
    mysql_query("INSERT INTO comffvii VALUES('', '" . $pseudo . "', '". $date ."', '". $heure ."', '". $note ."', '" . $message . "')");
}

// --------------- Etape 2 -----------------
// On écrit les liens vers chacune des pages
// -----------------------------------------

// On met dans une variable le nombre de messages qu'on veut par page
$nombreDeMessagesParPage = 20; // Essayez de changer ce nombre pour voir :o)

// On récupère le nombre total de messages
$retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM comffvii');
$donnees = mysql_fetch_array($retour);
$totalDesMessages = $donnees['nb_messages'];


// On calcule le nombre de pages à créer
$nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);

// Puis on fait une boucle pour écrire les liens vers chacune des pages
echo 'Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
    echo '<a href="ffvii.php?page=' . $i . '">' . $i . '</a> ';
}

?>

</p>
<?php
// --------------- Etape 3 ---------------
// Maintenant, on va afficher les messages
// ---------------------------------------

if (isset($_GET['page']))
{
    $page = intval($_GET['page']); // On récupère le numéro de la page indiqué dans l'adresse (comotori.php?page=4)
}
else // La variable n'existe pas, c'est la première fois qu'on charge la page
{
    $page = 1; // On se met sur la page 1 (par défaut)
}

// On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;

$reponse = mysql_query('SELECT * FROM comffvii ORDER BY id DESC LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);

while ($donnees = mysql_fetch_array($reponse))
{
    echo '<p align=center><strong>' . $donnees['pseudo'] .'</strong> ( le  '. $donnees['date'] .' à  '. $donnees['heure'].' ) </p>';
	echo '<p align=center, style="color : red"><strong>Note : '.$donnees['note'] . '/20</strong></p>';
	echo '<p align=center, style="color : blue"><strong>'.$donnees['message'] . '</strong></p>';
}

       
mysql_close(); // On n'oublie pas de fermer la connexion à MySQL ;o)
?>
</div>
Voila mon code sans la moyenne...


voila ma boucle pour la moyenne:
function moyenne($retour)
                                {
                                        $note = 0;
                                        $moyenne = 0;
                                        while($donnees = mysql_fetch_array($retour))
                                        {
                                                $moyenne = $moyenne + $donnees['note'];
                                                $note++;
                                        }
                                       
                                        if($note == 0)
                                        {
                                                echo 'Le site n\'a pas encore reçu de notes';
                                        }
                                        else
                                        {
                                                $moyenne /= $note;
                                                echo 'La moyenne  '.$moyenne;
                                        }
                                }              
Cependant, cette boucle n'affiche rien, peu importe où je la place, et mon problème vient surtout de renvoyer la moyenne à un endroit précis de ma page...

J'espère avoir donné suffisamment d'info...

par Ajoloca » 02 févr. 2007, 02:50

Bonjour,

Avec si peu d'informations c'est très, très difficile de pouvoir t'aider, même avec toute la volonté du monde.

Montre-nous ton code PHP (la partie concernée) et de même pour la déclaration de la zone (X)HTML

recuperer une donnée

par nicko77 » 02 févr. 2007, 02:46

Bonsoir, j'ai dans mon site un système de commentaire avec une mise de note. Je n'arrive pas à faire la moyenne des notes puis l'affichée exactement où j'ai envie sur mon site, à savoir en haut du bloc principal.

Pourriez-vous m'aider ?