چرا فقط وقتی خطی که دستور هدر دارد را در خطوط پایینتر غیر فعال می کنم، کد خط های بالاتر اجرا می شود؟

شروع موضوع توسط ozv ‏13 آوریل 2019 در 16:43 در انجمن برنامه‌نویسی با PHP

  1. ozv

    ozv New Member

    ارسال‌ها:
    6
    تشکر شده:
    0
    امتیاز دستاورد:
    1
    در کد زیر، وقتی خط 231 که دستور هدر دارد یعنی:

    header("location:../taiide_sabtenam.php?id=".$id_user." ");

    را غیر فعال می کنیم

    آنوقت می بینیم که شرطی که در خط 117 است، یعنی:

    if ($tedad_arghame_S_hamrah == 11 )

    و همچنین شروط دیگر، عمل می کند، وگرنه این شروط عمل نمی کند!!


    عجیب است، مگر اجرای شرط در خطوط بالاتر، باید به فعال یا غیر فعال شدن یک خط در خطوط پایینتر ربط داشته باشد؟
    لطفا راهنمایی فرمایید
    با تشکر قبلی

    PHP:

    <?php
    require_once 'connect.php';
    $connect = new connectdb;
    if (isset($_POST['send']))
    {
      // تعریف متغیرهایی که درون شرطها استفاده می شود
      $email_tekrari = 0 ;
      $code_melli_tekrari = 0 ;
      $err = "";
       
      // قطعه مربوط به دریافت عکس
      $target_dir = "../uploads/";
      $aks = basename($_FILES["fileToUpload"]["name"]);
      $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
      $uploadOk = 1;
      $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
      // Check if image file is a actual image or fake image
      if(isset($_POST["submit"])) {
      $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
      if($check !== false) {
      echo "File is an image - " . $check["mime"] . ".";
      $uploadOk = 1;
      } else {
      echo "File is not an image."."<br>";
      $uploadOk = 0;
      }
      }
      // Check if file already exists
      if (file_exists($target_file)) {
      echo "Sorry, file already exists.";
      $uploadOk = 0;
      }
      // Check file size
      if ($_FILES["fileToUpload"]["size"] > 500000) {
      echo "Sorry, your file is too large.";
      $uploadOk = 0;
      }
      // Allow certain file formats
      if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
      && $imageFileType != "gif" ) {
      //echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
      $uploadOk = 0;
      }
      // Check if $uploadOk is set to 0 by an error
      if ($uploadOk == 0) {
      echo "Sorry, your file was not uploaded."."<br>";
      // if everything is ok, try to upload file
      } else {
      if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
      echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
      // خط پایین اینجا که هست کار نمیکنه اما بالا داره کار میکنه
      $aks = basename($_FILES["fileToUpload"]["name"]);
      echo $aks."<br>";
       
      } else {
      echo "Sorry, there was an error uploading your file."."<br>";
      }
      }
      // دریافت مقادیر از فرم
      $fname = $_POST['fname'];
      $lname = $_POST['lname'];
      $jensiiat = $_POST['jensiiat'];
      $code_melli = $_POST['code_melli'];
      $S_hamrah = $_POST['S_hamrah'];
      $id_daneshgah = $_POST['daneshgah'];
      $id_ostan = $_POST['state'];
      $id_shahr = $_POST['city'];
      $email = $_POST['email'];
      $user_pass = $_POST['S_hamrah'];
      $img = $aks;
      $modir = 0 ;
      // یافتن تاریخ ثبت نام
      date_default_timezone_set("Asia/Tehran");
      $date = date("Y-m-d H:i:s");

       
      // قطعه کد چک صحت کد ملی در PHP
      $code = $code_melli;
      function _custom_check_national_code($code)
      {
      if(!preg_match('/^[0-9]{10}$/',$code))
      return false;
      for($i=0;$i<10;$i++)
      if(preg_match('/^'.$i.'{10}$/',$code))
      return false;
      for($i=0,$sum=0;$i<9;$i++)
      $sum+=((10-$i)*intval(substr($code, $i,1)));
      $ret=$sum%11;
      $parity=intval(substr($code, 9,1));
      if(($ret<2 && $ret==$parity) || ($ret>=2 && $ret==11-$parity))
      return true;
      return false;
      }
       
      // اگر تعداد ارقام کدملی غیر از 10 بود
      if (strlen($code) <> 10)
      {
      header("location:../account_sait_j.php?code_melli_tedade_argham");
      }
      // اگر فرمت کدملی ناصحیح بود  
      elseif (_custom_check_national_code($code) == false)
      {
      header("location:../account_sait_j.php?code_melli_nadorost");  
      }
      // اگر فرمت کدملی درست بود  
      elseif (_custom_check_national_code($code) == true)
      {
      //echo "code_melli ok"."<br>";
      }  
       
      // بدست آوردن دو کاراکتراول شماره همراه
      $avvale_S_hamrah = substr($S_hamrah,0,2);
      // بدست آوردن تعداد ارقام شماره همراه
      $tedad_arghame_S_hamrah = strlen($S_hamrah);
       
      // اگر تعداد ارقام شماره همراه، برابر 11 رقم نبود
      if ($tedad_arghame_S_hamrah == 11 ) {
      //echo "11 ragham dorost"."<br>";
      // اگر دو رقم اول شماره همراه 09 نبود
      if ($avvale_S_hamrah == "09") {
      //echo "do ragham avval 09 ast"."<br>";
      } else {
      //echo "do ragham avval 09 nist"."<br>";
      header("location:../account_sait_j.php?S_hamrah_n");
      }
      } else {
      //echo "11 ragham nist"."<br>";
      header("location:../account_sait_j.php?S_hamrah_tedade_argham");
      }
       
      // در دیتابیس بگرد، اگر از قبل، ایمیل یا کدملی مشابه کد ملی ثبت کننده وجود داشت، اعلام کن تکراری است
      $sqle = "select * from `tbl_user` ";
      $res_e = $connect->query($sqle);
      //var_dump($sqle);
      while ($row_e = mysqli_fetch_assoc($res_e))
      {
       
      $email_db = $row_e['email'];
      $code_melli_db =  $row_e['code_melli'];
      //echo "id_user: ".$row_e['id_user']." <br>";
      //echo "email_db: ".$row_e['email']." <br>";
      //echo "code_melli_db: ".$row_e['code_melli']." <br>";
      // نمایش مقدار یک متغیر در پنجره پاپ آپ
      //echo "<script>var url = '$code_melli_db'; alert(url); </script>";
      // اگر ایمیل تکراری بود
      if($email_db == $email ) {
      //echo "email_db: ".$email_db." tekrari a: "." <br>";
      //echo "email: ".$email."<br>";
      $email_tekrari = 1 ;
      $err = "email_tekrari";
      header("location:../account_sait_j.php?email_tekrari");
      //echo "email_db: ".$email_db." tekrari k "." <br>";
      break;
      }
      // اگر کدملی تکراری بود
      elseif ( $code_melli_db == $code_melli)
      {
      //echo "code_melli_db: ".$code_melli_db." tekrari b "." <br>";
      //echo "code_melli: ".$code_melli."<br>";
      $code_melli_tekrari = 1 ;
      $err = "code_melli_tekrari";
       
      header("location:../account_sait_j.php?code_melli_tekrari");
      //echo "code_melli_db: ".$code_melli_db." tekrari f "." <br>";
      break;
      }
      // اگر هیچکدام تکراری نبود
      else
      {
      //echo "email_tekrari c: ".$email_tekrari." <br>";
      //echo "code_melli_tekrari c: ".$code_melli_tekrari." <br>";
      }
       
      } // پایان حلقه وایل بررسی دیتابیس در مورد تکراری بودن کدملی و شماره همراه
      // استفاده از حاصل بررسی فوق و اعلام تکراری بودن ایمیل یا کدملی
      if ($email_tekrari == 1)
      {
      header("location:../account_sait_j.php?email_tekrari");
      //echo "email_db: ".$email_db." tekrari g "." <br>";
      //echo "email_tekrari: ".$email_tekrari." <br>";
      //echo "code_melli_tekrari: ".$code_melli_tekrari." <br>";
       
      }
      elseif ($code_melli_tekrari == 1) {
      header("location:../account_sait_j.php?code_melli_tekrari");
      //echo "code_melli_db: ".$code_melli_db." tekrari u "."<br>";
      //echo "email_tekrari: ".$email_tekrari." <br>";
      //echo "code_melli_tekrari: ".$code_melli_tekrari." <br>";
      }

      // اگر ایمیل و کدملی تکراری نبود
      if($email_tekrari == 0  && $code_melli_tekrari == 0 ) {
      // اگر هیچکدام از این فیلدها خالی نبود
      if(!empty($fname) && !empty($lname) && !empty($code_melli) &&!empty($email) &&!empty($S_hamrah) &&!empty($id_daneshgah)  &&!empty($id_ostan)  &&!empty($id_shahr) )
      {
      // اگر فرمت ایمیل درست بود
      if (preg_match("/[a-zA-Z0-9._-]*@[a-zA-Z0-9\.-]*\.[a-zA-Z\.]*/", $email))
      {
      // بدست آوردن دو کاراکتراول شماره همراه
      $avvale_S_hamrah = substr($S_hamrah,0,2);
      if ("a" == "a")
      // مقادیر فرم ارسالی را در دیتابیس وارد کن
      $sql = "INSERT INTO `tbl_user` (`fname`, `lname`, `jensiiat`, `code_melli`, `tarikhe_sabtenam`, `S_hamrah`, `id_daneshgah`, `id_ostan`, `id_shahr`, `email`, `user_pass`, `img`, `modir`) VALUES ('".$fname."', '".$lname."', '".$jensiiat."', '".$code_melli."', '".$date."', '".$S_hamrah."', '".$id_daneshgah."', '".$id_ostan."', '".$id_shahr."', '".$email."', '','".$img . "', '".$modir . "');";
      $register = $connect->query($sql);
      // اگر داده های فرم با دستور بالا در دیتابیس وارد شد
      if ($register) {
      //echo " querysh doreste "."<br>";
      $err = "success";
      // بدست آوردن آیدی کاربر
      $sql_us = "select * from `tbl_user`  WHERE `code_melli` =  '".$code_melli."' ";
      $res_us = $connect->query($sql_us);
      $row_us = mysqli_fetch_assoc($res_us);
      $id_user=  $row_us['id_user'];
      //echo "id_user: ".$id_user."<br>";

      // درج تاریخ ثبت نام در دیتا بیس
      date_default_timezone_set("Asia/Tehran");
      //echo "miladi: ".date("Y/m/d")."<br>";
      $date = date("Y-m-d H:i:s");
      //echo "date: ".$date."<br>";
      $sql_u = "UPDATE `tbl_user` SET `tarikhe_sabtenam` = '".$date."' WHERE `id_user` =  '".$id_user."' ";
      $reg = $connect->query($sql_u);
       
      // اضافه کردن یک ردیف در جدول مقدار پیشرفت، برای این کاربر جدید
      $sql_p = "INSERT INTO `tbl_meghdare_pishr_user` (`id_meghdare_pishrat`, `id_user`, `emtiaz`,`emtiaz_akharin_azmoon`, `id_dowreh_konooni`, `id_seri_konooni`, `id_dars_konooni`, `id_azmoon_konooni`, `btm_faal`,`tarikhe_akharin_azmoon`, `mahroomiiat`, `sodoore_gavahi`) VALUES (NULL, '".$id_user."', '0','0', '1', '1', '1', '1', '0',' ','0', '0');";
      //$sql_p = "INSERT INTO `tbl_meghdare_pishr_user` (`id_meghdare_pishrat`, `id_user`, `emtiaz`, `emtiaz_akharin_azmoon`, `id_dowreh_konooni`, `id_seri_konooni`, `id_dars_konooni`, `id_azmoon_konooni`, `btm_faal`, `tarikhe_akharin_azmoon`, `mahroomiiat`, `sodoore_gavahi`) VALUES
      //(NULL, '222', '54', '45', '1', '2', '3', '4', '1', '2019-03-12 10:04:24', '0', '1');";
      $reg = $connect->query($sql_p);
      var_dump($reg);
      // رفتن به صفحه تایید ثبت نام
      //header("location:../taiide_sabtenam.php?id=".$id_user." ");
      // اگر داده ها در دیتابیس وارد نشد
      } else {
      ////echo "querysh najoore";
      $err = "unseccreg";
      header("location:../account_sait_j.php?unseccreg");
      }
      // اگر فرمت ایمیل درست نبود  
      } else {
      $err = "email";
      header("location:../account_sait_j.php?email");
      }
      }
      // اگر یکی از مقادیر شرط خالی نبودن، خالی بود
      else{
      $err = "empty";
      header("location:../account_sait_j.php?empty");
      }
      }
      // اگر ایمیل یا کدملی تکراری بود
      else {
       
      header("location:../account_sait_j.php?tekrari");
      ////echo "err".$err." <br>";
      }
       
       
    }  
    //اگر بدون زدن دکمه ارسال، وارد این صفحه شده بود
    else  
    {
      ////echo "notsend";
    }  
    ?>
     
     
    نوشته شده توسط ozv در ‏13 آوریل 2019 در 16:43
  2. ozv

    ozv New Member

    ارسال‌ها:
    6
    تشکر شده:
    0
    امتیاز دستاورد:
    1
    سوال را بهتر مطرح کنم:
    در کد فوق که در پست قبلی آمده است، وقتی خط 231 که دستور هدر دارد یعنی خط:

    header("location:../taiide_sabtenam.php?id=".$id_user." ");

    را غیر فعال می کنیم

    آنوقت می بینیم که بعضی از هدر هایی که در خطوط بالاتر است، مثلا:

    header("location:../account_sait_j.php?S_hamrah_n");

    عمل می کند، وگرنه این خطوط عمل نمی کند!!

    عجیب است، مگر اجرای شرط در خطوط بالاتر، باید به فعال یا غیر فعال شدن یک خط در خطوط پایینتر ربط داشته باشد؟
    لطفا راهنمایی فرمایید
    با تشکر قبلی
     
    نوشته شده توسط ozv در ‏14 آوریل 2019 در 14:13
  3. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    10,823
    تشکر شده:
    10,885
    امتیاز دستاورد:
    113
    من تخصصی در مورد php ندارم ولی ایراد در مورد تابع header مشخصه.
    دستورات همونطور که گفتید سطر به سطر از بالا به پایین اجرا میشه. اما سه نکته رو در نظر بگیرید، اول اینکه ()header در نسخه های PHP 4.4 برای مسائل امنیتی فقط یکبار و برای ارسال اول عمل میکنه و نسخه های بعدی منجر به خطا میشه. دوم اینکه ()header فقط زمانی عمل می کنه که قبل از اجراش خروجی خاصی به صفحه html ارسال نشده باشه. یعنی طبق اصول زبان php تابع header باید همواره پیش از هرگونه خروجی دیگری (نظیر echo و print و <html> و ...) قرار بگیره. header صفحه شما باید قبل از متنش ایجاد بشه، اگر قبل از اینکه header رو مشخص کنید متنی در صفحه قرار بدید، حتی یک کاراکتر یا سطر خالی، در دستورات بعدی امکان استفاده از تابع header منتفی میشه. و نکته سوم اینکه بروز خطا قاعدتا جلوی اجرا دستورات بعدی رو میگیره.
    PHP: header - Manual
    PHP header() Function
     
    نوشته شده توسط the_king در ‏15 آوریل 2019 در 04:28
  4. ozv

    ozv New Member

    ارسال‌ها:
    6
    تشکر شده:
    0
    امتیاز دستاورد:
    1
    با همه این مواردی که فرمودید، پس چرا وقتی خط هدر پایین
    یعنی خط:
    header("location:../taiide_sabtenam.php?id=".$id_user." ");

    را غیر فعال می کنیم
    آنوقت می بینیم که بعضی از هدر هایی که در خطوط بالاتر است، مثلا:

    header("location:../account_sait_j.php?S_hamrah_n");


    فعال می شود و وقتی غیر فعال می کنیم، هدر بالایی غیر فعال می شود؟
    اگر هدرهای بالایی شرایطی که فرمودید، ندارد، اصلا نباید عمل کند، چرا با غیر فعال کردن پایینی فعال می شود؟
     
    نوشته شده توسط ozv در ‏15 آوریل 2019 در 08:39

به اشتراک بگذارید