8791 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai actuellement deux problèmes, un concerne l'insertion de données dans une table (j'utilise Mysql 5.0) et mon autre problème concerne la réalisation d'un tirage au sort sur les valeur de la table précédente.

Pour mon premier problème voici mon code :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>Rédiger une news</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <style type="text/css">
        h3, form
        {
            text-align:center;
        }
        </style>
    </head>
   
    <body>



<form action="joueur.php" method="post">

Nom: <input type="text" name="nom" ><br><br>
Login: <input type="text" name="login"><br><br>
Email: <input type="text" name="email" ><br><br>
<input type="submit" value="Envoyer">

<?php

if (isset ($_POST['nom']) and isset ($_POST['login']) and isset ($_POST['mail']))
{
	//connection a la base de données
$host = localhost;
$user = ***;
$bdd = ***;
$passwd  = ***;

mysql_connect($host, $user,$passwd) or die("erreur de connexion au serveur");

mysql_select_db($bdd) or die("erreur de connexion a la base de donnees");
	
	if ($_POST['nom']!= null and $_POST['login']!=null and $_POST['mail']!=null)
	{
	//on passe a des variables les differents textes  entres par l'admin
	$nom = htmlentities ($_POST['nom']);
	$login = htmlentities ($_POST['login']);
	$email = htmlentities ($_POST['email']);
	
	//insertion des nouvelles news sous forme de variable dans la base de données
	mysql_query("INSERT INTO joueur1 VALUES('', '" . $nom . "', '" . $login . "', '" . $email . "')");
	
	mysql_close();
	}
	else
		{ echo "Veuillez remplir tous les champs";}
}
?>
</form>

</body>
</html>


Le problème est que les valeurs entrées dans les champs ne rnetre pas dans la table, ça sent l'erreur con mais je vois pas ^^'

Pour mon deuxième problème je vous explique un peu, le formulaire précédent enregistre donc des utilisateurs pour un concour. Ces utilisateurs peuvent s'enregistrer plusieurs durant toute la durée du concours (super des doublons dans la table... ).
A la fin de la période de jeu, je rempli un autre formulaire qui permettra de lancer le tirage au sort. Ce formulaire est composé d'un champs où l'on rentre le nombre de gagnant et d'un bouton lançant le tirage au sort.

Ok "utilise la fonction random me dira-t-on" et je suis d'accord mais j'ai un peu de mal à saisir le code qu'il faut générer pour tirer au sort 8 personnes differentes dans ma table sachant qu'il y a des doublons et cela en un seul click bouton ^^'

Si quelqu'un avait une piste ou suggestion à ce sujet je suis preneur.
Modifié par makta (06 Nov 2007 - 14:15)
Hello !
Personnellement je ne suis pas très fan de l'écriture VALUES() pour le insertions.
INSERT INTO joueur1 SET login='$login', nom='$nom'... etc

L'avantage c'est que les champs qui s'auto-incrémentent se mettent à jour tout seuls.

Pour ton problème de doublons, 2 solutions.
Soit tu vérifies à l'inscription que le login ou le nom ou le mail ou les 3 n'existent pas dans ta table avant insertion.
Soit tu fais une requête avec un GROUP BY pour éliminer les doublons en sortie.
Le code dessous groupe les réponses par login, donc si un login est noté 10 fois, il ne sortira qu'une seule fois.
Il est possible de grouper sur plusieurs colonnes.
SELECT login, nom, email FROM joueur1 GROUP BY login ORDER BY RAND() LIMIT 8

Avec ça, ça devrait tourner...
Modifié par BruceFeuillette (29 Oct 2007 - 16:49)
Salut,
BruceFeuillette a écrit :
L'avantage c'est que les champs qui s'auto-incrémentent se mettent à jour tout seuls.
Euh... Ben c'est pareil avec VALUES Smiley rolleyes ...

Sinon makta ton code ne peut pas fonctionner puisque tu testes $_POST['mail'] alors que le name de ton <input> est email Smiley murf !
Une suggestion :
<form action="joueur.php" method="post">
	<p>
		<label for="nom">Nom:</label>
		<input type="text" name="nom" />
	</p>
	<p>
		<label for="login">Login:</label>
		<input type="text" name="login" />
	</p>
	<p>
		<label for="email">Email:</label>
		<input type="text" name="email" />
	</p>
	<p>
		<input type="submit" name="envoyer" value="Envoyer" />
	</p>
