मुझे इसके साथ चालू और बंद करने में समस्या हो रही है। यह बहुत असंगत है। मेरे पास एक ऐसा फॉर्म है जहां एक शीर्षक (इनपुट), संक्षिप्त विवरण (इनपुट), पूर्ण विवरण (टेक्स्टरेरा) और छवियां अपलोड होती हैं। (नीचे सभी प्रासंगिक कोड)।

प्रपत्र पर सबमिट करने के बाद, फ़ाइल अपलोड को संभालने के लिए एक PHP स्क्रिप्ट चलाई जाती है। प्रत्येक फ़ाइल को उसके अस्थायी स्थान से स्थानांतरित करने से पहले, यदि कथनों को मान्य किया जाना है, तो यह एक श्रृंखला के माध्यम से जाता है। यदि यह सत्यापन चरण में विफल रहता है, तो उस स्थिति का अन्य विवरण लागू किया जाता है और एक PHP सत्र, 'कारण', समस्या के आधार पर एक शब्द पर सेट किया जाता है। (यानी $_SESSION['reason']="invalidfile')। उपयोगकर्ता को फिर फॉर्म पेज पर वापस भेज दिया जाता है, जहां 'कारण' पर सेट होने के आधार पर, उपयोगकर्ता को एक विशिष्ट त्रुटि दिखाई जाती है। पहली सत्यापन शर्त काम करती है (जाँच करें कि सभी फ़ील्ड भरे गए हैं)। हालाँकि, उनमें से कोई भी उसके बाद काम नहीं करता है। इस तथ्य को छोड़कर कि कभी-कभी वे करते हैं।

इस मुद्दे पर किसी भी मदद की बहुत सराहना की जाएगी। यह जानना भी उपयोगी हो सकता है कि, कभी-कभी, क्रोम में, चित्र अपलोड होते हैं लेकिन पृष्ठ कभी भी पुष्टि पृष्ठ पर पुनर्निर्देशित नहीं होता है। Microsoft Edge में ऐसा कभी नहीं होता है।

HTML फॉर्म - शीर्षक, संक्षिप्त विवरण, पूर्ण विवरण, छवि फ़ाइलें

// If there is a file uploaded when you redirect back from the confirm page and 'return' is set in the header.
  if(isset($_SESSION['file'])){
    // For every image uploaded:
    for($i = 0; $i < count($_SESSION['file']['destination']); $i++){
      // Delete the image because the user is forced to reupload them anyway.
      unlink($_SESSION['file']['destination'][$i]);
    }

    // Unset the 'file' session now we don't need it anymore
    unset($_SESSION['file']);
    header("Location: index.php?page=createproject");
  }
?>

<h1>Create Project</h1>
<p><a href="index.php?page=admin">Go back</a></p>

<form action="index.php?page=createprojectstorefiles" method="post" enctype="multipart/form-data">
  <p>Project Title: <input type="text" name="title" maxlength="35" autocomplete="off"
    <?php
    if(isset($_SESSION['project_details'])){
      echo "value='".$_SESSION['project_details']['title']."'";
    }
    ?>
    /></p>
  <p>Project Images: <input type="file" name="file[]" accept=".png, .jpg, .jpeg" multiple/></p>
  <p><label for="textarea" style="vertical-align: top; margin-right: 5px;">Short Descritption: </label><textarea name="short_description" rows="4" cols="60" maxlength="80" style="resize: none;"><?php
      if(isset($_SESSION['project_details'])){
        echo $_SESSION['project_details']['short_description'];
      }
    ?></textarea></p>
  <p><label for="textarea" style="vertical-align: top; margin-right: 5px;">Full Story: </label><textarea name="long_description" rows="15" cols="125" maxlength="5000" style="resize: none;"><?php
      if(isset($_SESSION['project_details'])){
        echo $_SESSION['project_details']['long_description'];
      }
    ?></textarea></p>

  <?php
    // If a reason has been sent for the form not working and the user hasn't been logged out.
    if(isset($_SESSION['reason'])){

      // If a 'reason' has been sent for not logging in.
      if(isset($_SESSION['reason'])){

        // Tell the user the reason.
        if($_SESSION['reason']=="noinput"){
          echo "<p><font color='red'><span class='error'>You can't leave any boxes blank</span></font></p>";
        } elseif($_SESSION['reason']=="invalidfile"){
          echo "<p><font color='red'><span class='error'>The file must be a '.jpg', '.jpeg' or '.png'</span></font></p>";
        } elseif($_SESSION['reason']=="uploaderror"){
          echo "<p><font color='red'><span class='error'>There was an error uploading your image!</span></font></p>";
        } elseif($_SESSION['reason']=="filetoolarge"){
          echo "<p><font color='red'><span class='error'>Your file is too large. The max file size is 500MB</span></font></p>";
        } elseif($_SESSION['reason']=="success"){
          header("Location: index.php?page=createprojectconfirm");
        } else{
          echo "<p><font color='red'><span class='error'>Something went wrong in validation, contact a network administrator</span></font></p>";
        }

        // Once the user has been told, unset the session.
        unset($_SESSION['reason']);

      // Otherise, presume that it's due to an incorrect username or password.
      } else{
        echo "<p><font color='red'><span class='error'>Something went wrong in validation, contact a network administrator</span></font></p>";
      }
    }
  ?>

  <p><button type="reset">Reset Form</button> <button type="submit" name="createproject">Preview Project</button></p>
</form>

PHP स्क्रिप्ट - सत्यापित करें और अपलोड की गई फ़ाइलों को अस्थायी फ़ोल्डर से स्थानांतरित करें

    // Make sure no reason is set.
  if(isset($_SESSION['reason'])){
    unset($_SESSION['reason']);
  }

  if(isset($_SESSION['file'])){
    unset($_SESSION['file']);
  }

  // If the create project form has been submitted:
  if(isset($_POST['createproject'])){

    // Set all of the variables for the other text boxes in a session called 'project_details'.
    $_SESSION['project_details']['title'] = $_POST['title'];
    $_SESSION['project_details']['short_description'] = $_POST['short_description'];
    $_SESSION['project_details']['long_description'] = $_POST['long_description'];

    // If all of the fileds have been filled in:
    if(!empty($_POST['title']) && $_FILES['file']['error'][0]=='UPLOAD_ERR_OK' && !empty($_POST['short_description']) && !empty($_POST['long_description'])){

      // Count the number of files uploaded.
      $fileCount = count($_FILES['file']['name']);
      $_SESSION['file']['count'] = $fileCount;

      // Do for every uploaded file.
      for($i = 0; $i < $fileCount; $i++){

        // Set all of the variables for the file upload (file $i).
        $file = $_FILES['file'];

        $_SESSION['file']['name'] = $_FILES['file']['name'][$i];
        $_SESSION['file']['tmpName'] = $_FILES['file']['tmp_name'][$i];
        $_SESSION['file']['size'] = $_FILES['file']['size'][$i];
        $_SESSION['file']['error'] = $_FILES['file']['error'][$i];
        $_SESSION['file']['type'] = $_FILES['file']['type'][$i];

        $fileExt = explode(".", $_SESSION['file']['name']);
        $_SESSION['file']['actualExt'] = strtolower(end($fileExt));

        $allowed = array("jpg", "jpeg", "png");

        // If the file type is allowed:
        if(in_array($_SESSION['file']['actualExt'], $allowed)){

          // If there was no error uploading the file:
          if($_SESSION['file']['error'] == 0){

            // If the file isn't too large:
            if($_SESSION['file']['size'] < 500000){

              // Move the file from the temporary location to the new destination and set $_SESSION['reason'] to success so the page redirects to the confirm page. This shouldn't have to be neccesary to make it work but it is. No body on earth knows why.
              $fileNameNew = uniqid("", true).".".$_SESSION['file']['actualExt'];
              $_SESSION['file']['destination'][$i] = "projects/uploads/".$fileNameNew;
              move_uploaded_file($_SESSION['file']['tmpName'], $_SESSION['file']['destination'][$i]);

          // Otherwise, inform the user.
            } else{
              for($i = 0; $i < count($_SESSION['file']['destination']); $i++){
                // Delete the image because the user is forced to reupload them anyway.
                unlink($_SESSION['file']['destination'][$i]);
              }

              $_SESSION['reason']="filetoolarge";
              header("Location: index.php?page=createproject");
              exit();
            }

          // Otherwise, inform the user.
          } else{
            for($i = 0; $i < count($_SESSION['file']['destination']); $i++){
              // Delete the image because the user is forced to reupload them anyway.
              unlink($_SESSION['file']['destination'][$i]);
            }

            $_SESSION['reason']="uploaderror";
            header("Location: index.php?page=createproject");
            exit();
          }

        // Otherwise, inform the user.
        } else{
          for($i = 0; $i < count($_SESSION['file']['destination']); $i++){
            // Delete the image because the user is forced to reupload them anyway.
            unlink($_SESSION['file']['destination'][$i]);
          }

          $_SESSION['reason']="invalidfile";
          header("Location: index.php?page=createproject");
          exit();
        }
      }

      // After all the files have been uploaded, if the header function doesn't work, use the session method to redirect to the complete page.
      if(!header("Location: index.php?page=createprojectconfirm")){
        $_SESSION['reason']="success";
        exit();
      }

    // Otherwise, inform the user.
    } else{
      $_SESSION['reason']="noinput";
      header("Location: index.php?page=createproject");
      exit();
    }
  } else{
    header("Location: index.php?page=admin");
    exit();
  }
0
TJTech 21 फरवरी 2019, 23:13

1 उत्तर

सबसे बढ़िया उत्तर

समस्या कोड के पहले ब्लॉक में निहित थी। यदि उपयोगकर्ता पूर्वावलोकन पृष्ठ से वापस आ गया है तो सत्र 'फ़ाइल' को अनसेट करने के लिए शीर्ष पर एक कथन है। इसमें यह शर्त है कि यदि पृष्ठ लोड करते समय 'फ़ाइल' सेट की जाती है। यह परिदृश्य न केवल तब भी मौजूद हो सकता है जब उपयोगकर्ता पूर्वावलोकन पृष्ठ से वापस आ गया है क्योंकि वे चुनते हैं, बल्कि कोई त्रुटि होने पर भी। यह यदि कथन तब पृष्ठ को पुनः लोड करता है जिससे 'कारण' सत्र समाप्त हो जाता है और त्रुटि दिखाई नहीं देती है।

मैंने इफ स्टेटमेंट की शर्तों को संपादित करके इसे ठीक किया। यह सुनिश्चित करने के लिए एक चेक जोड़कर कि 'कारण' सत्र सेट नहीं किया गया है, यानी कोई त्रुटि नहीं थी लेकिन उपयोगकर्ता ने वापस जाना चुना:

if(isset($_SESSION['file']) && !isset($_SESSION['reason'])){
    // For every image uploaded:
    for($i = 0; $i < count($_SESSION['file']['destination']); $i++){
      // Delete the image because the user is forced to reupload them anyway.
      unlink($_SESSION['file']['destination'][$i]);
    }

    // Unset the 'file' session now we don't need it anymore
    unset($_SESSION['file']);
    header("Location: index.php?page=createproject");
  }
0
TJTech 22 फरवरी 2019, 12:48