2012-10-24 3 views
1

Possible Duplicate:
mysql_fetch_array() expects parameter 1 to be resource, boolean given in select
Warning: mysql_num_rows() expects parameter 1 to be resource,script de connexion PHP ne fonctionne pas - lancer des erreurs

Je posté une question sur l'autre jour parce que mon script de connexion présentait simplement une page blanche, je me suis retourné sur les rapports d'erreur comme conseillé et résolu le problème, mais maintenant c'est un problème différent, quand je me connecte maintenant il me redirige parfois juste à l'écran de connexion, c'est l'emplacement pour rediriger si la connexion échoue (j'ai vérifié que j'utilise le bon mot de passe). De temps en temps, mais il apparaît l'erreur suivante.

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /Applications/MAMP/htdocs/PropSuite/login.php on line 24 

Warning: Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/PropSuite/login.php:24) in /Applications/MAMP/htdocs/PropSuite/login.php on line 26 

Ceci est mon code:

<?php 

error_reporting(E_ALL & ~E_NOTICE); 
ini_set('display_errors', TRUE); 
ini_set('display_startup_errors', TRUE); 

session_start(); //must call session_start before using any $_SESSION variables 
$username = $_POST['username']; 
$password = $_POST['password']; 
//connect to the database here 

$hostname_PropSuite = "localhost"; 
$database_PropSuite = "propsuite"; 
$username_PropSuite = "root"; 
$password_PropSuite = "root"; 
$PropSuite = mysql_pconnect($hostname_PropSuite, $username_PropSuite, $password_PropSuite) or trigger_error(mysql_error(),E_USER_ERROR); 
mysql_select_db($database_PropSuite, $PropSuite); 

$username = mysql_real_escape_string($username); 
$query = "SELECT password, salt 
     FROM users 
     WHERE username = '$username';"; 
$result = mysql_query($query); 
if(mysql_num_rows($result) < 1) //no such user exists 
{ 
    header('Location: http://localhost/PropSuite/index.php'); 

    die(); 
} 
$userData = mysql_fetch_array($result, MYSQL_ASSOC); 
$hash = hash('sha256', $userData['salt'] . Hash('sha256', $password)); 
if($hash != $userData['password']) //incorrect password 
{ 
    header('Location: http://localhost/PropSuite/index.php'); 

    die(); 
} 
else 
{ 
    validateUser(); //sets the session data for this user 
} 
//redirect to another page or display "login success" message 
header('Location: your-desired-login-location.php'); 
die() 


//redirect to another page or display "login success" message 


?> 

Je suis assez nouveau pour PHP serait donc apprécier votre aide, par la façon dont je vais a probablement des commentaires au sujet de mettre les informations de base de données directement dans le script, ce sera fait à travers un fichier de connexion éventuellement.

+0

[déjà envoyés par en-têtes PHP] (http://stackoverflow.com/questions/8028957/headers-already-sent-by-php) – deceze

+0

http://stackoverflow.com/a/2973209/476 – deceze

+0

Conseil: N'utilisez pas pconnect. C'est le mauvais choix dans ~ 99% de tous les cas. – Ron

Répondre

1

Le premier problème est la requête suivante:

$query = "SELECT password, salt 
     FROM users 
     WHERE username = '$username';"; 

Il est ramasser les espaces blancs (lacunes) sur chaque ligne. Ceci est en fait une requête non valide, ce qui explique pourquoi cette ligne ne fonctionne pas:

if(mysql_num_rows($result) < 1) //no such user exists 
{ 
    header('Location: http://localhost/PropSuite/index.php'); 

    die(); 
} 

Essayez de changer la requête à être sur une ligne:

$query = "SELECT password, salt FROM users WHERE username = '$username';"; 

Pour le débogage, essayez de mettre dans ce qui suit :

$result = mysql_query($query) or die(mysql_error()); 

En ce qui concerne les en-têtes, vous ne pouvez pas envoyer d'en-têtes dès qu'une forme de sortie s'est produite. Vous pouvez faire ce qui suit pour contourner:

<?php 
ob_start(); // Start output buffering 

error_reporting(E_ALL & ~E_NOTICE); 
ini_set('display_errors', TRUE); 
ini_set('display_startup_errors', TRUE); 
+0

Pourquoi la requête serait-elle invalide à cause des espaces? Je n'ai jamais eu de problèmes avec les espaces, et je fais beaucoup plus de décomposition de ma requête que lui. – Kao

+0

Je ne sais pas pourquoi, mais j'ai déjà eu ce problème. Peut-être son ramasser le caractère de nouvelle ligne? – Menztrual

+0

Peut-être que vous avez eu une discordance dans l'encodage de vos fichiers/fins de ligne, et la base de données? Je n'ai jamais eu ce problème moi-même. – Kao

1

Pour votre premier message d'erreur: utiliser la méthode mysql_error() pour comprendre le problème

Le second message d'erreur apparaît uniquement parce que php fait écho à la première erreur avant l'instruction en-tête() .. (rien ne doit pas être imprimés avant un en-tête() instruction) .. donc c'est normal .. corrigez la première erreur et vous ne verrez plus celle-ci.

1

Je vous suggère de vérifier si les travaux de raccordement et de remplacer la ligne 24 avec:

$result = mysql_query($query) or die(mysql_error()); 

peut-être vous trouverez une erreur (le cas échéant ...)!

La deuxième erreur est le résultat du premier, sans le premier, le second ne sera pas affiché.

3

Ce sont probablement deux des erreurs les plus courantes affichées ici sur SO.

La première erreur provient d'une erreur dans la requête, qui est renvoyée à l'écran. Cela est dû à l'absence de traitement des erreurs, modifiez le code à cela et corriger l'erreur:

$query = "SELECT password, salt 
     FROM users 
     WHERE username = '$username';"; 
$result = mysql_query($query) or die mysql_error(); 

Le second message d'erreur est le résultat de la première. Parce qu'une erreur est envoyée à l'écran, la fonction d'en-tête ne peut pas fonctionner.

Et puis il y a bien sûr le cri sans fin pour ne pas utiliser mysql_ * fonctions, car ils sont dépréciée.

1

Le problème est que votre requête ne fonctionne pas, et l'erreur que vous obtenez est à cause de cela.

Cette requête est défectueuse en quelque sorte:

SELECT password, salt 
     FROM users 
     WHERE username = '$username'; 

Essayez la requête de débogage, en faisant écho à la sortie et le coller dans PHPMyAdmin (ou tout autre gestionnaire MySQL que vous utilisez), et voir si elle fonctionne. C'est parfait pour déboguer des requêtes.

Questions connexes