[RESOLU] Erreur

Eléphant du PHP | 161 Messages

08 juin 2016, 08:08

Salut a tous je suis nouveau en php et je fais un stage dans une firme et malheureusement il n'ya persone chez qui me plie quand j'ai des Problemes et dans cette firme je suis malheureusement qu'avec les Administrateur et ils n'ont aucune idee de la programmation donc c'est la raison pour laquel je me rend sur ce site et j'espere obtenir de bon conseil de votre part merci bien.

j'ai plusieurs script et lorsque j'effectue un essais j'obtiens l'erreur suivante

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\test\login.php on line 24

la ligne 24 du script login.php est la suivante $rows = mysql_num_rows($query);

voila tout le script
<?php
session_start(); 
$error=''; 
if (isset($_POST['submit'])) {
if (empty($_POST['username']) || empty($_POST['password'])) {
$error = "Benutzername ou Password n'est pas valide";
}
else
{

$username=$_POST['username'];
$password=$_POST['password'];

$connection = mysql_connect("localhost", "root", "");

$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);

$db = mysql_select_db("company", $connection);

$query = mysql_query("select * from login where password='$password' AND username='$username'", $connection);
$rows = mysql_num_rows($query);
if ($rows == 1) {
$_SESSION['login_user']=$username; 
header("location: profile.php"); 
} else {
$error = "Benutzername ou Password n'est pas valide";
}
mysql_close($connection); 
}
}
?>
merci bien.
Modifié en dernier par Henrigo le 08 juin 2016, 14:17, modifié 1 fois.

Mammouth du PHP | 1967 Messages

08 juin 2016, 08:26

La doc php indique que mysql_query retourne False en cas d'erreur. est visiblement vu le message d'erreur c'est bien ce qu'il se passe.

