• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل با if و else
#1
دوستان به این کد یه نگاه بندازین
کد:
<?php
$query = "SELECT * FROM book ";
if(strlen(trim($_GET[book_name])))
{
   $query = $query." where name like '%".$_GET[book_name]."%'" ;
   if(strlen(trim($_GET[publisher])))
      $query = $query." and publisher like '%".$_GET[publisher]."%'";
}  
else
  if(strlen(trim($_GET[publisher])))
     $query = $query." where publisher  like '%".$_GET[publisher]."%'";

$connectionstring = odbc_connect("lib", "", "");
$result = odbc_do($connectionstring, $query);
odbc_result_all($result, "BORDER=1");
odbc_close($connectionstring);
?>

تو شرط if ما امدیم بررسی کردیم که اسم کتاب یا اسم ناشر مشخص کردیم یا نه اگه مشخص کردیم دستور sql لازم ایجاد میشه و شرط where به پرس و جوی مشخص شده در متغیر $query افزوده میشه . این کد مشکل نداره و برنامه به درستی کار میکنه اما سوال اینجاست که چرا else رو مثل if تعریف کرده مگه همچین چیزی میشه ؟

سوال بعدی هم این هستش که یکی زحمت بکشه در مورد % و نقطه ای که گذاشته شده یه توضیح بده
کد:
$query = $query." where publisher  like '%".$_GET[publisher]."%'";
Heart

یه مشکل دیگه هم هست که داشت یادم میرفت وقتی فرم html رو به find.php ارسال میکنم برای گرفتن اطلاعات به این صورت باز میشه .
کد:
http://127.0.0.1/%5C%5C127.0.0.1%5Cfind.php?book_name=Web+Database+Applications+with+PHP+MySQL&publisher=
  پاسخ
