PDA

View Full Version : خواندن دیتابیس و نمایش در چندین صفحه



rezarss
دوشنبه 29 آذر 1389, 00:31 صبح
یه بانک اطلاعاتی mysql دارم که دارای چندین رکورد هست (فرضا 100 تا). یه فایل php هم دارم که میاد این رکوردها رو می خونه و نمایش میده اما این فایل php میاد همه رکوردها رو تو یه صفحه برام نمایش میده.
چطور می تونم این رکوردها در مثلاً 5 صفحه ی 20 تایی برام نمایش داده بشن و در پایین صفحه لینکی وجود داشته باشه که ادامه رکوردها رو در صفحه بعدی نمایش بده؟

Keramatifar
دوشنبه 29 آذر 1389, 09:48 صبح
تعداد رکوردهای خوانده شده از دیتابیس را بدست بیار و تقسیم بر تعدادی کن که می خواهی در هر صفحه نمایش داده بشه، مثلا اگر میخواهید 10 رکورد در هر صفحه دیده بشه و 100 رکورد دارید باید عدد 10 بدست بیاد، سپس به با یک حلقه به تعداد صفحات، لینکهای شماره روی صفحه نمایش بده که هر کدام کلیک می شود شماره خود را به صفحه پست کند، بعد توی query از limit n , n برای خواندن رکورد ها از دیتابیس استفاده کن، مثلا اگر عدد 3 پست شده در انتهای کوئری limit 20 , 30 رو قرار بده و اگر هیچ عددی ارسال نشده limit 1, 10

MSN_Issue
دوشنبه 29 آذر 1389, 09:56 صبح
با این کوئری میتونید برای مثلا 20 رکورد اول جدولتون رو بکشید :

SELECT *
FROM `your_table`
LIMIT 0 , 20
واضحه که برای 20 تای بعدی باید این کوئری رو بزنید ::لبخند:

SELECT *
FROM `your_table`
LIMIT 20 , 20
در واقع :

LIMIT طول , مکان شروع

rezarss
دوشنبه 29 آذر 1389, 14:10 عصر
چطور براش تعریف کنم که عدد 3 پست بشه. و در کوئری LIMIT 20 , 30 رو برام نمایش بده؟ این عدد سه یک لینک هستش چطور می تونم به یک فایل php پست کنم؟
میشه یه سورسی بزارین؟

MSN_Issue
دوشنبه 29 آذر 1389, 15:09 عصر
چطور براش تعریف کنم که عدد 3 پست بشه. و در کوئری LIMIT 20 , 30 رو برام نمایش بده؟ این عدد سه یک لینک هستش چطور می تونم به یک فایل php پست کنم؟
میشه یه سورسی بزارین؟
منظورتون رو متوجه نمیشم !
دقیقا میخواید چکاری انجام بدید ؟
اگه میخواید کوئری متغییری داشته باشید که مشکلی نیست :

LIMIT $from , $lenghtاگر هم منظور دیگه ای دارید لطفا یه کم واضح تر بیان کنید .


/. مسعود ./

rezarss
دوشنبه 29 آذر 1389, 22:00 عصر
سلام مسعود جان
ببین من تا اینجاشو بلدم که بتونم یه صفحه ای بسازم که بتونه اولین 10 تای رکوردهامو نمایش بده و در پایین صفحه هم تعداد صفحات رو نمایش بده مثلاً (صفحه 1 صفحه 2 صفحه 3 صفحه 4 صفحه 5 صفحه 6 صفحه 7 صفحه 8 صفحه 9 صفحه 10 ).
اینجاشو بلد نیستم که هر کس رو صفحه 3 کلیک کرد رکوردهای 21 تا 30 رو برای اون نمایش بده (یا برای هر صفحه دیگر).
و می خوام تمام این کارها در یک فایل php انجام شود. منظورم اینه که یه فایل showrecords.php دارم که وقتی این فایل رو فراخوانی کنم در اول 10 رکورد اول نمایش داده بشه با لینک صفحات. و وقتی هم که صفحه ای رو انتخاب کردند (مثلاً 4) تعداد رکوردهای 31 تا 40 رو در همون فایل showrecords.php و توسط خودش نمایش بده.

