PDA

View Full Version : صحیح بودن دستور sql برای چک کردن نام کاربری



edenarezo
جمعه 29 دی 1391, 23:04 عصر
با سلام
در یکی از سایت های خارجی ، تابعی برای چک کردن نام کاربری دیدم، که برای استخراج نام کاربری مورد نظر از دیتابیس از کوئری زیر استفاده کرده بود.


mysql_query("SELECT COUNT ('user_id') FROM users WHERE username='$username' ")

این کوئری رو در تابع زیر استفاده کرده بود.

function user_exists($username)
{
$username= sanitize($username);
return (mysql_result(mysql_query("SELECT COUNT ('user_id') FROM users WHERE username='$username' "),0) == 1) ? true : false ;
}

من از این تابع استفاده کردم. اما متاسفانه ارور داد. دستور count برای شماردن تعداد سطرهای یک جدول هست. چه لزومی بوده که از این Count استفاده کرده؟ و همچنین پارامتری هم که داخل count هست، نام ستون نام کاربری نیست!. ارور :

Warning: mysql_result() expects parameter 1 to be resource, boolean given in

iner30
جمعه 29 دی 1391, 23:54 عصر
mysql_result(mysql_query("SELECT count(user_id) FROM user WHERE user_name='$username' "),0) == 1 ? true : false ;


اگه نام کاربری موجود باشه مقدار 1 رو برمیگردونه ، اگرم موجود نباشه NULL

rezaonline.net
شنبه 30 دی 1391, 00:38 صبح
چرا این ؟

SELECT count(user_id) FROM user WHERE user_name='$username'
خب این که بهتره

SELECT user_id FROM user WHERE user_name='$username'

edenarezo
شنبه 30 دی 1391, 03:18 صبح
چیزی که من متوجه شدم، اینه که این دستور، تعداد سطرهای دریافتی رو بر می گردونه.

به عنوان مثال اگر دستور count رو از کوئری بردارم، به این شکلی که دوست قبلی گفت :

SELECT user_id FROM user WHERE user_name='$username'

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

در صورتی که با این دستور، بلافاصله تعداد سطرها رو سریع بر می گردونه و لازم نیست، یک بار جدول رو ذخیره و بار دیگه تعداد سطرها رو بیرون کشید.

siavashsay
شنبه 30 دی 1391, 10:46 صبح
چرا این ؟

SELECT count(user_id) FROM user WHERE user_name='$username'
خب این که بهتره

SELECT user_id FROM user WHERE user_name='$username'
رضا جان !
گمونم حالت اول بهتره ! چون برای حالت دوم شما نیاز به یک کوئری دیگه هم دارید :
$nr=mysql_num_rows($sql);
خوب توی حالت اول شما دیگه نیاز به 2 تا کوئری ندارید که چک کنید کاربر موجود هست یا نه !
اما توی دومی چرا !
اینطور دارید از اجرای یک کوئری دیگه جلوگیری میکنید ! :)
بازم نظر بقیه بچه ها هم شرطه :)

rezaonline.net
شنبه 30 دی 1391, 12:11 عصر
من معمولا اسپاگتی کد نمیزنم اما اینبار :خجالت:


$qr = mysql_query("SELECT user_id FROM user WHERE user_name='$username'");
$result = mysql_fetch_assoc($qr);
if(empty($result))
echo 'نام کاربری آزاد';
else
echo 'نام کاربری تکراری !';



اینکه طعنه اسپاگتی رو میزنم ناراحت نشید
همین دستور رو توی Yii اینجوری مینویسم .



$user = User::model()->find(
'select'=>'user_id' ,
'condition'=>'user_name=?' ,
'params'=>array($username)
);
if( ! $user)
echo 'نام کاربری آزاد';
else
echo 'نام کاربری تکراری !';

خطر sql injection هم مطلقاً نداره اما اگه به بالایی نگاه کنی خودت متوجه میشی :)