تشکر شده توسط :
#2
Padideh جان به نظر من این if که اصلا شرط نیست :
کد پی‌اچ‌پی:
if(strlen(trim($_GET[book_name]))) 
تابع strlen طول رشته رو بر می گردونه و تابع trim هم فضای خالی رو از دو طرف رشته حذف می کنه پس داخل if فقط یه طول رشته بر می گرده که اصلا منطقی نیست .
برای چک کردن اینکه متغیر وجود داره یا نه از :
کد پی‌اچ‌پی:
if(isset($_GET['book_name']) && !empty($_GET['book_name'])){
    
//now filter input

استفاده کن .
قضیه سوال اول(else ) رو نفهمیدم میشه یکم توضیح بدی
(محض رضای خدا برای if و else آکولاد بزارید {} )
اما سوال دوم
این query رو ببین :
کد پی‌اچ‌پی:
SELECT FROM pet WHERE name LIKE 'b%'
این اونایی رو بر می گردونه که با b شروع میشن
حالا اینو ببین :
کد پی‌اچ‌پی:
SELECT FROM pet WHERE name LIKE '%fy'
اونایی رو بر می گردونه که با fy تموم میشن
حالا اینو ببین :
کد پی‌اچ‌پی:
SELECT FROM pet WHERE name LIKE '%w%'
اونایی رو بر می گردونه که شامل w می شن .
و در نهایت این :
کد پی‌اچ‌پی:
SELECT FROM pet WHERE name LIKE '_____' 
این اونایی رو می یاره که شامل دقیقا 5 کاراکتر هستن .( به تعداد _ )
(نقطه هم برای چسبوندن رشته ها به همه)
در مورد سوال آخر هم فکر کنم به تنظیمات apache ربط داره البته استاتید بیشتر می تونن راهنمایی کنن .
  پاسخ
تشکر شده توسط : Padideh
#3
ممنون Paull جان این چیو میخواد برگردونه ؟

کد:
$query = $query." where publisher  like '%".$_GET[publisher]."%'";

پس فهمیدم نقطه کارش چسبوندن رشته ها به هم هستش

در مورد else هم گفتم مثل if تعریف شده esle میخواد چیرو بررسی کنه ؟ انگار درک این مسله یه خورده واسم سخته یا شاید من زیاد دقت نمیکنم
  پاسخ
تشکر شده توسط : paull
#4
این قسمت از کدو ببین :
کد پی‌اچ‌پی:
$query "SELECT * FROM book ";
$query $query." where publisher  like '%".$_GET[publisher]."%'"
فرض کن :
کد پی‌اچ‌پی:
$_GET['publisher']='anderson'
در نهایت یه کوئری به اینصورت داری :
کد پی‌اچ‌پی:
SELECT FROM book where publisher like '%anderson%' 
حالا اجرای این کوئری :
میره تو تمام فیلد های تیبل book جایی که فیلد publisher شامل anderson هست رو میاره .
به نظر من در کل منظورش اینه :
کد پی‌اچ‌پی:
$query "SELECT * FROM book ";
if(isset(
$_GET['book_name']) && !empty($_GET['book_name'])){
    
$query $query." where name like '%".$_GET['book_name']."%'" ;
    if(isset(
$_GET['publisher']) && !empty($_GET['publisher'])){
        
$query $query." and publisher like '%".$_GET['publisher']."%'";
    }
}
else if(isset(
$_GET['publisher']) && !empty($_GET['publisher'])){
    
$query $query." where publisher  like '%".$_GET['publisher']."%'"
}
//echo $query; 


  پاسخ
تشکر شده توسط : Padideh
#5
نقل قول:Padideh جان به نظر من این if که اصلا شرط نیست :
هرجا if دیدید بدونید شرطه. به شرط زیر میگن شرط یه خطی که اگر یه خط باشه نیازی نیست دستوراتش بین آکولاد قرار بگیره.
کد پی‌اچ‌پی:
if(strlen(trim($_GET[publisher])))
     
$query $query." where publisher  like '%".$_GET[publisher]."%'"
در این شرط اول میاد فضا های خالی اول و آخر رشته ای که از متغیر publisher دریافت می کنه رو حذف می کنه بعد طول رشته رو در میاره بعد اگر == true شد اونوقت دستورش رو یعنی $query رو اجرا می کنه.

نقل قول:تو شرط if ما امدیم بررسی کردیم که اسم کتاب یا اسم ناشر مشخص کردیم یا نه اگه مشخص کردیم دستور sql لازم ایجاد میشه و شرط where به پرس و جوی مشخص شده در متغیر $query افزوده میشه . این کد مشکل نداره و برنامه به درستی کار میکنه اما سوال اینجاست که چرا else رو مثل if تعریف کرده مگه همچین چیزی میشه ؟
اصلاً همچین چیزی امکان پذیر نیست. else زمانی اجرا میشه که شرط یا شروط قبلی هرچی که بود false بشه. در اینجا داخل else اومده شروط/شرط دیگه رو هم تعریف کرده. else الزاماً به معنی منفی نیست که اگر شرط/شروط قبلی نشد خطا بده! else ممکنه شرط دیگه ای باشه یا بهتره بگم آخرین شرط ممکنه. که همونطوری که در if یا elseif باز شروط های دیگه ای مثل if و elseif و else هم تعریف می کنیم ، در خود شرط else هم میشه باز شروط دیگه ای تعریف کرد و پیچیدگی شروط بستگی به برنامه شما داره. به مثال زیر نگاه کنید که یه شرط یه ذره پیچیده هست:
کد پی‌اچ‌پی:
if(expression1) {
//dastoorat
if(expression1){
//dastoorate1
}
elseif(
expression2){
//dastoorate2
}
else{
//dastoorate3
}
}
elseif(
expression2){
//dastoorat
if(expression1){
//dastoorate1
}
elseif(
expression2){
//dastoorate2
}
else{
//dastoorate3
}
}
else {
//dastoorat
if(expression1){
//dastoorate1
}
elseif(
expression2){
//dastoorate2
}
else{
//dastoorate3
}


کد پی‌اچ‌پی:
$query $query." where publisher  like '%".$_GET[publisher]."%'"
اولاً اینکه ما یکسری قواعد کد نویسی داریم که میگه باید دستورات از پیش تعریف شده با حروف بزرگ نوشته بشن! مثل like باید بشه LIKE . اینکه % چیه مربوط میشه به wildcard ها که در انجمن هم جستجو کنی من یه مقاله کوچیک در موردش نوشتم ، پیداش می کنی. ولی یه توضیح مختصر میدم. LIKE به معنی شبیه بودن هست ، درسته؟ زمانی که ما از LIKE که حتماً باید بعد از WHERE باشه استفاده کنیم ، می تونیم (یا باید) از wildcard ها هم استفاده کنیم که در اینجا % به معنی اینه که قبل/بعد $_GET['publisher'] هر کاراکتری بود مهم نیست. فقط خود مقدار اون متغیر داخل باشه. به این میگن جستجوی غیر دقیق. یعنی خود خود خود خود ... اون عبارت حتماً نباید باشه ، بلکه عبارت های دیگه ای که این کلیدواژه رو داخل خودشون دارن هم محسوب بشه.
نقطه (.) هم کارش وصل کردن هست. چون متغیر رو خارج دستور اصلی یا بهتره بگم خارج دابل کوتیشن(") تعریف کرده ، برای اینکه اون رو به بخش قبلی و بعدی وصل کنه ، بعدش و قبلش از نقطه استفاده کرده.

نقل قول:یه مشکل دیگه هم هست که داشت یادم میرفت وقتی فرم html رو به find.php ارسال میکنم برای گرفتن اطلاعات به این صورت باز میشه .
زمانی که بخوای پایگاه داده رو بروز رسانی کنی از POST استفاده کن و زمانی هم که بخوای چیزی رو قفط دریافت کنی از GET استفاده کن. در اینجا شما برای دریافت اطلاعات از پایگاه داده از متد get در فرم خودتون استفاده کردید. در متد get ، تمام آدرس نمایش داده میشن. البته بعضی از فیلد ها هستند مثل چک باکس ها که تا تیک نخورن در آدرس ظاهر نمی شن. ولی همه فیلد های text نمایش داده میشن. در اینجا + برای متد get به معنی فاصله هست! و مقداری که بعد از book_name= اومده همون مقداری هست که در فیلد تکست book_name وارد شده.
اینکه چرا آدرس http://127.0.0.1/%5C%5C127.0.0.1%5C اینطوری میشه باید نحوه آدرس دهیتون در فرم رو درست کنید. یعنی مقداری که برای خصیصه action وارد کردید رو اصلاح کنید. اگر فایل find.php در کنار همون دایرکتوری هست ، اکشن میشه action="/find.php"
غایب
  پاسخ
تشکر شده توسط : paull Padideh
#6
اول از همه ما مخلص آقا علیرضا هستیم .Big GrinBig GrinBig Grin
نمیدونستم اینطوری :
کد پی‌اچ‌پی:
if(strlen(trim($_GET[publisher]))) 
هم برای وجود متغیر شرط می ذارند من همیشه از این :
کد پی‌اچ‌پی:
if(isset($_GET['book_name']) && !empty($_GET['book_name'])){
    
//now filter input

استفاده می کردم .
نقل قول:هرجا if دیدید بدونید شرطه. به شرط زیر میگن شرط یه خطی که اگر یه خط باشه نیازی نیست دستوراتش بین آکولاد قرار بگیره.
(من برای این گفتم که برنامه مرتب تر و واضح تر بشه . حالا دو تا آکولاد هم تو کد بذاریم اتفاقی نمی افته . مثلا این کد رو :
نقل قول:به مثال زیر نگاه کنید که یه شرط یه ذره پیچیده هست:
رو کمی مرتب تر بنویسیم پیچیدگیش میره :
کد پی‌اچ‌پی:
if(expression1) {
    
//dastoorat
    
if(expression1){
        
//dastoorate1
    
}
    elseif(
expression2){
        
//dastoorate2
    
}
    else{
        
//dastoorate3
    
}
}
elseif(
expression2){
    
//dastoorat
    
if(expression1){
        
//dastoorate1
    
}
    elseif(
expression2){
        
//dastoorate2
    
}
    else{
        
//dastoorate3
    
}
}
else {
    
//dastoorat
    
if(expression1){
        
//dastoorate1
    
}
    elseif(
expression2){
        
//dastoorate2
    
}
    else{
        
//dastoorate3
    
}

  پاسخ
تشکر شده توسط : Padideh
#7
(۱۳۹۰ خرداد ۲۷, ۰۲:۵۲ ب.ظ)paull نوشته: نمیدونستم اینطوری :
کد پی‌اچ‌پی:
if(strlen(trim($_GET[publisher]))) 
هم برای وجود متغیر شرط می ذارند من همیشه از این :
کد پی‌اچ‌پی:
if(isset($_GET['book_name']) && !empty($_GET['book_name'])){
    
//now filter input

استفاده می کردم .

هر کدوم کاربرد خودشون رو دارند .
مثلا اینو ببین
کد پی‌اچ‌پی:
<?php
$var 
= array();

if(
strlen(trim($var))){
    echo 
"if statement is true";
}
?>

خروجی :
کد:
Warning: trim() expects parameter 1 to be string, array given in /srv/http/test.php on line 4 Call Stack: 0.0001 635504 1. {main}() /srv/http/test.php:0 0.0001 636024 2. trim() /srv/http/test.php:4
  پاسخ
تشکر شده توسط : paull
#8
نقل قول:هر کدوم کاربرد خودشون رو دارند .
مثلا اینو ببین
ناصر بیشتر توضیح میدی؟ من که متوجه نشدم از مثالت چی رو میخوای بگی Huh
غایب
  پاسخ
تشکر شده توسط :
#9
هیچی بابا می خواستم این بنده خدا رو از اشتباه در بیارم. Tongue که فکر کنم متوجه شد.

فکر کرده بود از
کد پی‌اچ‌پی:
strlen(trim($var)) 
برای چک کردن وجود متغیر استفاده میشه در صورتی که شرط وقتی برقراره که رشته $var خالی نباشه . با یه مثال خواستم بگم وقتی $var آرایه باشه چه اتفاقی می افته .
  پاسخ
تشکر شده توسط :
#10
آقا ناصر بابت مثال خیلی ممنون .
من با
کد پی‌اچ‌پی:
strlen(trim($var)) 
مشکلی نداشتم .
نقل قول:تابع strlen طول رشته رو بر می گردونه و تابع trim هم فضای خالی رو از دو طرف رشته حذف می کنه پس داخل if فقط یه طول رشته بر می گرده
من فقط می خواستم بدونم برای وقتی که برای سرور متغیر می فرستیم (get or post) اینطوری چکش می کنیم یا با استفاده از isset .
منظورم اینه مثلا تو وردپرس ، جوملا ، همین mybb هنگام چک کردن ارسال متغیر (get or post) از isset استفاده شده .
  پاسخ
تشکر شده توسط : Padideh


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان