parsgreen.com
article

انتخاب ردیف ها با دستور SELECT FROM در MySQL

mysql-select-from

تا این قسمت از آموزش مقدماتی کار با mysql و کدهای php، دیدیم که چگونه با دستورات مربوط به پایگاه داده در mysql، php را مدیریت کنیم، نحوه اتصال، ساخت دیتابیس، جدول و ردیف با دستور CREATE را فرا گرفتیم و اطلاعات را با INSERT INTO در پایگاه داده خود ذخیره کردیم، همچنین در آموزش قبلی به طور مختصر کلیاتی در رابطه با mysql_query گفتیم و وعده دادیم که در ادامه در این خصوص بیشتر خواهیم گفت، اکنون می خواهیم به وعده خود جامع عمل بپوشانیم و در مورد دستور SELECT FROM در MySQL صحبت کنیم.

کاربرد SELECT FROM در MySQL چیست؟


اگر خاطرتان باشد، پیش تر گفتیم که صرف ساخت دیتابیس، جدول و ردیف و وارد کردن اطلاعات در آن، تمام نیازهایمان (و شاید خیلی از نیازهایمان) را پوشش نمی دهد، با این کار، صرفا اطلاعات را دریافت می کنیم، اما اگر بخواهیم از آنها مجددا استفاده نمائیم، نیاز داریم که به کمک PHP موارد را فراخوانی کنیم، این کار در تعامل بین PHP و MySQL توسط SELECT FROM و پارامترهای آن انجام می شود که وظیفه دارد با توجه به نیاز شما و تنظیماتی که انجام داده اید، اطلاعات خاصی را از ردیف های موجود در جداول، فراخوانی کند، تا پردازش روی آنها صورت گرفته و به خروجی ارسال شوند.

شیوه نگارش (syntax) دستور SELECT FROM در MySQL


شیوه نگارش یا syntax دستور SELECT FROM در MySQL به صورت زیر است.
<?php
//انتخاب از تمام ستون ها
mysql_query("SELECT * FROM table");
//انتخاب از یک یا چند ستون خاص
mysql_query("SELECT id,name FROM table");
?>
توضیح:
- در مورد mysql_query، قبلا گفته ایم که یک تابع درونی php برای کار با پایگاه داده است و در واقع یک پُرس و جو و عملیات را بین php و mysql مدیریت می کند.
- دستور SELECT FROM با پارامترهای دیگری از جمه WHERE تکمیل می شود که در بحث های بعدی به طور مفصل در این خصوص خواهیم گفت.
- پس از اینکه یک mysql_query با SELECT FROM اجرا شد، بر اساس نوع درخواست و تنظیمات شما، مقادیری برگردانده می شود (این مقادیر می تواند اطلاعات موجود در دیتابیس یا مثلا تعداد ردیف ها و ... باشد)، برای استفاده از این مقادیر بهتر است mysql_query را با یک متغیر فراخوانی کنیم تا اطلاعات در متغیر قابل دسترسی باشد (در ادامه خواهیم دید).

پارامترهای دستور SELECT FROM در MySQL


