Chyba....

Ahoj lidi,
mám skript na změnu hesla a když zadám správné údaje tak se mi napíše chyba: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /3w/wz.cz/v/vostroni/member_area/zmena_hesla.php on line 70

Nechápu proč...
Zde je skript










<head>
<title>Vostroni: Změna hesla</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
<link rel="stylesheet" type="text/css" href="style/flash.css" media="screen">
<link rel="stylesheet" type="text/css" href="style/print.css" media="print">
<script src="style/flash.js" language="JavaScript" type="text/javascript"></script>
</head>

<body>

<br>
<h1> Změna hesla </h1>

<?php
include 'db.php';

function formular()
{
?>
<form method="post" action="zmena_hesla.php">
<table border="0" cellspacing="0" cellpadding="4">
<tr>
<td>Vaše uživatelské jméno:</td>
<td><input name="user_name" type="text" class="kolonka"></td>
</tr>
<tr>
<td>Vaše staré heslo:</td>
<td><input name="old_password" type="text" class="kolonka"></td>
</tr>
<tr>
<td>Vaše nové heslo:</td>
<td><input name="new_password" type="text" class="kolonka"></td>
</tr>
<tr>
<td> </td>
<td>
<input type="hidden" name="recover" value="recover">
<input type="submit" class="tlacitko" name="Submit" value="Změnit heslo!">
</td>
</tr>
</table>
</form>

</body>

<?php
}

switch($_POST['recover']){
default:
formular();
break;

case "recover":
recover_pw($_POST['old_password']);
recover_pw($_POST['new_password']);
break;
}

function recover_pw($old_password){
if(!$old_password){
echo "<p>Chybí heslo!</p>";
formular();
exit();
}

$sql_check = mysql_query("SELECT * FROM users WHERE user_name='$user_name' AND password='$old_password'");
$sql_check_num = mysql_num_rows($sql_check);
if($sql_check_num == 0){
echo "<p>Uživatelské jméno nebo heslo není v databázi!</p>";
formular();
exit();
}

$db_password = md5($new_password);

$sql = mysql_query("UPDATE users SET password='$db_password' WHERE user_name='$user_name' AND password='$old_password'");

$subject = "Změna hesla!";
$message = "Dobrý den,

změnil jste si heslo: $old_password
na: $new_password

Pokud jste takto neučinil Vy tak vaše heslo změnil někdo kdo znal staré heslo.

S pozdravem
Webmaster

Toto je automaticky sestavený email. Prosím neodpovídejte na něj!";

mail($email_address, $subject, $message, "From: Webmaster<Pampuch22@seznam.cz>\nX-Mailer: PHP/" . phpversion());
echo "<p>Byl odeslán email s novým heslem!</p>";
formular();
}
?>
ja mam taky tusak, ze by to mohlo byt tym, ze ked pouzivas where, a pripadne dake AND, tak by si mal asi pouzivat zatvorky.. where (user='$user' and xx='$xx').

Mozno nie, ale stopercentne ak mas daku taku chybu, tak to je chyba v mysql_query("... a kedze nemas nakonci ) or die(mysql_error());, tak ...

Skus si to tam napisat a malo by ti vyhodit presnejsiu chybu
>> $sql_check = mysql_query("SELECT * FROM users WHERE user_name='$user_name' AND password='$old_password'");


IMHO tenhle dotaz neobsahuje syntaktickou chybu a je na řádku 70. Ještě jednou zkontroluj, jestli souhlasí název tabulky a názvy sloupců v dotazu. Závorky tam být nemusí.

Zkus případně použít ještě:

$sql_check = mysql_query("SELECT * FROM users WHERE user_name like '".$_POST["user_name"]."' AND password like '".$_POST["old_password"]."'");
nebo mas chybu v pripojeni (db.php).
Lidi, prosím vás,
řádek 70 je tento:
$sql_check_num = mysql_num_rows($sql_check);

Vypíše se mi vlastní chyba: Uživatelské jméno nebo heslo není v databázi!
<HTML><i>Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /3w/wz.cz/v/vostroni/member_area/zmena_hesla.php on line 70
</i>


Warovani: Parametr mysql_num_rows() neni spravny vysledek mysql dotazu.... = chyba je v dotazu ve funkci mysql_query()

predelej (vloz) tohle:

$sql_check = mysql_query("SELECT * FROM users WHERE user_name='$user_name' AND password='$old_password'");
<b>echo mysql_error();</b>

$sql_check_num = mysql_num_rows($sql_check);</HTML>
Mám ještě jednu otázku, jde udělat toto:

$sql_check = mysql_query("SELECT * FROM users WHERE username='$_SESSION['user_name']'");

Nebo jak to mam nahradit...
$sql_check = mysql_query("SELECT * FROM users WHERE username='".$_SESSION['user_name']."'");
případně

$sql_check = mysql_query("SELECT * FROM users WHERE username='$_SESSION[user_name]'");

ale doslechl jsem se, že používání dvojitých uvozovek zpomaluje běh php skriptů.
to je logicke,ale je to bezna praxe kterou neni treba nikterak zvlast resit, navic je to imho nepoznatelne
ještě v php4 a výš se dá:
$sql_check = mysql_query("SELECT * FROM users WHERE username='{$_SESSION[user_name]}'");

ještě k té chybě, je to fakt v dotazu, pokud je špatně, tak mysql_num_rows() pochopitelně hlásí chybu. Podíval, když si zkusíš vypsat, ten sql dotaz, tak to myslím bude jasné. Jestli už není. ;-)
Nejsem odborník, ale v manuálu je toto:
http://dev.mysql.com/doc/mysql/en/Logical_Operators.html

AND
&&
Logical AND. Evaluates to 1 if all operands are non-zero and not NULL, to 0 if one or more operands are 0, otherwise NULL is returned. mysql> SELECT 1 && 1;
-> 1
mysql> SELECT 1 && 0;
-> 0
mysql> SELECT 1 && NULL;
-> NULL
mysql> SELECT 0 && NULL;
-> 0
mysql> SELECT NULL && 0;
-> 0

třeba to pomůže

Zbyněk