MSN_Issue
دوشنبه 29 آذر 1389, 22:17 عصر
به هر حال شما باید شماره ی صفحه ی انتخاب شده رو یه جوری به دیتابیست اطلاع بدی !
برای این کار راههای زیادی وجود داره که یکی از آنها استفاده از sessionها ست ...
مثلا شما میتونی یه متغییر تو آرایه ی session داشته باشی که با فشردن هرکلید (اون کلیدایی که صفحه رو عوض میکنن ) مقدار اون رو برابر شماره صفحه قرار بدی ...
و بعد این طوری خروجی دیتابیست رو لیمیت کنی :
limit ($_session['page']-1)*10 , 10
اینطوری مثلا توی صفحه ی دوم :

limit (2-1)*10 , 10
که این یعنی :
limit 10 , 10

اجرا میشه ...

rezarss
پنج شنبه 02 دی 1389, 02:30 صبح
ببخشید. خیلی برام خت بود بفهمم. می شه یه سورسی از این نمونه بزارین؟ خیلی ممنون می شم. شاید از رو سورس بفهمم.

UnnamE
پنج شنبه 02 دی 1389, 05:22 صبح
اين مدل رو بيين كه سر و كارت باس با كلاس و متغيرهاي خوب و قشنگ باشه و همچنين انعطاف بالايي داره .
به اين شكل :
http://d2o0t5hpnwv4c1.cloudfront.net/200_pagination/images/page_1.png
آدرس مقاله:
http://net.tutsplus.com/tutorials/php/how-to-paginate-data-with-php/
===========================
اين يكي ساده هست و خيلي هم قشنگ.
به اين شكل ميشه:
http://www.phpeasystep.com/imgs/pagination_php1.gif
آدرس مقاله‌:
http://www.phpeasystep.com/phptu/29.html
=============
يه نوع ديگه كه واقعا آخر سادگي و باحاليه كه قشنگيش رو jQurery گرفته:
http://lh4.ggpht.com/_N9kpbq3FL74/Sqd58pz-Y_I/AAAAAAAAChc/H9JVHxJo98Y/pagination.png
آدرس مقاله :http://www.9lessons.info/2009/09/pagination-with-jquery-mysql-and-php.html
===================

Vahid Faraji
پنج شنبه 02 دی 1389, 13:12 عصر
اميدوارم اين كد به درد شما بخوره.