SELECT FROM در حالت عادی و بدون وجود پارامترهای محدود کننده، معمولا تمام موارد را از یک جدول برمی گرداند، لذا برای اینکه بتوانیم به دنبال محتوای مخصوصی بگردیم، باید از پارامترهای اضافه استفاده کنیم، یکی از این پارامترها WHERE است که خود زیرمجموعه های دیگری دارد (مثلا استفاده از LIKE و علامت های <،=،> و...)، چون بحث ما به دستور SELECT FROM محدود می شود، موارد پیشرفته تر را که نیاز به دانستن مقدمات بیشتر است، به آینده موکول و در اینجا به ذکر چند مثال بسنده می کنیم.
در مثال های زیر ما با پارامترهای بیشتر، اطلاعاتی دقیق تر از پایگاه داده به دست می آوریم.
<?php
$con = mysql_connect("localhost", "user", "pass")//اطلاعات اتصال
or die(mysql_error());
mysql_select_db("db", $con)//نام دیتابیس
or die(mysql_error());
$name = mysql_query("SELECT * FROM table WHERE user = 'your name'", $con);//انتخاب از جدول
$family = mysql_query("SELECT * FROM table WHERE user LIKE '%your family%' LIMIT 5", $con);//انتخاب از جدول
$age = mysql_query("SELECT * FROM table WHERE user > 25 ORDER BY id", $con);//انتخاب از جدول
mysql_close($con);//پایان ارتباط
?>
توضیح:
- مقادیر در مثال های بالا کاملا فرضی هستند و صرفا برای آشنایی شما با نحوه نگارش دستورات و پارامترهای SELECT FROM تعریف شده اند.
- همانطور که می بینید برای سه متغیر فرضی name، family و age سه query متفاوت (صرفا جهت مثال) تنظیم کرده ایم.
- به پارامترهایی که بعد از قسمت WHERE آمده اند دقت کنید، در متغیر اول از مقایسه برابری (=) ستون user با مقادیر your name استفاده کرده ایم (یعنی تنها ردیف هایی انتخاب می شوند که نام کاربر your name باشد)، در متغیر دوم از LIKE و LIMIT و در متغیر سوم از علامت های کوچکتر بزرگتر به همراه ORDER BY استفاده کرده ایم (بحث تفصیلی در این خصوص را به آینده موکول می کنیم).
- ملاحظه می کنید که دستورات مربوط به mysql_query در پایگاه داده، بی شباهت به حالت معمول برنامه نویسی با php نیستند.
- دقت کنید که در ارتباط با پایگاه داده توسط php، قبل از همه چیز باید اطلاعات اتصال را فراهم کرده باشید.

نمایش اطلاعات با mysql_fetch_array


