# زبان های اسکریپتی > PHP > امنیت در PHP >  درباره خطای Warning: mysql_num_rows()  کسی میدونه؟؟؟

## arezoo021

دوستان چیکار کنم این خطا رو نده؟



```
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

از این دستور استفاده کنن تا علت مشکل رو بهت بگه:
or die (mysql_error());

----------


## arezoo021

منظورتون رو متوجه نشدم. از این دستور در کجا استفاده کنم؟ من خیلی مبتدی هستم

----------


## Mori Bone

حتما متغیری که از نوع ریسورس هست مشکل داره. همون متغیری که به mysql_num_rows میدین.
کدتون لطفا

----------


## arezoo021

این کد هستش اما نمیدونم چرا بهم میریزه. یجا دیگه آپلود کردم همین کد رو

<!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

منو تو این فایلت مشکلی نمی بینم.
مگر اینکه توی کد زیر مشکلی وجود داشته باشه.
mysql_query("select * from user where username='$v1'")
که شما باید اطمینان داشته باشد از اینه نام جدول و نام فیلدهارو درس وارد کرده باشید.

----------


## arezoo021

اگر مقدار فیلد خالی باشه چی؟

----------


## Mori Bone

میشه کامل تر توضیح بدید. یعنی نام فیلد داخله جدول خالیه :متفکر: 
هر مشکلب هست از اون کوئریس

----------


## arezoo021

همینجوری برنامه هیچ اروری نمیده. اما اگه با نرم افزار Acunetix چک کنم سایت رو ارور sql injection میگیره از این کد

----------


## -سیّد-

> ```
> 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 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.da...-injection.php

----------