rezarss
یک شنبه 05 دی 1389, 02:03 صبح
یه مشکلی دارم.
تونستم رکوردها رو تو چندین صفحه نمایش بدم ولی این ارورها بالای صفحه می آد.
اینم دریافت فایل (http://fa.sigmait.tk/paging.zip)
در صفحه اول این ارور:

64121

و در صفحه دوم این ارور:
64122

sonixax
یک شنبه 05 دی 1389, 03:16 صبح
اول با COUNT(*) سطر هاتون رو بشمرید - بعد با استفاده از Limit نشون بدید . به همین راحتی .

mohsen6500
یک شنبه 05 دی 1389, 09:01 صبح
سلام من هم مشکل دوست عزیزمون رو دارم!!
میشه بگید قیقا اشکال از کجاست؟

rezarss
دوشنبه 06 دی 1389, 01:31 صبح
بجای count() از mysql_num_rows() استفاده کردم که تعداد سطرها رو بدست می آره و همچنین از LIMIT استفاده کردم. می تونید فایل رو ببینید.
کسی می دونه واقعاً مشکل کجاست؟

MSN_Issue
دوشنبه 06 دی 1389, 10:04 صبح
برای اینکه بهتر جواب بگیرید باید اون صفحه ای که به paging.php متغییر میفرسته رو هم بذارید تا کدش رو ببینم ... اما ...
حدس میزنم که توی اون صفحه ی مبدا 'Page' رو 'page' تایپ کرده باشید ! (خطای خط 31)
بهتره برای چک کردنش از این شرط استفاده کنید :

if ( isset($_GET["Page"]) && $_GET["Page"]!=NULL)
{...}
ارور خطهای 73 و 77 هم مربوط به اینه که شما متغییر $ResultHtml رو مقدار دهی اولیه نکردید و یهو اومدید و الحاقش کردید !!
این رو توی خط 70 (بالای if ) بنویسید :

$resultHtml = " ";

rezarss
دوشنبه 06 دی 1389, 13:55 عصر
فقط یه صفحه به نام paging.php دارم که به mysql وصل میشه و اطلاعات رو می گیره و نمایش میده و از هیچ صفحه دیگری استفاده نمی کنم که متغیری رو به این صفحه ارسال کنه.
$resultHtml = " "; رو هم در خط 70 نوشتم ولی باز ارورها دارن می آن.

وقتی این صفحه http://localhost/paging/paging.php رو میزنم دو تا ارور میده.(ارور ResultHtml در خط 77) و (ارور Undefined index در خط 31).
در صفحه یک یعنی http://localhost/paging/paging.php?Page=1 ، یک ارور میده. (ارور ResultHtml در خط 77).
برای پیج های 2 به بالا (یعنی 2 یا 3 یا 4 یا ... http://localhost/paging/paging.php?Page=2 یا http://localhost/paging/paging.php?Page=4 ) هم ارور ResultHtml در خط 73 می آد.

MSN_Issue
دوشنبه 06 دی 1389, 14:55 عصر
من توی کد صفحه ی paging.phpی شما هیچ فرمی ندیدم که بخواد متغییری رو با متد get بفرسته !!!!
پس $_GET["Page"] هم معنی نداره و با ارور مواجه میشه !!!

rezarss
چهارشنبه 13 بهمن 1389, 01:21 صبح
سلامی دوباره به همه
پس از حدود به ماه و خوندن واسه امتحانات اومدم این تاپیک رو ادامه بدم چون هنوز مشکلم با این حل نشده.
با یه سورس هم کارک راه میفته. یعنی اینکه خودم زحمت فهمیدنشو می کشم.
اون یکی هم آخه JQuery داشت، درست متوجه نشدم

hosseintdk775
چهارشنبه 13 بهمن 1389, 15:01 عصر
بسم الله الرحمن الرحیم
سلام
این کلاس صفحه بندی رو واسه کارام نوشتم و ازش هم استفاده میکنم / مشکلی هم تو ش ندیدم یعنی در هر سری رفعش کرد

یه مثال هم توش هست ( البته واسه سری های قبلی نوشته بودمش / نمی دونم دقیقا با جدیده همخانی داره یا نه / ولی به احتمال زیاد نباید مشکلی باشه )

به توضیحاتی هم تو ابتدای کلاس نوشتم ( دست و پا شکسته ) / اگه جاییشو نفهمیدین بگین توضیح می دم

65878

tem988
چهارشنبه 13 بهمن 1389, 17:42 عصر
$limit=20;
$skip=isset($_REQUEST['page']) ? $_REQUEST['page']*$limit : 0;
$query = "SELECT * FROM Table_Name ORDER BY id desc LIMIT $skip , $limit";
$result = mysql_query($query);
while ($row = mysql_fetch_assoc($result)) {
echo $row['Name']."<br/>"
{

$ro=mysql_num_rows(mysql_query ("SELECT * FROM Table_Name"));
for($i=0;$i<$ro/$limit;$i++){
echo "<a href='?page=$i'>$i</a>";
}

MMSHFE
پنج شنبه 14 بهمن 1389, 07:42 صبح
با سلام، براتون يك كلاس آماده كردم:


<?PHP
//Copyright: www.ncis.ir
class Paginate
{
private $items;
private $db;
private $table;
private $server;
private $user;
private $pass;

public Paginate($d,$t,$i=10,$s='localhost',$u='root',$p=' ')
{
this->db=$d;
this->table=$t;
this->server=$s;
this->user=$u;
this->pass=$p;
this->items=$i;
}

public Get($page)
{
$start=($page-1)*this->items;
mysql_connect(this->server,this->user,this->pass);
mysql_select_db(this->table);
$result=mysql_query("select * from `".this->table."` limit $start,".this->items);
return $result;
}
}
?>
كافيه اين كلاس رو توي يك فايل PHP ذخيره كنيد (مثلاً paginate.class.php) و توي برنامه include كنيد. حالا ميتونيد اشيائي از اين كلاس ايجاد كنيد:


$paginate = new Paginate('mydb','mytable'); //10 rows per page
# or
$paginate = new Paginate('mydb','mytable',25); //25 rows per page
# or this if your server information differs
$paginate = new Paginate('mydb','mytable',25,'myserver','myuser',' mypass');
روش ساخت شئ هم بدين ترتيب هست كه پارامتر اول، نام ديتابيس و پارامتر دوم نام جدول هست (اجباري) و پارامترهاي بعدي كه اختياري هستن، به ترتيب تعداد ركوردها در هر صفحه (پيشفرض 10)، نام سرور (پيشفرض localhost)، نام كاربري (پيشفرض root) و رمز عبور (پيشفرض خالي) هست.
بعد از ايجاد شئ، كافيه به انتهاي آدرس صفحه موردنظرتون مقدار page رو از طريق آدرس بفرستيد. مثلاً آدرس اينطوري باشه:


http://localhost/test.php?page=2
و براي استخراج ركوردهاي موردنظر اينطوري عمل كنيد:


include('paginate.class.php');
$paginate=new Paginate('mydb','mytable');
$result=$paginate->Get($_GET['page']);
البته ميتونيد هر صفحه اي رو كه بخواين، با ارسال شماره صفحه بعنوان پارامتر به تابع Get شئ مربوطه، فراخواني كنيد.
نكته: result$ در مثال فوق، دقيقاً مثل خروجي يك دستور mysql_query عمل ميكنه و بايد براي نمايش مقادير اون از دستورات و حلقه هاي تكرار استفاده كنيد:


include('paginate.class.php');
$paginate=new Paginate('mydb','mytable');
$result=$paginate->Get($_GET['page']);
if(mysql_num_rows($result)>0)
{
echo('<TABLE width="100%" border="1">');
while($row=mysql_fetch_row($result))
{
echo('<TR>');
for($i=0;$i<mysql_num_fields($result);$i++)
{
echo('<TD>'.$row[$i].'</TD>');
}
echo('</TR>');
}
echo('</TABLE>');
}
اگه باز هم سؤالي بود در خدمتم. موفق و مؤيد باشيد.

$ M 3 H R D A D $
یک شنبه 17 بهمن 1389, 10:57 صبح
سلام این کباسباچه نسخه ای از پی اچ پی سازگاره ؟



this -----$this

نام سرور و دیتابیس مقادیر private هستند چظور بهشون دست پیدا میکنه ؟

sattaryekta
یک شنبه 17 بهمن 1389, 11:10 صبح
خسته نباشید.
نیاز به دسترسی به Private نیست. در هنگام ایجاد کلاس تمامی متغیرهایی که نیاز هست به کلاس داده میشه. مثل نام سرور و نام دیتابیس.
این کلاس خوبی هست ولی این کلاس باید یک Navigator هم ایجاد کنه تا کامل بشه. منظورم لینک های زیر لیست هست.

MMSHFE
یک شنبه 17 بهمن 1389, 11:41 صبح
با سلام، سعي كردم كلاس در ساده ترين حالت ممكن باشه يعني شماره صفحه و تعداد ركوردهاي هر صفحه رو موقع ساختن شئ بهش بديم و ركوردهاي مربوطه رو برگردونه. اگه نياز باشه، تابع درج صفحه بندي رو هم اضافه ميكنم. درمورد سؤال دوستمون هم بايد بگم كه this$ متغير ويژه اي هست كه داخل كلاس براي اشاره به شئ ايجاد شده از كلاس به كار ميره و به تمام عناصر كلاس دسترسي داره (چون داخل بدنه كلاس هست). ازطريق this$ در داخل بدنه كلاس ميتونيد به عناصر private دسترسي داشته باشيد ولي ازطريق شئ ايجاد شده نميتونيد. درست مثل اينكه توي يك تابع كلاس، تابع ديگه رو كه private هم هست، صدا ميزنيد. this$ تا زماني كه درون بدنه كلاس (بين آكولاد باز ابتدا و آكولاد بسته انتهاي كلاس) مورد استفاده قرار بگيره، به عناصر private هم دسترسي داره.
موفق و مؤيد باشيد.

rezarss
یک شنبه 17 بهمن 1389, 14:34 عصر
سلام آقای MMSHFE.
امتحانش کردم این ارور رو داد:
Parse error: parse error, expecting `T_VARIABLE' in C:\Program Files (x86)\EasyPHP 3.0\www\manual\submit\paginate.class.php on line 13

دو سوال: آیا این کلاس، در پایین هر صفحه شماره صفحات رو می آره که با کلیک رو شماره صفحه بره به اون صفحه؟ مثل گوگل.
اگر بخوام فیلد بخصوصی رو از جدول بگیرم (از هر رکورد)، کجا باید نام فیلد رو بنویسم؟

rezarss
سه شنبه 19 بهمن 1389, 03:07 صبح
کسی نیست جوابمون رو بده؟ اینو خیلی لازم دارم

MMSHFE
چهارشنبه 20 بهمن 1389, 10:26 صبح
سلام آقای MMSHFE.
امتحانش کردم این ارور رو داد:
Parse error: parse error, expecting `T_VARIABLE' in C:\Program Files (x86)\EasyPHP 3.0\www\manual\submit\paginate.class.php on line 13

دو سوال: آیا این کلاس، در پایین هر صفحه شماره صفحات رو می آره که با کلیک رو شماره صفحه بره به اون صفحه؟ مثل گوگل.
اگر بخوام فیلد بخصوصی رو از جدول بگیرم (از هر رکورد)، کجا باید نام فیلد رو بنویسم؟
با سلام، كلاس رو اصلاح كردم. ميتونيد كلاس جديد رو همراه با نمونه كار اون، توي فايل ضميمه ببينيد. الآن هم تعداد صفحات رو مشخص ميكنه و هم اينكه خروجي تابع Get بصورت آرايه دوبعدي انجمني شده و با كمك نام فيلد و شماره رديف ميتونيد به هر فيلد دسترسي داشته باشيد. مثال: ['result[5]['id$
موفق و مؤيد باشيد.

hamed-php
چهارشنبه 20 بهمن 1389, 11:11 صبح
MMSHFE عزیز این پیغام در اولین اجرا ظاهر شد.



Notice: Undefined index: page in D:\program files\wamp\www\kelas\pagination\index.php on line 2


راستی این فایل ضمیمه رو یکی از دوستان معرفی کرد. میخواستم ببینم چطوری میشه این رو به دیتا بیس دیگه مثلاً همین دیتابیس کشورها وصل کرد و دیتابیس خود فایل ضمیمه شده رو کاری نداشته باشیم تا هر وقت خواستیم.
اگه دیتا بیس چند تا ستون دیگر هم داشته باشه آیا میشه رکورداشو نشون داد؟

MMSHFE
چهارشنبه 20 بهمن 1389, 11:49 صبح
با سلام، با تنظيم فايل config.php ميشه اين كار رو انجام داد.
ضمناً Notice كه خيلي مهم نيست. ميتونيد با تنظيمات php.ini اين پيغامهاي غير مهم رو حذف كنيد:


error_reporing = E_ALL & ~E_NOTICE & ~E_WARNING & ~E_DEPRECATED
كافيه يك بار Apache رو Restart كنيد.
ضمناً كدي كه گذاشتم هر تعداد فيلد رو نشون ميده. محدوديتي از نظر تعداد ستون وجود نداره.
دارم روي يك نسخه ديگه از اين كد كار ميكنم كه خودتون هر Query كه خواستين بدين و نتايج رو بصورت صفحه بندي شده نشون بده.
موفق و مؤيد باشيد.