پس از اینکه اطلاعات ستون ها و ردیف های مورد نظر را به متغیر خود نسبت دادیم، باید در یک حلقه while در php با کمک تابع mysql_fetch_array، مقادیر موجود را جایگزین کرده و خروجی دهیم، یا پردازش های دیگری روی آنها صورت دهیم.
<?php
$con = mysql_connect("localhost", "user", "pass")//اطلاعات اتصال
or die(mysql_error());
mysql_select_db("db", $con)//نام دیتابیس
or die(mysql_error());
$result = mysql_query("SELECT * FROM table WHERE id < 50", $con)
or die(mysql_error());// انتخاب از جدول
//گرفتن خروجی از اطلاعات فیلدها با mysql_fetch_array
while ($row = mysql_fetch_array($result)){
    $id = $row['id'];
    $name = $row['name'];
    $family = $row['family'];
    $age = $row['age'];
    echo "شماره $id:<br />";    
    echo "نام: $name خانوادگی: $family سن: $age<br />";                    
}
mysql_close($con);//پایان ارتباط
?>
توضیح:
- وظیفه تابع mysql_fetch_array این است که مقادیر برگردانده شده توسط mysql_query که در یک متغیر نگهداری می شود را به صورت آرایه هایی قابل استفاده در php در آورد.
- سپس این آرایه ها با کلید ها و مقادیری در دسترس هستند که در قسمت {} درون حلقه while ملاحظه می کنید.
- در مثال بالا درون قسمت {} در حلقه while، مقادیر داخل [] در واقع همان نام ستون های موجود در پایگاه داده هستند که در هر دور حلقه while تا زمانی که مقادیری برای خروجی دادن وجود داشته باشد، تکرار می شوند.
- به طور ساده کد بالا این طور تفسیر می شود: ابتدا مقادیر query با SELECT * FROM و محدود شده با WHERE به متغیر result تعلق می گیرد، سپس mysql_fetch_array مقادیر موجود در result را به متغیر row اختصاص می دهد، در هر دور حلقه while تا زمانی که آرایه ای وجود داشته باشد (true باشد)، ردیف به ردیف (سطر به سطر) به صورت داینامیک مقادیر موجود در ستون ها با عناوین آنها جایگزین می شود و در قسمت خروجی با دستور echo چاپ می گردند.
sectionدسته بندی: آموزش مقدماتی » MySQL
related مطالب بیشتر:
» استفاده از JOIN و ساخت پرس و جوی ترکیبی در MySQL
» نحوه استفاده از WHERE در MySQL
» ساخت دیتابیس، جدول و ردیف با دستور CREATE در MySQL
» استفاده از ORDER و GROUP در MySQL
» نگاهی به MySQL، پرکاربردترین سیستم مدیریت پایگاه داده
commentنظرات (۵۶ یادداشت برای این مطلب ارسال شده است)
نویسنده: ehsan
زمان: ۲۳:۵۵:۲۱ - تاریخ: ۱۳۹۲/۰۱/۰۱
عیدتون مبارک
من میخوام یک منو به صورت ابشاری داشته باشم بدون تعداد محدودیت در در ساخت زیر منو. البته با php ,mysql توی کد زیر من تا 2 زیر منو رو میتونم نمایش بدم از پایگاه داده ولی میخوام نامحدود باشه حتی اگه 10 تا باشه مثلا
. خانه
. مقالات
- وردپرس
- جوملا
-- قالب
-- ماژول
--- ساده
--- پیشرفته
. لینکستان
<?php
$id=mysql_real_escape_string($_GET['id']);
$menu=new menu();
$result=$menu ->SelectParent($id);
if($result && mysql_num_rows($result)>0){
while($row=mysql_fetch_assoc($result)){
echo '<li>'.$row['title'];
$re=$menu ->SelectParentMneu($row['id']);
if($re && mysql_num_rows($re)>0){
echo '<ul>';
a:
while($row=mysql_fetch_assoc($re)){
echo '<li>'.$row['title'];
$men=$menu->SelectParentMneu($row['id']);
if($men && mysql_num_rows($men)>0){
echo '<ul>';
while($row=mysql_fetch_assoc($men)){
echo '<li>'.$row['title'].'</li>';
}
echo '</ul>';
}
echo '</li>';
}
echo '</ul>';
//$re=$menu ->SelectParentMneu($row['id']);
}
echo '</li>';
}
}
?>
اگه نیاز بود بگید جدول پایگاه داده و کلاس مربوطه رو براتون ارسال کنم.
یا اصلا خودتون یک مثال بزنید کافیه
با تشکر
پاسخ: 
سلام
ابتدا باید با ساختار تگ های ul و li و ایجاد لیست تو در تو آشنا باشید، سپس متناسب با ساختار کلاس menu، از متد SelectParent و SelectParentMneu استفاده کنید، البته اینکه این متدها تا چند سطح زیر مجموعه تولید کنند را باید بررسی کرد و این کار تنها با دیدن سورس کدها و آزمایش خطا در یک برنامه ی قابل اجرا ممکن است، در کل به نظر می رسد هم کلاس menu و هم قسمت کد کاربردی باید ویرایش شوند.
نویسنده: ehsan
زمان: ۱۶:۳۷:۴۱ - تاریخ: ۱۳۹۲/۰۱/۰۲
در بالا اگه دقت کنید وردپرس و جوملا زیر مجموعه مقالات، و قالب و ماژول زیر مجموعه جوملا و ساده و پیشرفته زیر مجموعه ماژول هستند.
من میخوام این زیر مجموعه ها نامحدود تولید بشه الان 3 دونه بیشتر نیست، بلدم بنویسیم که حتی 10 تا 20 الی بالاتر رو بنویسم ولی باید به همون اندازه حلقه while بنویسم، میخوام جوری باشه که نیاز به حلقه while زیاد نباشه
پاسخ: 
معمولا این نوع لیست های زیرمجموعه ای تا نهایتا سه سطح بیشتر استفاده نمی شوند و بالاتر از این در وب معمول نیست؛ به هر صورت ساختار کدهایتان طوری است که برای هر سطح باید یک حلقه while استفاده کنید و به نظر این اجتناب ناپذیر است، چون باید به تعداد منوهای همان سطح، دور تکرار داشته باشید.
نویسنده: امین
زمان: ۰۰:۱۱:۰۱ - تاریخ: ۱۳۹۲/۰۴/۰۴
با سلام
این تو دیتابیس ads اونایی که ستون myad اونها خالیه رو می گیره:
mysql_query("select * from ads where myad=''");
حالا اگه بخوایم اونایی که ستون myad اونها پره رو بگیره چی باید نوشت؟
با تشکر
پاسخ: 
سلام
mysql_query("select * from ads where myad != ''");
به جای علامت = از =! استفاده کنید.
نویسنده: علیرضا
زمان: ۰۷:۵۰:۰۶ - تاریخ: ۱۳۹۲/۰۴/۱۰
با سلام تو عاشقتونم خیلی کمک بزرگی بهم کردید سایتتون عالیه. یه سوال دارم.
من میخوام میزان شارژ یک کاربر رو بگیرم با کولوم فرضی sharj این کد رو میزنم اما جواب نمیده.:
$sharji = mysql_query("SELECT sharj FROM register WHERE username = '$username'");
$sharjo = mysql_fetch_array($sharji);
if ($sharjo == 1){
echo "شارژ شما 1 است";
}
پاسخ: 
سلام
کد شما دارای اشکال است، از نمونه زیر استفاده کنید:
$sharji = mysql_query("SELECT sharj FROM register WHERE username = '$username' LIMIT 1");
while($row = mysql_fetch_array($sharji)){
$sharjo = $row['sharj'];
}
if ($sharjo == 1){
echo "شارژ شما 1 است";
}
نویسنده: mahdi
زمان: ۱۵:۳۶:۵۵ - تاریخ: ۱۳۹۲/۰۴/۲۲
سلام اول ممنون از آموزش ها بسیار خوبتون ... یه سوال:
من چطور می تونم توی فرم ورود ، وقتی کاربر لوگین کرد آی دی اون رو توی یه متغیر مثل a ذخیره کنم و بعدش اطلاعات مربوط به اون آی دی رو توی کنترل پنل کاربریش نمایش بدم ؟؟؟
ممنون
پاسخ: 
سلام
می توانید به راحتی این کار را هنگام SELECT کردن کاربر (چک کردن نام کاربری و کلمه عبور) انجام دهید، id را استخراج کرده و به یک سشن آی دی نسبت دهید، سپس هر طور نیاز بود از آن آی دی استفاده کنید، به فرض آن آی دی را در یک پرس و جوی دیگر قرار داده و اطلاعات مربوط به آن را به دست آورید، مثال:
<?php
//پرس و جوی فرضی
$result = mysql_query ("SELECT id FROM register WHERE username = '$username' AND password = '$password'")
or die(mysql_error());
while($row = mysql_fetch_array($result)){
$_SESSION['id'] = $row['id'];
}
//گرفتن خروجی فرضی
echo $_SESSION['id'];
?>
نویسنده: حامد
زمان: ۱۱:۰۳:۴۸ - تاریخ: ۱۳۹۲/۰۴/۲۵
عالی بود خیلی خیلی ممنون من مشکلم حل شد
نویسنده: سعید
زمان: ۱۷:۳۹:۲۲ - تاریخ: ۱۳۹۲/۰۵/۱۱
$old_id=1;
$test = mysql_query("Select * from tbl_cat where cat_id=$old_id+* ") or die(mysql_error());
while ($row = mysql_fetch_array($test)){
$cat_id= $row['cat_id'];
echo $cat_id;
}

