PDA

View Full Version : درباره خطای Warning: mysql_num_rows() کسی میدونه؟؟؟



arezoo021
سه شنبه 13 خرداد 1393, 02:29 صبح
دوستان چیکار کنم این خطا رو نده؟


Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /home/host/public_html/get_register.php on line 40

اینم کد صفحه که اینجا آپلود کردم:

http://upir.ir/93.3/r.zip

ravand
سه شنبه 13 خرداد 1393, 09:30 صبح
از این دستور استفاده کنن تا علت مشکل رو بهت بگه:

or die (mysql_error());

arezoo021
سه شنبه 13 خرداد 1393, 12:39 عصر
منظورتون رو متوجه نشدم. از این دستور در کجا استفاده کنم؟ من خیلی مبتدی هستم

Mori Bone
سه شنبه 13 خرداد 1393, 12:47 عصر
حتما متغیری که از نوع ریسورس هست مشکل داره. همون متغیری که به mysql_num_rows میدین.
کدتون لطفا

arezoo021
سه شنبه 13 خرداد 1393, 13:34 عصر
این کد هستش اما نمیدونم چرا بهم میریزه. یجا دیگه آپلود کردم همین کد رو


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl"><head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Language" content="fa"> <script type="text/javascript" language="JavaScript" src="JScripts/amin.js"></script><script type="text/javascript" language="JavaScript" src="JScripts/calendar.js"></script>
<script type="text/javascript" src="jscripts/livevalidation.js"></script><body ><?php // PHP Is Love :Dinclude 'db_connect.php';include 'jdf.php';$mes='';function isValidEmail($email){ $pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$"; if (@mb_eregi($pattern, $email)){ return true; } else { return false; } }$v1=$_GET['v1'];$v2=$_GET['v2'];$v3=$_GET['v3'];$v4=$_GET['v4'];$v5=$_GET['v5'];$v6=$_GET['v6'];$v7=$_GET['v7'];$v8=$_GET['v8'];$v9=$_GET['v9'];$v10=$_GET['v10'];$v11=$_GET['v11']; $rs_duplicates = mysql_query("select * from user where username='$v1'"); $duplicates = mysql_num_rows($rs_duplicates); if ($duplicates > 0) $mes=$mes.'كدكاربري وارد شده تكراري ميباشد'.'<br>'; if (strlen($v1)<5) $mes=$mes.'تعدادكاراكترهاي واردشده براي كدكاربري كمتراز حدمجاز ميباشند.' .'<br>'; if($v2<>$v3) $mes=$mes.'رمزهاي واردشده با هم مساوي نيستند' .'<br>'; if ((strlen($v2)<5) or (strlen($v2)<5)) $mes=$mes.'تعدادكاراكترهاي واردشده براي رمز كمترازحدمجاز ميباشند' .'<br>'; if (!isValidEmail($v4)) $mes=$mes.'آدرس ايميل واردشده نامعتبرميباشد' .'<br>'; if (strlen($v6)<3) $mes=$mes.'تعدادكاراكترهاي واردشده براي نام كمتراز حدمجاز ميباشند.' .'<br>'; if (strlen($v7)<3) $mes=$mes.'تعدادكاراكترهاي واردشده براي نام خانوادگي كمتراز حدمجاز ميباشند.' .'<br>'; if (!is_numeric($v8)) $mes=$mes.'شماره تلفن واردشده نامعتبر ميباشد' .'<br>'; if (strlen($v9)<6) $mes=$mes.'تعدادكاراكترهاي واردشده براي دارنده حساب كمتراز حدمجاز ميباشند.' .'<br>'; if (strlen($v10)<5) $mes=$mes.'شماره حساب نامعتبر ميباشد' .'<br>';if ( empty($mes)){ $md5pass = md5($v2); $nextWeek = time() + ((11 * 60 * 60)+30*60); $reg_date=jdate('Y/m/d',$nextWeek); mysql_query("INSERT INTO user VALUES ('$v1','$md5pass','$v4','$v5','$v6','$v7','$v8','$ v9','$v10','$v11','$reg_date')") or die(mysql_error());echo 'عضويت شما با موفقيت انجام شد براي ورود به سايت '.'&nbsp;<a href="login.php" target="_self" style="color:#FFFFFF"><b>اينجـا</b></a>&nbsp;'.'كليك كنيد';}else{echo 'اخطار؟'.'<br>';echo $mes;}?> </body></html>