</form>
<?php
if (isset($_POST['envoyer'])) {
	if ((!empty($_POST['nom'])) && (!empty($_POST['login'])) && (!empty($_POST['email']))) {
		//connection a la base de données
		// ...
		
		//on passe a des variables les differents textes  entres par l'admin
		$nom = htmlentities ($_POST['nom']);
		$login = htmlentities ($_POST['login']);
		$email = htmlentities ($_POST['email']);
		//insertion des nouvelles news sous forme de variable dans la base de données
		$sql = "INSERT INTO joueur1 VALUES('', '" . $nom . "', '" . $login . "', '" . $email . "')";
		mysql_query($sql) or die('erreur');
		mysql_close();
	}
	else
	{ 
		echo "Veuillez remplir tous les champs";
	}
}
?>

A+
Salut,
A priori, pour ton 1er probleme, il y aurait peut etre une erreur de frappe sur le champ 'mail' ou 'email':
php :

if ($_POST['nom']!= null and $_POST['login']!=null and $_POST['mail']!=null)

html :

Email: <input type="text" name="email" ><br><br>


<edit>... trop lent Smiley cligne
Modifié par Julien Royer (29 Oct 2007 - 17:45)
Le problème ne vient pas de la requête j'en suis quasiment certain (testé directement sur la base ça fonctionne parfaitement), de plus la syntaxe que tu me donnes ne fonctionne malheureusement pas non plus.

Pour le problème numero 2, les doublons ne me gêne pas tant que ça, je suis de toute façon obligé de les garder vu que cela m'est demandé. Du coup pour le rand j'utilise un rand dans une requête ce qui donne :
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>Rédiger une news</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <style type="text/css">
        h3, form
        {
            text-align:center;
        }
        </style>
    </head>
<body>
<form action="mo.php" method="post">
Nombre de gagnants :<input type ="text" name="hasard">

<?php
//connection a la base de données
$host = localhost;
$user = root;
$bdd = jeux_pdcn;
$passwd  = vpFGMWNV;
mysql_connect($host, $user,$passwd) or die("erreur de connexion au serveur");
mysql_select_db($bdd) or die("erreur de connexion a la base de donnees");

if ($_POST['hasard'] != null)
{
$hasard = htmlentities($_POST['hasard']);

$r = mysql_query("select email from joueur1 order by rand() limit '".$hasard."'");

mysql_close();
}
?>


<input type="submit" value="tirage">
</form>
</body>
</html> 	


Du coup même probleme que pour le 1 echo du champs ça marche j'ai bien la valeur que je met dans les champs, echo du resultat...rien Smiley decu même en rentrant comme valeur 1 pour qu'il ne me sorte qu'un seul email, il me le sort pas :s
Merci Heyoan et siddhy pour vos réponses, en effet ça sentait l'erreur d'innatention.

Réponse de ton code Heyoan, erreur. La query ne passe pas Smiley bawling
Re',

en remplaçant :
mysql_query($sql) or die('erreur');
par
mysql_query($sql) or die(mysql_error());
tu auras un message plus clair sur ce qui ne va pas...

Et sinon un echo $sql."<br />"; après avoir alimenté la variable permettrait de voir tout de suite l'erreur.

Autresinon : la table joueur1 contient bien 4 champs dont le premier a l'attribut auto_increment ?

A+
Modifié par Heyoan (29 Oct 2007 - 20:28)
La différence entre SET et le VALUES() c'est que dans VALUES, il faut renseigner tous les champs, y compris ceux qui sont vides, et dans l'ordre alors qu'avec SET, on adresse directement les champs concernés, sans s'occuper de ceux qui sont vides. (Oui, je suis fainéant des fois Smiley smile )

Pour la requête qui coince, quelque fois ce que je fais c'est un echo, comme Heyoan indique, c'est de tester directement la requête dans MySQL.
Une fois qu'elle est d'aplomb je rajoute mes variables PHP et je la mets dans le code.
Au moins ça réduit les champs de recherche, si ça fonctionne avant et que le fait de passe en PHP coince, c'est qu'une variable passe mal.
Personnelement le "SET" je ne m'en sert que pour les update