Tu devrais mettre en place un système de capture d'erreur mysql pour t'aider à débugger.
il y a un exemple dans la doc (exemple#1)
http://php.net/manual/fr/function.mysql-query.php

PS sauvegarder des password en clair dans une database c'est mal !!
PS2 je te conseillerai d'oublier mysql au profit de mysqli ou de pdo, mysql n'est plus supporté dabns php7 et déprécié dés 5.X
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 161 Messages

08 juin 2016, 09:31

Salut je ne comprend pass pourquoi je teste ce code il ne reagit pas le code est suivant:
connection.php
<?php
define('DB_HOST', 'localhost');
define('DB_NAME', 'kantteile');
define('DB_USER','root');
define('DB_PASSWORD','');

$con=mysql_connect(DB_HOST,DB_USER,DB_PASSWORD) or die("Failed to connect to MySQL: " . mysql_error());
$db=mysql_select_db(DB_NAME,$con) or die("Failed to connect to MySQL: " . mysql_error());

function login()
{
session_start();   
if(!empty($_POST['user']))   
{
	$query = mysql_query("SELECT *  FROM UserName where userName = '$_POST[user]' AND pass = '$_POST[pass]'") or die(mysql_error());
	$row = mysql_fetch_array($query) or die(mysql_error());
	if(!empty($row['userName']) AND !empty($row['pass']))
	{
		$_SESSION['userName'] = $row['pass'];
		echo "login reussi";

	}
	else
	{
		echo "votre mot de pass est faux";
	}
}
}
if(isset($_POST['submit']))
{
	SignIn();
}

?>
j'ai cree au prealable une table dans ma base de donnees kantteile comme suit
CREATE TABLE UserName
(
UserNameID int(9) NOT NULL auto_increment,
userName VARCHAR(40) NOT NULL,
pass VARCHAR(40) NOT NULL,
PRIMARY KEY(UserNameID)
);
ensuite j'ai insere deux utilisateurs comme suis
INSERT INTO 
UserName1 (userName, pass) 
UserName2 (userName, pass) 
VALUES
("toto","123");
("tata","234");
malheureusement il ne se connecte pas, ou peut etre le probleme. Merci bien

Mammouth du PHP | 1967 Messages

08 juin 2016, 10:34

fait afficher ta requète et teste la dans phpmyadmin

Et met ton where en MAJUSCULE, cela a une importance en sql
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

08 juin 2016, 12:53

Et met ton where en MAJUSCULE, cela a une importance en sql
Non, le langage SQL n'est pas sensible à la casse. WHERE, where ou WhErE fonctionnent tout aussi bien les uns que les autres. Ce qui peut être sensible à la casse en revanche ce sont les données présentes en base.


Quand tu dis qu'il ne se connecte pas c'est parce que tu as le message "votre mot de pass est faux" ?
As-tu d'autres message d'erreur ? Ta requête ne récupère pas correctement les informations envoyée en post (il manque les apostrophes autour des noms des indexes). Ceci devrait être mieux :
$sql = "SELECT *  FROM UserName where userName = '" . $_POST['user'] . "' AND pass = '" . $_POST['pass'] . "'";
et si nécessaire, comme suggéré par Spols, affiche la valeur de $sql et vérifie que la requête s'exécute bien sur ta base :)


Attention : ce code utilise les valeurs soumises par l'utilisateur sans aucun contrôle de ces dernières. Il y a des risques d'injection SQL ou tout simplement d'erreur, qu'il faudra penser à contrôler.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 161 Messages

08 juin 2016, 14:15

Salut a tous,
merci bien de la question, quand je dis qu'il ne se connecte pas , c'est que j'aurai attendu recevoir le message suivant
"login reussi"

malheureusement je reste sur la page d'entre (html,css) a savoir d'ou j'entre le nom et le mot de passe.
ce que je trouve bizard est que il ne me revoit pas
"Failed to connect to MySQL: "
Ne soyez pas surpprit de ma maniere donc j'ecris avec des fautes je vis en Allemagne

par ailleur Ryle j'ai change les apostrophes autour des noms des indexes mais toujours rien.

mais je ne sais si je le fais mal, donc cette maniere d'ecrire ma requete n'est pas correct?
$query = mysql_query("SELECT *  FROM UserName where userName = '$_POST[user]' AND pass = '$_POST[pass]'") or die(mysql_error());
Merci bien

Mammouth du PHP | 1967 Messages

08 juin 2016, 15:18

dans ton dernier code, tu as tout mis dans une fonction login(). Appel tu cette fonction quelque part ?
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 161 Messages

08 juin 2016, 15:32

bonne question, voila a quoi resemble le code de ma page d'acceuil il sont tous des scripts php
et si le bosion l'oblige je peus meme poster le mon code css
<?php
include('connection.php');
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">. 
<html>
<head>
<title>SYSTEM</title>
  <link href="style.css" rel="stylesheet" type="text/css">
   </head>
      <body>
        <div id="main">
         <h1 style="text-align: center">SYSTEM</h1>
            <div id="login">
              <h2>Login</h2>
                 <form action="" method="post">
                    <label>Benutzername :</label>
                    <input id="name" name="username" placeholder="Benutzername" type="text">    
                  <label>Password :</label>
                 <input id="password" name="password" placeholder="Passwort" type="password">
                <input name="submit" type="submit" value=" Login ">
              <span><?php echo $error; ?></span>
            </form>
          </div>
        </div>
       </body>
</html>
Modifié en dernier par Henrigo le 08 juin 2016, 15:44, modifié 1 fois.

Eléphant du PHP | 161 Messages

08 juin 2016, 15:39

meme en supprimant la ligne suivante
<span><?php echo $error; ?></span>
rien ne change

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

08 juin 2016, 15:53

En html, ce sont les noms des champs qui sont envoyés avec le formulaire :
<label>Benutzername :</label>
<input id="name" name="username" placeholder="Benutzername" type="text">    
<label>Password :</label>
<input id="password" name="password" placeholder="Passwort" type="password">
tu vas donc recevoir une variable $_POST['username'] et pas $_POST['user'] qui est l'id du champ. Pour vérifier les valeurs reçues, tu peux faire un print_r() ou un var_dump() de $_POST dans ton script php.


Comme indiqué par Spols, ton traitement de connexion est fait dans la fonction login(), mais à aucun moment dans ton code tu ne fais appel à celle-ci.
if(isset($_POST['submit']))
{
  SignIn();
}
Ici tu appelles une fonction SignIn() qui n'est pas définie au lieu de login(). Il te faut donc modifier cet appel dans ton code, sinon la fonction n'est jamais exécutée (et c'est pour ça que tu n'as pas de message d'erreur ou de confirmation de la connexion).


Enfin, dans cette fonction login(), tu vérifies si la variable $_POST['user'] n'est pas vide. Comme indiqué plus haut, ton formulaire envoi actuellement la variable $_POST['username']. Il faut donc soit modifier le nom de l'input dans ton formulaire (en remplaçant username par user), soit modifier ton traitement php pour utiliser $_POST['username'] et non $_POST['user'] (et c'est aussi pour ça que tu n'as pas de message d'erreur ou de confirmation de la connexion)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 161 Messages

08 juin 2016, 16:12

Merci a tous,
Merci bien c'etait cela le probleme.
c'est resolu

ce qui est par ailleur bizard est que
lorsque j'entre un faux username ou faux passwort je ne recois aucune erreur en retour.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

08 juin 2016, 16:30

Pour ton message d'erreur, c'est parce que tu définis celui-ci dans une variable $error qui est propre à ta fonction login(). Quand tu demandes à afficher $error en dehors de celle-ci, php considère qu'il s'agit d'une autre variable et du coup n'affiche rien.

Pour éviter cela tu peux soit faire un return dans ta fonction pour renvoyer le message d'erreur ou de confirmation et récupérer celui-ci en retour de la fonction. Tu auras bien alors une variable définie en dehors de la fonction et php pourra l'afficher.

Une autre solution consiste à dire à php que cette variable $error est une variable globale et que si la fonction login() la met à jour, ce n'est pas une nouvelle variable locale qui doit être utilisée, mais bien la variable globale qui se trouve en dehors de la fonction. Pour cela, il suffit d'ajouter l'instruction " global $error; " dans ta fonction :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 161 Messages

09 juin 2016, 07:42

Salut le probleme je l'ai resolu autrement si tu regarde la ligne suvante
$row = mysql_fetch_array($query) or die(mysql_error());
j'ai du juste me debarasse de
or die(mysql_error())
et il la fonctionne.
Merci beaucoup de vos proposition