بفرمایید :
http://upir.ir/93.3/r.zip

Mori Bone
سه شنبه 13 خرداد 1393, 13:51 عصر
منو تو این فایلت مشکلی نمی بینم.
مگر اینکه توی کد زیر مشکلی وجود داشته باشه.
mysql_query("select * from user where username='$v1'")
که شما باید اطمینان داشته باشد از اینه نام جدول و نام فیلدهارو درس وارد کرده باشید.

arezoo021
سه شنبه 13 خرداد 1393, 14:00 عصر
اگر مقدار فیلد خالی باشه چی؟

Mori Bone
سه شنبه 13 خرداد 1393, 14:02 عصر
میشه کامل تر توضیح بدید. یعنی نام فیلد داخله جدول خالیه:متفکر:
هر مشکلب هست از اون کوئریس

arezoo021
سه شنبه 13 خرداد 1393, 14:08 عصر
همینجوری برنامه هیچ اروری نمیده. اما اگه با نرم افزار Acunetix چک کنم سایت رو ارور sql injection میگیره از این کد

-سیّد-
سه شنبه 10 تیر 1393, 07:50 صبح
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /home/host/public_html/get_register.php on line 40



اگه به پیغام خطا خوب دقت کنید، داره می‌گه که پارامتر شماره‌ی یک که به تابع mysql_num_rows می‌دید، باید از نوع resource باشه ولی از نوع boolean هست.
حالا این پارامتر چیه؟ متغیر rs_duplicates هست که خروجی تابع قبلی یعنی mysql_query هست. پس نتیجه می‌گیریم که این تابع به شما boolean برگردونده.
اگه به manual این تابع مراجعه کنید:
http://ir.php.net/manual/en/function.mysql-query.php
می‌بینید که در مورد خروجی تابع اینطور نوشته:

For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource (http://ir.php.net/manual/en/language.types.resource.php) on success, or FALSE on error.
پس نتیجه می‌گیریم که به علت بروز خطا در اجرای تابع، به شما FALSE برگردونده شده.
حالا اگه می‌خواین ببینین که این خطا چی بوده، می‌تونین از تابع mysql_error استفاده کنین. یعنی بعد از اجرای تابع mysql_query:

if ($rs_duplicates === false) die(mysql_error());
یا همونطور که دوستمون گفتن، اون بخش mysql_query رو به این صورت بنویسید:

$rs_duplicates = mysql_query("select * from user where username='$v1'") or die(mysql_error());
هشدار!
این کار از نظر امنیتی بسیار کار خطرناکیه. لطفاً بعد از این که این کد رو زدید و اشکال کار رو متوجه شدید، بلافاصله این بخش چاپ کردن خطا رو حذف کنید.

به نظر من می‌رسه که اشکال ممکنه از اینجا باشه که mysql_connect رو صدا نزدید تا به پایگاه داده وصل بشید. در هر صورت با انجام عملیات بالا متوجه اشکال خواهید شد. (ممکنه username یا password اتصال به پایگاه داده اشتباه باشه، یا هر چیز دیگه)

در مورد این که acunetix به شما هشدار SQL Injection می‌ده، ربطی به این خطا نداره. ولی راست می‌گه! چون توی کدتون به علت این که متغیر v1 رو مستقیماً توی query انداختین، خطر SQL Injection هست. سریعترین راه برای رفع این مشکل، استفاده از تابع addslashes موقع مقداردهیه. یعنی به جای

$v1=$_GET['v1'];
از

$v1=addslashes($_GET['v1'];
استفاده کنید. البته این راه خوبی نیست! ولی سریعترین راهه.

برای اطلاعات بیشتر به این آدرس مراجعه کنید:
(http://php.net/manual/en/security.database.sql-injection.ph)http://php.net/manual/en/security.database.sql-injection.php