Problème de formulaire msyql

Répondre
Kniva
le 02/06/2010 à 18:00
Kniva
Bonjour, ou rebonjour.
Voila, un autre souci sur une autre page. J'ai fait une page identification. Sur cette page, soit on s'identifie, soit on s'enregistre. J'ai passé pas mal de temps dessus, mais je stagne sur cette faute

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /mnt/web9/31/99/52403599/htdocs/login.php on line 14
Requête en échec 1.

Je sais qu'un argument n'est pas valide, mais je n'arrive pas à savoir quoi
Voici la partie du code

<?php
/*Programme: Login.php
Description: Programme de login pour la section à accès réservé de la boutique.
Il propose 2 options: s'identifier
créer un nouveau compte.*/

session_start();
include("inf.php");//on définit la base de données, identifiant
switch (@$_POST['do'])
{
case "login":
$cxn=mysql_connect(SERVER,LOGIN,MDP,BDD) or die("Connexion impossible au serveur dans case login.");
$sql="SELECT loginName FROM member WHERE loginName='$_POST[fusername]'";
$result=mysql_query($cxn,$sql) or die ("Requête en échec 1.");
$num=mysql_num_rows($result);
if($num>0)//loginName non trouvé
{
$sql="SELECT loginName FROM member WHERE loginName='$_POST[fusername]' AND password=md5('$_POST[fpassword]')";
$result2=mysql_query($cxn,$sql) or die ("Requête en échec2.");
$num2=mysql_num_rows($result2);

if($num2>0) // mot de passe OK
{
$_SESSION['auth']="yes";
$logname=$_POST['fusername'];
$_SESSION['logname']=$logname;
$today=date("y-m-d h:i:s");
$sql="INSERT INTO Login(loginName,loginTime) VALUES ('$logname', '$today')";
$result=mysql_query($cxn,$sql) or die ("INSERT en échec.");
header("Location: membres.php");
}
else // mot de passe incorrect
{
$message="Le nom de Login '$_POST[fusername]' existe, mais le mot de passe ne correspond pas! Réessayez.<br>";
include("login_form.inc");
}
}
elseif($num==0)//Nom de longin introuvable
{
$message="Le nom de Login que vous avez saisi n'existe pas. Essayez une nouvelle fois.<br>";
include("login_form.inc");
}
break;
?>
LA GLOBULE
le 02/06/2010 à 20:03
LA GLOBULE
Alors, tu as ce message parce que ta requete SQL n'est pas valide.

En effet, ton code est victime d'injection SQL via ton $_POST.
Pour éviter cela, il faut utiliser la fonction mysql_real_escape_string.

Exemple :
<?php
$sql = "SELECT loginName FROM member WHERE loginName='".mysql_real_escape_string($_POST[fusername])."'";
?>


Sinon es tu sur de vouloir utiliser $_POST[fusername] et non $_POST['fusername'] ? Car ce n'est pas la meme chose. Le premier va utiliser la valeur de la constante fusername et rechercher si il trouve un index de cette valeur dans le tableau $_POST. Ce n'est pas la même chose que de rechercher l'index fusername dans le tableau $_POST.

PS : modifie toutes tes requêtes comme je te l'ai montré.
Kniva
le 03/06/2010 à 10:17
Kniva
J'ai toujours la même erreur.

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /mnt/web9/31/99/52403599/htdocs/login.php on line 14
Requête en échec 1.

J'ai modifié mes requêtes comme tu me l'as montré

<?php
/*Programme: Login.php
Description: Programme de login pour la section à accès réservé de la boutique.
Il propose 2 options: s'identifier
créer un nouveau compte.*/

session_start();
include("inf.php");//on définit la base de données, identifiant
switch (@$_POST['do'])
{
case "login":
$cxn=mysql_connect(SERVER,LOGIN,MDP,BDD) or die("Connexion impossible au serveur dans case login.");
$sql="SELECT loginName FROM member WHERE loginName='".mysql_real_escape_string($_POST['fusername'])."'";
$result=mysql_query($cxn,$sql) or die ("Requête en échec 1.");
$num=mysql_num_rows($result);
if($num>0)//loginName non trouvé
{
$sql="SELECT loginName FROM member WHERE loginName='$_POST[fusername]' AND password=md5'".mysql_real_escape_string($_POST['fpassword'])."'";
$result2=mysql_query($cxn,$sql) or die ("Requête en échec2.");
$num2=mysql_num_rows($result2);

if($num2>0) // mot de passe OK
{
$_SESSION['auth']="yes";
$logname=$_POST['fusername'];
$_SESSION['logname']=$logname;
$today=date("y-m-d h:i:s");
$sql="INSERT INTO Login(loginName,loginTime) VALUES ('$logname', '$today')";
$result=mysql_query($cxn,$sql) or die ("INSERT en échec.");
header("Location: membres.php");
}
else // mot de passe incorrect
{
$message="Le nom de Login '$_POST[fusername]' existe, mais le mot de passe ne correspond pas! Réessayez.<br>";
include("login_form.inc");
}
}
elseif($num==0)//Nom de longin introuvable
{
$message="Le nom de Login que vous avez saisi n'existe pas. Essayez une nouvelle fois.<br>";
include("login_form.inc");
}
break;
?>
dark_nemo
le 03/06/2010 à 10:51
dark_nemo
T'as un gros problème de conception. Parfois tu utilises
$_POST[fusername] parfois tu utilises $_POST['fusername']

$_POST[fusername] sous entend que t'as une contante fusername quelque part dans ton code.
$_POST['fusername'] sous entend que t'as un champ fusername dans ton formulaire.

Remplace tes "or die" par ça

or die ('Erreur : '.mysql_error());

Ensuite et de façon générale, il faut tester le retour de chaque fonction php. C'est long et ça prend du temps mais c'est indispensable pour bien programmer

Un dernier point, je ne vois aucun mysql_close dans ton code. Il faut fermer la connexion dès que possible et libérer la memoire avec mysql_free_result.
Voila déjà quelques pistes pour avancer un peu
Kniva
le 03/06/2010 à 13:48
Kniva
Un de mes défauts, tête ne l'air, je peux mettre parfois un ' là ou il faut pas...
J'ai changé, et mis or die ('Erreur:' .mysql_error());
J'ai relu mon code, mais ça ne change pas grand chose


Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /mnt/web9/31/99/52403599/htdocs/login.php on line 14
Erreur :


Toujours la même ligne qui pose problème

<?php
/*Programme: Login.php
Description: Programme de login pour la section à accès réservé de la boutique.
Il propose 2 options: s'identifier
créer un nouveau compte.*/

session_start();
include("inf.php");//on définit la base de données, identifiant
switch (@$_POST['do'])
{
case "login":
$cxn=mysql_connect(SERVER,LOGIN,MDP) or die ('Erreur : '.mysql_error());
$sql="SELECT loginName FROM member WHERE loginName='".mysql_real_escape_string($_POST[fusername])."'";
$result=mysql_query($cxn,$sql) or die ('Erreur : '.mysql_error());
if($num>0)//loginName non trouvé
{
$sql="SELECT loginName FROM member WHERE loginName=='".mysql_real_escape_string($_POST[fusername])."'
AND password=md5'".mysql_real_escape_string($_POST[fpassword])."'";
$result2=mysql_query($cxn,$sql) or die ('Erreur : '.mysql_error());
$num2=mysql_num_rows($result2);
?>
dark_nemo
le 03/06/2010 à 14:17
dark_nemo
C'est logique et c'est marqué dans l'erreur, tu as inversé dans mysql_query la requête et resource.
Donc MySQL t'indique que la resource n'est pas bonne.
<?php
$result=mysql_query($sql,$cxn);
?>

devrait mieux fonctionner
Kniva
le 03/06/2010 à 14:33
Kniva
Effectivement, ça fonctionne mieux, bon ce n'est pas encore exceptionnel, mais j'ai un autre message d'erreur:

Erreur : No database selected


Alors que dans mon code, j'ai:
<?php
/*Programme: Login.php
Description: Programme de login pour la section à accès réservé de la boutique.
Il propose 2 options: s'identifier
créer un nouveau compte.*/

session_start();
include("inf.php");//on définit la base de données, identifiant
switch (@$_POST['do'])
{
case "login":
$cxn=mysql_connect(SERVER,LOGIN,MDP,BDD) or die ('Erreur : '.mysql_error());
$sql="SELECT loginName FROM member WHERE loginName='".mysql_real_escape_string($_POST[fusername])."'";
$result=mysql_query($sql,$cxn) or die ('Erreur : '.mysql_error());
if($num>0)//loginName non trouvé
{
$sql="SELECT loginName FROM member WHERE loginName=='".mysql_real_escape_string($_POST[fusername])."'
AND password=md5'".mysql_real_escape_string($_POST[fpassword])."'";
$result2=mysql_query($sql,$cxn) or die ('Erreur : '.mysql_error());
$num2=mysql_num_rows($result2);
?>


Pourtant je stipule bien dans quel base de données je suis
moogli
le 03/06/2010 à 15:07
moogli
salut,

comme l'indique la documentation de mysql_connect le 4ème argument n'est pas le nom de la base de à utiliser.
¨Pour cela il te faut utiliser mysql_select_db juste après le mysql_connect. Cette fonction est obligatoire, elle est la solution à ton message d'erreur ;)

@+
Il en faut peu pour être heureux !!!!!
Kniva
le 04/06/2010 à 10:36
Kniva
Merci pour le coup de main.
Maintenant j'ai une erreur, mais elle est générée par mon code.
En effet, j'essaye de me loger, mais je vois mon message d'erreur, Le nom du login que vous avez saisi n'existe pas. Essayez encore.
Or j'ai vérifié trois fois si je ne me trompais pas mais ce n'est pas le cas.

Revoici mon code:

<?php
/*Programme: Login.php
Description: Programme de login pour la section à accès réservé de la boutique.
Il propose 2 options: s'identifier
créer un nouveau compte.*/

session_start();
include("inf.php");//on définit la base de données, identifiant
switch (@$_POST['do'])
{
case "login":
$cxn=mysql_connect(SERVER,LOGIN,MDP) or die ('Erreur : '.mysql_error());
mysql_select_db(BDD,$cxn) or die("Impossible d'ouvrir la base de données ");
$sql="SELECT loginName FROM member WHERE loginName='".mysql_real_escape_string($_POST[fusername])."'";
$result=mysql_query($sql,$cxn) or die ('Erreur : '.mysql_error());
if($num>0)//loginName non trouvé
{
$sql="SELECT loginName FROM member WHERE loginName=='".mysql_real_escape_string($_POST[fusername])."'
AND password=md5'".mysql_real_escape_string($_POST[fpassword])."'";
$result2=mysql_query($sql,$cxn) or die ('Erreur : '.mysql_error());
$num2=mysql_num_rows($result2);

if($num2>0) // mot de passe OK
{
$_SESSION['auth']="yes";
$logname=$_POST['fusername'];
$_SESSION['logname']=$logname;
$today=date("y-m-d h:i:s");
$sql="INSERT INTO Login(loginName,loginTime) VALUES ('$logname', '$today')";
$result=mysql_query($cxn,$sql) or die ("INSERT en échec.");
header("Location: membres.php");
}
else // mot de passe incorrect
{
$message="Le nom de Login '$_POST[fusername]' existe, mais le mot de passe ne correspond pas! Réessayez.<br>";
include("login_form.inc");
}
}
elseif($num==0)//Nom de longin introuvable
{
$message="Le nom de Login que vous avez saisi n'existe pas. Essayez une nouvelle fois.<br>";
include("login_form.inc");
}
break;
mysql_close();?>


et celui ou on rempli les champs:
<?php 
/* Fichier:login_form.inc
Description: Affiche la page de login. Celle-ci présente 2 formulaires:
saisir le nom du login existant et mot de passe associé
saisir info permettant d'enregistrer en tant que nouveau membre.*/

?>
<html>
<head>
<title> Page d'accueil des membres et futurs membres</title>
<link rel="shortcut icon" type="image/png" href="favicon.png" />
<LINK type="text/css" rel="stylesheet" href="styles.css">
<SCRIPT LANGUAGE="JavaScript">
function popup(page) {
window.open(page,'popup','width=500,height=400,toolbar=false,scrollbars=false');
}
function popop(page) {
window.open(page,'popup','width=500,height=300,toolbar=false,scrollbars=false');
}
</SCRIPT>
</head>
<body bgcolor="#9FB6CD">
<center>
<div id="conteneur">
<table border="0" cellpadding="3" cellspacing="0" width="800">
<tr>
<td><a href="index.html"onMouseOver="document.img_8.src='indexbis2.png';"
onMouseOut="document.img_8.src='indexbis.png';">
<img class="img" name="img_" src="indexbis.png"> </a></td>
</tr>
<tr align="center"style="background-image: url(fondbannbis.png)" height="256" width="800">
<td colspan="3" valign="bottom"> <img src="Logoidentification.png"> </td>
</tr>
<tr align="center"style="background-image: url(fondid.png)" height="507">
<td width="35%" valign="top" class="bold-large">&Ecirc;tes-vous déja membre?
<!--pour le login des nouveaux membres-->
<form action="login.php" method="POST">
<table border="0">
<?php
if(isset($message))
{
echo"<tr>
<td style='color:red' colspan='2'>$message<br/></td>
</tr>";
}
?>
<tr>
<td class="bold-right">Identifiant</td>
<td><input type="text" name="fusername" size="20"></td>
</tr>
<tr>
<td class="bold-right"> Mot de passe</td>
<td><input type="password" name="fpassword" size="20"></td>
</tr>
<input type="hidden" name="do" value="login">
<tr>
<td style="text-align:center" colspan="2"><br/>
<input type="submit" name="log" value="Identifiez-vous"></td>
</tr>
</table>
</form>
</td>
LA GLOBULE
le 04/06/2010 à 11:06
LA GLOBULE
Tu n'as toujours pas compris la remarque qu'on a pu faire sur l'utilisation de $_POST[fusername] qui était différente de $_POST['fusername'] ?
Répondre
LoadingChargement en cours