$old_id=1;
$test = mysql_query("Select * from tbl_cat where cat_id between $old_id and 9999 ") or die(mysql_error());
while ($row = mysql_fetch_array($test)){
$cat_id= $row['cat_id'];
echo $cat_id;
}
امیدوارم بتوانم جوری زحماتتان را جبران کنم!
کد اول که بی معنی است اما دومی اجرا می شود ولی نیاز من را برآورده نمی کند
هدفم این بود که id مربوط به جدول قبلی که از قبل گرفته بودم رو در پرس و جو به کار ببرم
جدول فعلی حاوی یک فیلد است که یک عدد 4 رقمی را در خود جای داده که دو رقم اول آن در واقع id یک جدول دیگر است و دو رقم بعدی مربوط به خودش است
می خواستم جوری پرس و جو بنویسم که از جدول مربوطه رکوردهایی انتخاب شوند که دو رقم اول آنها برابر با id جدول قبلی باشند یا اگر دو رقمی نبود (در واقع اگر id جدول اولی دو رقمی نبود و مثل کد بالا 1 رقمی بود) رقم اولشان برابر با id جدول قبلی باشد.
اما نمیشه...
خیلی تلاش کردم اما توی اینترنت هر چقدر گشتم چیزی آیدم نشد یک تابع به نام union بود که با آن می شد دو تا فیلد را با هم ترکیب کنی اما هر چقدر فکر می کنم چاره ای به ذهنم نمی رسد
این جدول را برای ساخت منو های تو در تو می خواهم حالا نمی دانم تئوری به کار رفته شده درست است یا نه اما کارم لنگ همون یه تیکه کده
بیش از این مزاحمتون نمیشم
گفتم شاید تابعی راهی وجود داشته باشه که بشه این مشکل رو حل کرد
نویسنده: سعید
زمان: ۱۷:۵۱:۵۶ - تاریخ: ۱۳۹۲/۰۵/۱۱
$old_id=1;
$test = mysql_query("Select * from tbl_cat where cat_id like '$old_id%' ") or die(mysql_error());
while ($row = mysql_fetch_array($test)){
$cat_id= $row['cat_id'];
echo $cat_id;
}
ببخشید دوباره مزاحم شدم در سایت شما در بخش دیگری در حال مطالعه ی مباحث myaql بودم که در آن به استفاده از like توصیه شده بود فکر می کنم مشکلم حل شده باشد چون تست کردم و جواب داد
به هر حال بازم ممنونم
واقعاً سایت شما تکه
توی اینترنت این همه گشتم هیچی پیدا نکردم اما طی چند دقیقه تونستم توی سایت خوبتان مشکلم رو حل کنم
پاسخ: 
خواهش می کنیم، در پاسخ نظر قبلی هم در حال درج استفاده از LIKE بودیم که پیام دیگر شما رسید!
نکته: در صورت امکان، بهتر است ساختار جداول را بهتر از این تنظیم کنید تا به این صورت وابسته به هم نباشند، حداقل باید طوری باشند که نیاز به استفاده از LIKE نباشد.
نویسنده: مسعود
زمان: ۲۰:۴۲:۱۸ - تاریخ: ۱۳۹۲/۰۶/۰۵
با سلام . ممنون میشم راجب این کد یه توضیح مختصر بدید
mysql_query('SELECT COUNT(*) AS num FROM manage WHERE man_cat_id="'.$row_menu['cat_id'].'"') or die (mysql_errno());
پاسخ: 
سلام
این پرس و جو برای شمارش تعداد ردیف هایی است که id آنها بر اساس قسمت WHERE باشد، نتیجه این شمارش به ردیف فرضی num اختصاص پیدا می کند که می تواند در توابعی مانند mysql_fetch_assoc برای گرفتن خروجی استفاده شود، مثال:
$result = mysql_query('SELECT COUNT(*) AS num FROM manage WHERE man_cat_id="'.$row_menu['cat_id'].'"') or die (mysql_errno());
$array = mysql_fetch_assoc($result);
echo $array['num'];
نویسنده: مسعود
زمان: ۰۳:۳۵:۴۷ - تاریخ: ۱۳۹۲/۰۶/۰۶
با سلام مجدد . در سوال قبلی منظور از AS num چیه ؟؟
یعنی همه رو میشماره بعد میریزه تو آرایه ای به نام num ?
$array ['num']
چی رو چاپ میکنه ؟
پاسخ: 
AS num یعنی تعداد کل ردیف ها (که با COUNT محاسبه می شود) در یک ستون فرضی به نام num ذخیره می شود، لذا ستون num در اینجا تعداد کل ردیف ها را چاپ می کند.
نویسنده: خلیل
زمان: ۰۰:۲۸:۳۷ - تاریخ: ۱۳۹۲/۰۷/۳۰
ممنون از اموزش خوبتون من به همه توصیه می کنم بعد از هر مطلب اموزشی حتما همه سوالات پایین هر صفحه رو مطالعه کنن من خیلی سوالاتم با همین ها حل شده . بازم ممنون از مدیر سایت .
نویسنده: علی امینی
زمان: ۱۵:۰۱:۴۱ - تاریخ: ۱۳۹۲/۰۸/۰۷
سلام
واقعا ممنونم از آموزشایی که میزارید. من آژاکس و مای اس کیو ال رو دنبال کردم واقعا عالی بود.
فقط یه مشکلی هست.
من نوع داده ی یک فیلد رو VARCHAR 255 قرار میدم ولی وقتی چیزی مثل ali رو توش می خوام ذخیره کنم این ارورو میده:
Unknown column 'ali' in 'field list'
ممنون میشم بگید مشکل از چیه
پاسخ: 
سلام
لیست ستون های جدول مربوطه و نمونه پرس و جویی که اجرا می کنید را درج کنید تا بررسی کنیم، به احتمال زیاد اشکالی در نحوه تنظیم پرس و جوی شما وجود دارد که باعث شده مقادیر value به عنوان نام ستون پردازش شود.
نویسنده: نیلوفر
زمان: ۲۳:۱۱:۳۰ - تاریخ: ۱۳۹۲/۰۸/۱۰
سلام.
من می خوام از چند تا table بخونم و همه رو در یک جدول نشون بدم . یعنی 4 تا دستور select و while نوشتم و
$bolok.="<tr><td>$_SESSION[idn]</td><td>$_SESSION[name_m]</td></tr>";
در آخر نوشتم اما فقط درمورد while آخری درست کار می کنه و در مورد قبلیا مقدار آخر رو همش نشون میده یعنی مقدارای اولیه رو سیو نمیکنه؟؟؟؟؟ چیکار کنم؟؟؟؟؟؟
پاسخ: 
سلام
سوالتان واضح نیست! حل مشکل نیاز به دیدن سورس کد کامل دارد.
نویسنده: نیلوفر
زمان: ۲۲:۰۰:۲۵ - تاریخ: ۱۳۹۲/۰۸/۱۳
سلام
سورس کامل رو فرستادم
حذف شد
پاسخ: 
سلام
کد شما بررسی شد، باید ببینید مقادیر
$_SESSION[id]
در هنگام فراخوانی کد با چه مقداری ست می شود، انتخاب ردیف از جداول بر اساس برابر بودن ستون id با این مقادیر است، برای خطایابی، می توانید با دستور echo از موارد خروجی بگیرید و با آزمایش و خطا ایراد کار را پیدا کنید.
نویسنده: مصطفی
زمان: ۱۷:۰۶:۳۴ - تاریخ: ۱۳۹۲/۰۹/۲۱
سلام می خواستم بدونم چطور میشه یه حلقه نوشت که تمام سطرهای یک جدول رو طی کنه و دستور مورد نظر رو روی همه ی سطرها اجرا کنه در حالی که ما نمی دونیم چه تعداد سطر در این جدول وجود داره.
پاسخ: 
سلام
اگر حلقه از نوع while باشد، مادامی که "fetch" وجود داشته باشد، حلقه نیز ادامه می یابد، اگر حلقه از نوع for بود، می توانید به فرض با mysql_num_rows تعداد کل ردیف های انتخاب شده را محاسبه و به همان اندازه حلقه را ادامه دهید.
paged صفحه 1 از 4




more لطفا دقت کنید که یادداشت های زیر منتشر نشده و حذف خواهند شد:
- یادداشت های خارج از موضوع این مطلب.
- سوالات کلی، غیر ضروری و مشکلاتی که هیچ تلاشی برای رفع آن نکرده باشید.
- نظرات حاوی کدها و اسکریپت های خیلی طولانی (به طور مثال کد کامل قالب وبلاگ).

2 × 9
 refresh
آگهی
seonab.com
طراحی نرم افزار اندروید
رنگین کمان عکس
Ranginkamaan.com

آرشیو عکس های باکیفیت با موضوعات متنوع...