Merci à vous en tout cas, cela fonctionne. Bien que je ne comprenne pas en quoi remplacer le "or die('erreur')" par "or die(mysql_error());" ait un quelconque rapport avec le fonctionnement de la requête...m'enfin^^

Maintenant ça ofnctionne alors qu'hier soir non, je vais voir pour mon problème de tirage au sort si le problème n'est pas le même.

Encore merci pour votre aide.

p.s: oui oui le premier champs étant l'id il était bien en auto-incrémente ^^
bonjour,

remplacer ceux que tu as dit permet de récupéré l'erreur mysql qui est retournée afin de savoir pourquoi celle ci ne c'est pas exécute. C'était pour vérifier que ta requête était bonne. Et ne changer rien à ton code.
Je sais bien, c'est pour ça que je ne comprends aps pourquoi ça ne marchait pas hier et que ce matin cela fonctionne très bien. ^^
Je me permets de faire remonter le topic n'ayant pas réussi à résoudre mon problème.

Je suis toujours avec ma table à doublons, suite à ça les enregistrements des joueurs tirés au sort seront donc stockés dans une table que j'appelle "gagnant" ayant pour caractéristique un email unique. Donc si je tire au sort 2 fois la même personne il va falloir que que je boucle afin de relancer le tirage automatiquement et avoir le bon nombre de ggnants sélectionnés.

Voilà le début de mon code:

<form action="new_5.php" method="post">

Nombre de gagnants :<input type ="text" name="hasard">

<?php
//connection a la base de données

...

mysql_connect($host, $user,$passwd) or die("erreur de connexion au serveur");
mysql_select_db($bdd) or die("erreur de connexion a la base de donnees");

if ($_POST['hasard'] != null)
{
$hasard = htmlentities($_POST['hasard']);
$result = mysql_query("SELECT email FROM joueur7 order by rand() limit ".$hasard);

if (!$result) {
   echo 'Impossible d\'exécuter la requête : ' . mysql_error();
   exit;
}
$row = mysql_fetch_array($result);

echo $row[0]; //la valeur du champ email

 
$s = mysql_query("INSERT INTO gagnant VALUES ('".$row[0]."')");

mysql_close();
}
?>

<input type="submit" value="tirage">


Un probleme de réglé, reste plus que le fait de tirer plusieurs personne et de n'avoir qu'un seul résultat qui foire. Smiley decu

Merci de m'éclairer, pour le premier problème faut-il boucler?^^'
Modifié par makta (06 Nov 2007 - 11:03)
Salut makta,

tu te simplifierais la vie en ne sélectionnant pas 2 gagnants ayant le même email Smiley cligne !

Pour cela (en reprenant le code de BruceFeuillette) tu pourrais faire :
SELECT login, nom, email FROM joueur1 GROUP BY email ORDER BY RAND() LIMIT 8

A+
J'avoue le "GROUPE BY" est une solution aux doublons même si cela ne me dérange vu que dans ma table gagnant j'ai mis l'email en clé unique, il ne peut donc être enregistré qu'une fois.
Pour le coup c'est vrai que ça optimise le tirage évitant la boucle au niveau du php, je n'y avais pas pensé merci.

C'est l'insertion dans la table qui me pose plus probleme sachant que la valeur email inséré dans la table est ici le $row[0] or ce $row ne m'affiche qu'un seul résultat même lorsque je lui en demande 2. Je n'ai donc la possibilité d'enregistrer qu'un seul email par clic...

Modification à faire au niveau du tableau ou?

En tout cas encore merci Heyoan.
Modifié par makta (06 Nov 2007 - 11:50)
Heu... ben faut faire une boucle (foreach, while, ou autre...) Smiley rolleyes !

Sinon dans ton cas il suffit de le faire en une seule fois :
INSERT INTO gagnant (SELECT DISTINCT email FROM joueur1 ORDER BY RAND() LIMIT 8)

A+

PS: un exemple de boucle avec while.
Modifié par Heyoan (06 Nov 2007 - 13:32)
Encore merci Heyoan, tout fonctionne.

Désolé du dérangement pour rien ^^'

Je m'étais déjà servi de ton lien pour d'autre partie de mon code. Très utile les liens à lire avant de poster^^