PDA

View Full Version : سوال: کسی از دوستان می تونه سینتکس دستور شرطی if else ساده رو توضیح بده



idocsidocs
چهارشنبه 03 اسفند 1390, 02:40 صبح
راستش من بعد از یکی دوسال کار با پی اچ پی هنوز نتونستم دستور شرطی زیر رو به شکل ساده بنویسم. لطفا در این مورد راهنمایی کنید:


if(){
//
}
else{
//
}

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

_behnam_
چهارشنبه 03 اسفند 1390, 03:00 صبح
در صورتی که دستوری که میخواید در صورت درست بودن شرط اجرا بشه یه دستور باشه (یه خط) دیگه نیازی به {} نیست


if (x==y)
print("x==y);
else
print("x!=y);

البته اگه منظور شما این باشه

MostafaEs3
چهارشنبه 03 اسفند 1390, 04:04 صبح
//////////

ravand
چهارشنبه 03 اسفند 1390, 08:22 صبح
اگه ما الگوريتم رو خوب ياد بگيريم اينم خوب ميتونيم ياد بگيريم.
منم توي خيلي چيزاي ساده ، خيلي وقت ها گير ميكنم . شايد دليلش اين باشه كه كلاس نرفتم.

<?php
$d=5;
if ($d==5){
echo "رمز صحيح است";
}
else{
echo "رمز اشتباه است";
}
?>
اين الگوريتم همون دستورات رياضي هست كه محمد بن موسی خوارزمی ايراني يعني پدر برنامه نويسي كامپيوتر ابداع كرد.
دستور بالا رو اگه بخوايم به صورت ساده بگيم يعني اگر متغيير $d مساوي 5 باشد با دستور echo چاپ كن رمز صحيح است وگرنه (else) چاپ كن رمز اشتباه است. در واقع با دو مساوي اينجا يك مقايسه ايجاد شده.

MostafaEs3
چهارشنبه 03 اسفند 1390, 08:30 صبح
//////////

ravand
چهارشنبه 03 اسفند 1390, 08:41 صبح
بله اين شرطي كه شما گذاشتي توي ويژوال بيسيك خوندم ولي توي php بهش برخورد نكرده بودم، اين isset هم كارش اينه كه بررسي ميكنه ببيني چيزي انتخاب شده يا نه ولي empty هم كارش اينه كه خالي بودن و نبودن رو بررسي ميكنه.
درسته؟

MostafaEs3
چهارشنبه 03 اسفند 1390, 09:15 صبح
//////////

ravand
چهارشنبه 03 اسفند 1390, 09:48 صبح
آخه من اين نتيجه اي كه گرفتم از معني دو كلمه بود :لبخند:
empty يعني خالي حالا اگه يه علامت ! اولش بياد ميشه خالي نباشد.
set هم براي انتخاب بكار ميره .
گفتم شايد منطورش اينه كه " انتخاب هست؟" :لبخند:
كسي نيست اين چيزا رو بهمون بگه ، ما هم براي خودمون همينطوري نتيجه گيري ميكنيم :قهقهه:

MostafaEs3
چهارشنبه 03 اسفند 1390, 10:01 صبح
//////////

idocsidocs
چهارشنبه 03 اسفند 1390, 11:08 صبح
$example = isset($_POST['example']) ? $_POST['example'] : 'Hello';
اگر بخوایم از چندتا AND یا OR توی شرط استفاده کنیم باید چیکار کنیم؟

ravand
چهارشنبه 03 اسفند 1390, 11:21 صبح
بله من براي radio اينطوري استفاده كردم:

<?php
if (isset($_REQUEST['gender'])) {
echo "صحيح ";
} else {
echo "گزينه اي انتخاب نكرديد";
}
?>
براي سيژن از اينم ميشه استفاده كرد.

session_destroy();

MostafaEs3
چهارشنبه 03 اسفند 1390, 11:25 صبح
//////////

MMSHFE
چهارشنبه 03 اسفند 1390, 12:02 عصر
اين isset هم كارش اينه كه بررسي ميكنه ببيني چيزي انتخاب شده يا نه ولي empty هم كارش اينه كه خالي بودن و نبودن رو بررسي ميكنه. درسته؟
isset فقط درصورتی true برمیگردونه که متغیر مربوطه تعریف شده باشه و مقدارش NULL نباشه. یعنی حتی اگه متغیری با مقدار یک رشته خالی هم ایجاد کنیم، isset مقدار true برمیگردونه. منبع (http://ir.php.net/manual/en/function.isset.php)
empty چک میکنه ببینه متغیر set شده رو میشه بعنوان یک متغیر خالی درنظر گرفت یا نه (پس باید متغیر حتماً تعریف شده باشه)! برای مقادیر زیر، مقدار true برمیگردونه:
یک رشته خالی مثل '' یا ""
0 (بعنوان عدد صحیح صفر)
0.0 (بعنوان عدد اعشاری صفر)
"0" (بعنوان رشته صفر)
NULL
FALSE
()array (یک آرایه خالی)
;var $var (متغیر تعریف شده در یک کلاس، بدون مقدار)
ضمناً empty معادل نقیض boolean) var) بکار میره، با این تفاوت که اگه متغیر تعریف نشده باشه، Warning تولید نمیشه.
بعلاوه برای پارامتر تابع empty باید حتماً از یک متغیر استفاده کنید. برای مثال، دستور زیر خطای گرامری تولید میکنه:

empty(trim($var));
منبع (http://ir.php.net/manual/en/function.empty.php)
موفق باشید.

MMSHFE
چهارشنبه 03 اسفند 1390, 12:03 عصر
$example = isset($_POST['example']) ? $_POST['example'] : 'Hello';
اگر بخوایم از چندتا AND یا OR توی شرط استفاده کنیم باید چیکار کنیم؟

$example = (isset($_POST['example']) && !empty($_POST['example'])) ? $_POST['example'] : 'Hello';
موفق باشید.

idocsidocs
چهارشنبه 03 اسفند 1390, 12:15 عصر
$example = (isset($_POST['example']) && !empty($_POST['example'])) ? $_POST['example'] : 'Hello';
می شه مقادیر بعد از کاراکترهای ؟ و : رو مقدار دهی کرد یا بصورت پیچیده تر نوشت؟

MMSHFE
چهارشنبه 03 اسفند 1390, 12:18 عصر
منظورتون از پیچیده کردن چیه؟ چطوری؟ میشه بیشتر توضیح بدین؟

ravand
چهارشنبه 03 اسفند 1390, 14:41 عصر
مهندس خيلي اين مسئله ي isset و empty رو پيچوندي. سرم گيج رفت و قاطي كردم :لبخند:
يعني نظري كه من در اين دو مورد توي اين تاپيك دادم اشتباهه؟ :لبخند:

idocsidocs
چهارشنبه 03 اسفند 1390, 14:55 عصر
منظورتون از پیچیده کردن چیه؟ چطوری؟ میشه بیشتر توضیح بدین؟

منظورم اینه که می شه این سینتکس رو به حالت دیگه هم نوشت؟

MMSHFE
چهارشنبه 03 اسفند 1390, 15:39 عصر
کلاً ساختار : ? بصورت زیر هست:
CONDITION(S) ? TRUE VALUE : FALSE FALSE
حالا نمیدونم منظورتون از حالت دیگه چیه؟ میشه یک مثال بزنید؟

MMSHFE
چهارشنبه 03 اسفند 1390, 15:42 عصر
مهندس خيلي اين مسئله ي isset و empty رو پيچوندي. سرم گيج رفت و قاطي كردم :لبخند:
يعني نظري كه من در اين دو مورد توي اين تاپيك دادم اشتباهه؟ :لبخند:
نظرتون تقریباً درسته ولی باید دقت کنید که این دو دستور تفاوتهای اساسی با هم دارن و درواقع میشه با اطمینان گفت کارشون برعکس هم نیست! توی توضیحاتی هم که گذاشتم، فقط گفتم که خروجی این توابع برحسب ورودی اونها چی میتونه باشه (صرفاً یک ترجمه ساده از سایت php.net انجام دادم).
موفق باشید.

ravand
چهارشنبه 03 اسفند 1390, 16:49 عصر
در مورد isset يه مثال زدم empty هم اين مثال:

<?php
if (!empty($_REQUEST['gender'])) {
echo "صحيح ";
} else {
echo "گزينه اي انتخاب نكرديد";
}
?>
اسكريپت بالا ميگه كه اگر پيام ارسال شده خالي نباشد "صحيح" وگرنه پيام "گزينه اي انتخاب نكرديد" چاپ مي شود.
نظرتون چيه؟ :لبخند:

idocsidocs
چهارشنبه 03 اسفند 1390, 17:04 عصر
به تابع empty بیشتر توجه کنید چون این تابع مقادیری مثل 0, ' ', '0', "0" رو هم به عنوان مقدار خالی در نظر می گیره.
isset هم محدودیت هایی داره که بهتره منوال رو بخونید.

MMSHFE
چهارشنبه 03 اسفند 1390, 17:09 عصر
مشکل سر اینه که اگه اصلاً gender ارسال نشده باشه، پیغام warning دریافت میکنید. کد رو اینطوری اصلاح کنید:


if(isset($_GET['gender']) && !empty($_GET['gender'])) {
echo 'صحیح';
}
else {
echo 'گزینه ای انتخاب نکردید';
}

نکته: بنا به دلایل امنیتی بهتره از REQUEST_$ استفاده نکنید.
موفق باشید.

ravand
چهارشنبه 03 اسفند 1390, 17:10 عصر
اين اعتبارسنجي كه گذاشتم براي radio هست پس كاري به مقدار صفر نداره و مشكلي پيش نمياد.

ravand
چهارشنبه 03 اسفند 1390, 17:13 عصر
براي چي امنيتي؟ يعني REQUEST_$ چه مشكل امنيتي داره؟ اين متغيير كار get و post رو شنيدم هر دو رو با هم ميكنه . من شنيده بودم اين get مشكل امنيتي داره ولي اينو نميدونستم . حالا چرا مشكل امنيتي داره؟
راستي نميدونم چرا نميتونم لينك تشكر پروفايل شما رو كليك كنم چون نداره !! :لبخند:

MMSHFE
چهارشنبه 03 اسفند 1390, 17:18 عصر
مشکلش اینه که فرضاً اگه شما منتظر دریافت اطلاعات با POST باشین، هکر با GET هم میتونه اطلاعات بفرسته و اینطوری با آزمایش کردن مقادیر مختلف، سریعتر به جواب میرسه چون چک کردن URLهای مختلف کمی مشکلتر از ساخت فرم و امتحان کردن مقادیر متفاوت هست. درواقع اینطوری سایت شما درمقابل حملات Bruteforce آسیب پذیرتر خواهد شد. موفق باشید.

MMSHFE
چهارشنبه 03 اسفند 1390, 17:20 عصر
اين اعتبارسنجي كه گذاشتم براي radio هست پس كاري به مقدار صفر نداره و مشكلي پيش نمياد.
ربطی به صفر بودن و... نداره. بحث اینه که اگه کلاً radio انتخاب نشده باشه یا به هر دلیلی ست نشده باشه (مستقیماً وارد صفحه پردازش فرم بشیم)، یک Warning خوشگل دریافت میکنید که میگه متغیری که شما دارین empty بودنش رو چک میکنید، اصلاً ست نشده. پس بهتره اول با isset بررسی کنید ببینید اصلاً چنین مقداری وجود داره؟ و بعد خالی بودن یا نبودنش رو چک کنید.
موفق باشید.

ravand
چهارشنبه 03 اسفند 1390, 17:29 عصر
مهندس من گيج شدم :لبخند:
اينطوري كه من شنيدم و خودم حتي تست كردم اين روش get هم مشكل داره . الان اگه من از روش get استفاده كنم اگه بخوام براي پسورد استفاده كنم كه پسوردم توي قسمت آدرس بار ظاهر ميشه . اين مشكل رو چجوري بايد حل كنم؟

idocsidocs
چهارشنبه 03 اسفند 1390, 23:36 عصر
کلاً ساختار : ? بصورت زیر هست:
CONDITION(S) ? TRUE VALUE : FALSE FALSE
حالا نمیدونم منظورتون از حالت دیگه چیه؟ میشه یک مثال بزنید؟
لطفا این دستور شرطی رو به روش ساده تر بنویسید:


if($t==55){
$a=55*55;
$b=33*33;
}
else{
$a=22;
$b=11;
}

MostafaEs3
پنج شنبه 04 اسفند 1390, 00:45 صبح
//////////

idocsidocs
پنج شنبه 04 اسفند 1390, 01:07 صبح
$t==55 ? $a=55*55 and $b=55 : $a=22 $b=11 ;
الان چندتا شرط بکار بردید؟
بنظرم این دستور اشتباهه.

MostafaEs3
پنج شنبه 04 اسفند 1390, 01:34 صبح
//////////

idocsidocs
پنج شنبه 04 اسفند 1390, 02:28 صبح
این یکدونه شرط بیشتر نیست !! تست کردم کار کرد !
این قسمت از کد هم مشخس نیست که دستور کجا تموم می شه !

$a=22 $b=11 ;

MostafaEs3
پنج شنبه 04 اسفند 1390, 03:29 صبح
//////////

idocsidocs
پنج شنبه 04 اسفند 1390, 09:19 صبح
منظورم اینه که بعد از $a=22 کاراکتر ; قرار نگرفته و این خطای دستوریه.

MMSHFE
پنج شنبه 04 اسفند 1390, 10:15 صبح
مهندس من گيج شدم :لبخند:
اينطوري كه من شنيدم و خودم حتي تست كردم اين روش get هم مشكل داره . الان اگه من از روش get استفاده كنم اگه بخوام براي پسورد استفاده كنم كه پسوردم توي قسمت آدرس بار ظاهر ميشه . اين مشكل رو چجوري بايد حل كنم؟
کدی که گذاشتم صرفاً یک مثال بود. برای رمز، باید از post استفاده کنید. منظورم کلاً اینه که تکلیف کدتون رو روشن کنید. اگه قراره اطلاعات رو با post بگیره، از POST_$ استفاده کنید و اگه قراره از get استفاده کنه، با کمک آرایه GET_$ مقادیر رو بدست بیارین و برای راحتی خودتون، از REQUEST_$ استفاده نکنید. مگر در جاهایی که عمداً بخواین هم با post کار کنید و هم با get که معمولاً چنین شرایطی کمتر پیش میاد. موفق باشید.

MMSHFE
پنج شنبه 04 اسفند 1390, 10:18 صبح
لطفا این دستور شرطی رو به روش ساده تر بنویسید:


if($t==55){
$a=55*55;
$b=33*33;
}
else{
$a=22;
$b=11;
}



$a = ($t == 55 ? 55 * 55 : 22);
$b = ($t == 55 ? 33 * 33 : 11);

دقت کنید که بعد از ? و در دو طرف : فقط مقدار باید ذکر بشه و نه دستور. درواقع از ساختار سه گانه : ? فقط وقتی باید استفاده کنیم که برحسب درستی یا نادرستی یک شرط، یک مقدار در کد تغییر میکنه. به هیچ عنوان از این ساختار برای ترکیب دستورات استفاده نکنید. شاید بشه با روشهای غیرمعمول به نتیجه ای که میخواین برسین ولی قطعاً کد شما استاندارد نخواهد بود.
موفق باشید.

MostafaEs3
پنج شنبه 04 اسفند 1390, 19:50 عصر
//////////

MostafaEs3
پنج شنبه 04 اسفند 1390, 20:31 عصر
//////////

ravand
پنج شنبه 04 اسفند 1390, 21:53 عصر
من اينطوري ازش فهميدم.
بايد اولش حتما مقداري براش تعيين كنيم. اينطوري:

<?php
$t=55;
$b = ($t == 55 ? صحيح : غلط);
echo $b;
?>
متغيير $t برابر با 55 ، و دو تا مساوي هم يك نوع مقايسه ايجاد ميكنه. كه آيا اين متغيير t برابر 55 هست؟ اگه اينطوري باشه پيام صحيح رو چاپ ميكنه اگه اينطوري نيست غلط رو چاپ ميكنه.
من از روي بي دقتي دائم فراموش ميكردم متغيير رو مقدار دهي كنم و ميگفتم چرا كار نميكنه!!!

idocsidocs
پنج شنبه 04 اسفند 1390, 22:01 عصر
البته بنظرم این درسته:

$b = ($t == 55 )? 'صحيح' : 'غلط';
نظرتون چیه؟

MostafaEs3
پنج شنبه 04 اسفند 1390, 22:01 عصر
//////////

ravand
پنج شنبه 04 اسفند 1390, 22:07 عصر
البته بنظرم این درسته:

$b = ($t == 55 )? 'صحيح' : 'غلط';
نظرتون چیه؟

بله حق با شماست . من اولش داخل دابل كوتيشن " گذاشتمش دليلش هم اينه كه كلمه ي صحيح يك رشته هست بعد چون ديدم بدون " هم كار ميكنه براي همين اينطوري گذاشتمش.:لبخند:
حالا نميدونم واقعاً اين كارم اشتباه هست يا نه؟ و چه مشكلي رو پيش مياره؟
خوبه كه اين بحث رو خيلي كشش داديم . چون خودم شخصاً خيلي اشكالات ريز توي كارم هست كه با اين بحث ها مي تونم حلش كنم.
متشكرم

MostafaEs3
پنج شنبه 04 اسفند 1390, 22:11 عصر
//////////

idocsidocs
جمعه 05 اسفند 1390, 01:45 صبح
بنظرم همون روش ساده رو استفاده کنیم بهتر باشه !

MMSHFE
جمعه 05 اسفند 1390, 10:27 صبح
وجود پرانتزها در هر ساختاری باعث تعریف و ایجاد اولویت میشه. برای مثال، کد زیر رو ببینید:


$t = 55;
echo '<p>T is '.($t %2 == 0 ? 'even' : 'odd').' ('.$t.')</p>';
$t = 44;
echo '<p>T is '.($t %2 == 0 ? 'even' : 'odd').' ('.$t.')</p>';
/* output:
<p>T is odd (55)</p>
<p>T is even (44)</p>
*/
$t = 55;
echo '<p>T is '.$t %2 == 0 ? 'even' : 'odd'.' ('.$t.')</p>';
$t = 44;
echo '<p>T is '.$t %2 == 0 ? 'even' : 'odd'.' ('.$t.')</p>';
/* output:
<p>T is odd (55)</p>
<p>T is even
*/

همونطور که میبینید، توی حالت دوم که پرانتزها رو نگذاشتیم، برای اعداد زوج، مقدار و بخش بسته شدن تگ p نوشته نمیشه چون اونها هم جزو قسمت false قرار میگیره ولی توی حالت اول، کدها درست اجرا میشه چون وجود پرانتزها موجب ایجاد یک اولویت برای ساختار شرطی سه تایی میشه و درنتیجه، اول اون شرط پردازش میشه و مقدارش جایگزین پرانتز میشه و بعد، بقیه عبارت باهاش ترکیب میشه. درواقع به کمک پرانتزها، محدوده ساختار شرطی رو مشخص کردیم. همین موضوع درمورد قسمت Conditions هم صادقه و اگه چندتا شرط داشته باشیم، باید اونها رو با پرانتز گروه بندی کنیم تا اول شرطها ترکیب بشن و نتیجه ترکیب اونها، شرط کلی رو بسازه. درغیر اینصورت، فقط شرط آخر مربوط به ساختار سه تایی خواهد بود و بقیه شرطها بعد از اجرای ساختار سه تایی باهاش ترکیب میشن.
موفق باشید.

Mohammad S
دوشنبه 05 تیر 1391, 18:47 عصر
اگه منظورت اینه که اینکه جای پرانتز ها چجوری باشه... بستگی به محاسبه تونه داره ... گاهی برای یک محاسبه ی پیچیده باید چندتا پرانتز باز و بسته کرد

من این کد رو که نوشتم تست میکنم جواب میده ولی نمیدونم درسته یا نه !! :عصبانی++:


$t=55;
$r=53;
($t==55) and ($r==53) ? $a=55*55 and $b=55 and $c=$t : $a=22 and $b=11 ;
if(isset($c)){echo $c.'<br>';}
echo $a.'<br>';
echo $b;


چند تا نکته جالب فهمیدم توی این نوع شرط ...

اول اینکه شما or نمیتونید قرار بدید توی شرط ولی and جواب میده !!
دوم اینکه چیزی نمیتونه Echo کنه

حالا اینکه این چطوریه خیلی برام عجیبه !

من نمی دونم چرا دوستان اینقدر اصرار دارن از روش‌های پیچیده استفاده کنن!!
به نظر من، دستور if حرف اول را میزنه چون باهاش میشه همه کار کرد!
دستوری که به صورت زیر نوشته میشه را اصطلاحاً انتساب شرطی می گن:

مقدار دوم : مقدار اول ؟ (شرط) = متغیر;
همانطور که از اسمش هم پیدا است، این یک دستور انتساب یعنی مقدار دهی است و برای سادگی به جای مقادیر if..else ساده استفاده می‌شود. روش کار این دستور هم به این صورت است که ابتدا شرط بررسی می شود و اگر درست بود مقدار اول در متغیر قرار می گیرد وگرنه مقدار دوم. این دستور را اگر بخواهیم به صورت if..else بنویسیم می‌شود:

if (شرط)
مقدار اول = متغیر;
else
مقدار دوم = متغیر;
یه نکته دیگه در رابطه با دستور if تذکر بدم و اون اینکه:
کلاً یک بخش برای if و یک بخش برای else وجود دارد و اگر می بینید چندین if و else پشت سر یکدیگر نوشته می شوند که مثلاً چندین شرط را بررسی کنند، در واقع فقط یک if هستند که در قسمت else آنها باز هم if دیگری نوشته شده است و ...
اما برنامه نویسان برای سادگی کار، همه else if ها را پشت سر یکدیگر می نویسند.
به عبارتی اگر 3 تا if .. else داشته باشیم معمولا می نویسیم:

if (condition1)
{
exp1
}
else
if (condition2)
{
exp2
}
else
if (condition3)
{
exp3
}
در حالی که شکل اصلی آن به صورت زیر است:

if (condition1)
{
exp1
}
else
{
if (condition2)
{
exp2
}
else
{
if (condition3)
{
exp3
}
}
}
یعنی در واقع آخرین else مربوط به آخرین if است.
همچنین در هر یک از این قسمت ها که exp نوشته شده است، اگر فقط یک دستور باشد نیازی به علامت { و } نیست.