PDA

View Full Version : سوال: تولید اعداد تصادفی



nazanin@
دوشنبه 26 اردیبهشت 1390, 19:41 عصر
با عرض سلام و احترام خدمت اساتید گرامی.
من در php یه برنامه دارم مینویسم که یک سری شعر در پایگاه داده ذخیره میکنم ودر برنامه باید با استفاده از تابع اعداد تصادفی یه عدد تصادفی رو ایجاد کنه و اون شعر رو نمایش بدم.
در این برنامه یه پایگاه داده به نام test اسم جدولم sentenc ، که جدولم هم دوتا فیلد به اسمهای num,name داره
من این کد رو نوشتم ولی هیچ چیزی رو نشون نمیده. لطفا اگه میشه من رو راهنمایی کنید.ممنون میشم.


<html>
<head>
<title>Putting Data in the DB</title>
</head>
<body>
<?php
$s=mt_rand(1,20);
//echo "$s;
$db = mysql_connect("localhost", "root", "");
if (!$db) {
die('Could not connect: ' . mysql_error());
}
else{
echo 'Connected successfully';}

mysql_select_db("test",$db);


$sql="SELECT * FROM sentences where num=$s; ";
$result =mysql_query($sql );
while($row=mysql_fetch_array($result)){

echo "</h4> " . $row["name"]. "</h4> \n" ;

}

mysql_close();
?>
</body>
</html>

BehinAfzar
دوشنبه 26 اردیبهشت 1390, 20:45 عصر
سلام
دوست عزیز هیچ خطایی هم نمیده ؟
احتمال داره فیلد Name رو با حروف بزرگ نوشتی و اینجا از حروف کوچک استفاده میکنی !
اینو چک کن !
اگه درست نشد بگو که تست کنم
موفق باشی

iman.developer
دوشنبه 26 اردیبهشت 1390, 22:25 عصر
شما باید علامت ; را در خط 18 برنامه و در انتهای دستور SELECT برداری ، چون در QUERY نباید ; گذاشت .
خط 18 شما باید به این شکل اصلاح شود :




$sql="SELECT * FROM sentences where num=$s ";


موفق باشید .

Mahdi.Spirit
دوشنبه 26 اردیبهشت 1390, 22:49 عصر
من تست كردم مشكلي نداشت!
احتمالا همون فيلدهاي ديتابيستون مشكل داره

xoogle.ir
دوشنبه 26 اردیبهشت 1390, 23:54 عصر
این جور مواقع با استفاده از تابع var_dump مقادیر متغیر ها رو بررسی کنید تا بفهمید مشکل از کجاست. مثلا بنویسید :


var_dump($result);

اگر null بود یعنی کوئریتون مشکل داره

nazanin@
سه شنبه 27 اردیبهشت 1390, 18:39 عصر
سلام ممنون از راهنمایهاتون
من همون کار هایی که گفتین را انجام دادم ولی باز
همون مشکل روداره وحتی از تابع var_dump هم استفاده کردم و مقدار nullبرنگردوند .
واین صفحه رونشون میده . به نظر تون کجای برنامه من مشکل داره ،اگه میشه کمکم کنید. ممنون میشم.

Connected successfully
resource(4, mysql result)

Mahdi.Spirit
سه شنبه 27 اردیبهشت 1390, 19:25 عصر
...
به نظر تون کجای برنامه من مشکل داره
...


من كه گفتم برنامه مشكل نداره ،‌ گير سر ديتابيستونه ،‌ شما فرمت فيلد num و name ‌رو چي گذاشتين؟
num رو int بزاريد و auto inc‌ رو فعال كنيد ،‌ name هم varchar بزاريد ، حداقل 20تا ركورد هم ثبت كنين (براي name) يا همون تعدادي كه توي تابع rand‌ گذاشتين ،‌ البته يه بار جدول sentences رو پاك كنيد از نو بسازيد با اين مشخصاتي كه گفتم ببينيد كار ميكنه يا نه !

ahmad.khaliq
چهارشنبه 28 اردیبهشت 1390, 00:19 صبح
دوست عزیز. روشی که برای انتخاب رکورد تصادفی استفاده کردید اشتباهه!!!!!!!

اگه بعدا تعداد شعرهای شما بشه 21 اونقوت چیکار میکنید؟ کد رو ویرایش میکنید و عدد 21 رو مینویسید؟

برای به دست آوردن یک رکورد تصادفی از بین رکوردهای جدولتون، لازم هست که کوئری رو به صورت زیر تغییر بدین



$sql="SELECT * FROM sentences ORDER BY RAND() LIMIT 1";

در این قطعه کد کلمه کلیدی RAND به بانک شما اطلاع میده که باید رکورد ها رو به صورت تصادفی چینش کنه و سپس کلمه کلیدی LIMIT 1 مشخص میکنه که باید فقط یک رکورد برگردونه. اگر میخواهید تعداد رکوردهای بیشتری سلکت کنه، این عدد رو افزایش بدید.

Mahdi.Spirit
چهارشنبه 28 اردیبهشت 1390, 01:42 صبح
دوست عزیز. روشی که برای انتخاب رکورد تصادفی استفاده کردید اشتباهه!!!!!!!

اگه بعدا تعداد شعرهای شما بشه 21 اونقوت چیکار میکنید؟ کد رو ویرایش میکنید و عدد 21 رو مینویسید؟
...


بله، این كدی كه نوشتین درسته ولی تا اونجایی كه اطلاع دارم برای جدول با حجم بالا مناسب نیست
برای عدد مثلا 21 هم میتونن max جدول رو بدست بیارن توی كد بزارن به شرطی كه حذفی نداشته باشن

BehinAfzar
چهارشنبه 28 اردیبهشت 1390, 07:22 صبح
سلام ممنون از راهنمایهاتون
من همون کار هایی که گفتین را انجام دادم ولی باز
همون مشکل روداره وحتی از تابع var_dump هم استفاده کردم و مقدار nullبرنگردوند .
واین صفحه رونشون میده . به نظر تون کجای برنامه من مشکل داره ،اگه میشه کمکم کنید. ممنون میشم.

Connected successfully
resource(4, mysql result)

سلام
شما مطمئن هستین که نام فیلد ها رو درست مینویسین یعنی حروف کوچک و بزرگ ؟!
اگه نام فیلد ها رو توی دستور select مشخص کنین خیالتون از این بابت راحت میشه و با همون شکل هم استفاده کنین

Mahdi.Spirit
چهارشنبه 28 اردیبهشت 1390, 13:08 عصر
يه كد sql هم كه چند جا ديدم براي اين كار استفاده ميكنن اينطوره:

SELECT * FROM sentences AS T JOIN
(SELECT FLOOR(MAX(num)*RAND()) AS ID FROM sentences) AS x
ON T.num >= x.ID LIMIT 1

اين كد رو براي 88000 تا ركورد امتحان كردم ميانگين زمان حدود 0.23 ثانيه شد ولي براي 10تا ركورد حدود 0.0038 ثانيه
اما كد :

SELECT * FROM sentences ORDER BY RAND() LIMIT 1

براي 88000 ركورد ميانگين زمان حدود 1.1 ثانيه شد و براي 10تا ركورد حدود 0.0026 ثانيه

------------------------------------------------------------------

SELECT max(num) FROM sentences

براي 88000 تا حدود 0.0020 ثانيه
و


SELECT * FROM sentences WHERE num=????

اينم براي 88000 تا حدود 0.0028 ثانيه