Search code examples
phpuploadexit-code

what is an alternative to exit(); without breaking page


For example, now when I kill a script using die() or exit() my pages look half broken because the bottom part of the page's html failed to load since it was being brought in using the include() function.

So is there a way to tell PHP "don't allow any more commands to be executed except the rest of the webpage loading" ?

I am using this for an image upload script.

front: enter image description here

but when I have a wrong file type uploaded or no file at all, it breaks my webpage because I set exit();

enter image description here enter image description here

What can I do to fix this? Here is my code and you'll notice the exit();'s

if (isset($_POST['submit']))
{
    $file_uniq_id = uniqid();

    // Access the $_FILES global variable for this specific file being uploaded
    // and create local PHP variables from the $_FILES array of information

    $fileName = $_FILES["uploaded_file"]["name"]; // The file name
    $fileTmpLoc = $_FILES["uploaded_file"]["tmp_name"]; // File in the PHP tmp folder
    $fileType = $_FILES["uploaded_file"]["type"]; // The type of file it is
    $fileSize = $_FILES["uploaded_file"]["size"]; // File size in bytes
    $fileErrorMsg = $_FILES["uploaded_file"]["error"]; // 0 for false... and 1 for true
    $kaboom = explode(".", $fileName); // Split file name into an array using the dot
    $fileExt = end($kaboom); // Now target the last array element to get the file extension

    // START PHP Image Upload Error Handling --------------------------------------------------

    if (!$fileTmpLoc)
    { // if file not chosen
        echo "ERROR: Please browse for a file before clicking the upload button.";
        exit();
    }
    else
    if ($fileSize > 5242880)
    { // if file size is larger than 5 Megabytes
        echo "ERROR: Your file was larger than 5 Megabytes in size.";
        unlink($fileTmpLoc); // Remove the uploaded file from the PHP temp folder
        exit();
    }
    else
    if (!preg_match("/.(gif|jpg|png)$/i", $fileName))
    {

        // This condition is only if you wish to allow uploading of specific file types

        echo "ERROR: Your image was not .gif, .jpg, or .png.";
        unlink($fileTmpLoc); // Remove the uploaded file from the PHP temp folder
        exit();
    }
    else
    if ($fileErrorMsg == 1)
    { // if file upload error key is equal to 1
        echo "ERROR: An error occured while processing the file. Try again.";
        exit();
    }

    // END PHP Image Upload Error Handling ----------------------------------------------------
    // Place it into your "uploads" folder mow using the move_uploaded_file() function

    $moveResult = move_uploaded_file($fileTmpLoc, "uploads/$fileName");

    // Check to make sure the move result is true before continuing

    if ($moveResult != true)
    {
        echo "ERROR: File not uploaded. Try again.";
        unlink($fileTmpLoc); // Remove the uploaded file from the PHP temp folder
        exit();
    }

    // unlink($fileTmpLoc); // Remove the uploaded file from the PHP temp folder
    // ---------- Include Adams Universal Image Resizing Function --------

    include_once ("libs/ak_php_img_lib_1.0.php");

    $target_file = "uploads/$fileName";
    $resized_file = "uploads/" . $file_uniq_id . "." . $fileExt;
    $resized_file_final = $file_uniq_id . "." . $fileExt;
    mysql_query("UPDATE users SET profile_image = '$resized_file_final' WHERE id = '$id' ");
    $wmax = 128;
    $hmax = 128;
    ak_img_resize($target_file, $resized_file, $wmax, $hmax, $fileExt);
    unlink($target_file);

    // ----------- End Adams Universal Image Resizing Function -----------
    // Display things to the page so you can see what is happening for testing purposes

    echo "The file named <strong>$fileName</strong> uploaded successfuly.<br /><br />";
    echo "It is <strong>$fileSize</strong> bytes in size.<br /><br />";
    echo "It is an <strong>$fileType</strong> type of file.<br /><br />";
    echo "The file extension is <strong>$fileExt</strong><br /><br />";
    echo "The Error Message output for this upload is: <strong>$fileErrorMsg</strong><br /><br />";
    echo "The new name for the file is: <strong>$resized_file_final</strong>";
}

Solution

  • Try this, the idea is you have to complete the whole script so you get to add the page footer so the page looks complete. So instead of echoing errors as you find them AND THEN EXITing the script, save them in a variable. Then once you get to the main part of the script i.e. the image is loaded and you want to resize it, you decide if you had an error to output only the error and not do the image resize. If no errors are found then you fiddle with the image and dont output any error messages.

    if (isset($_POST['submit']))
    {
        $file_uniq_id = uniqid();
    
        // Access the $_FILES global variable for this specific file being uploaded
        // and create local PHP variables from the $_FILES array of information
    
        $fileName = $_FILES["uploaded_file"]["name"]; // The file name
        $fileTmpLoc = $_FILES["uploaded_file"]["tmp_name"]; // File in the PHP tmp folder
        $fileType = $_FILES["uploaded_file"]["type"]; // The type of file it is
        $fileSize = $_FILES["uploaded_file"]["size"]; // File size in bytes
        $fileErrorMsg = $_FILES["uploaded_file"]["error"]; // 0 for false... and 1 for true
        $kaboom = explode(".", $fileName); // Split file name into an array using the dot
        $fileExt = end($kaboom); // Now target the last array element to get the file extension
    
        // START PHP Image Upload Error Handling 
    
        $Err = NULL;
    
        if (!$fileTmpLoc)
        { // if file not chosen
            $Err = "ERROR: Please browse for a file before clicking the upload button.";
        }
        else
        if ($fileSize > 5242880)
        { // if file size is larger than 5 Megabytes
            $Err = "ERROR: Your file was larger than 5 Megabytes in size.";
            unlink($fileTmpLoc); // Remove the uploaded file from the PHP temp folder
        }
        else
        if (!preg_match("/.(gif|jpg|png)$/i", $fileName))
        {
            // This condition is only if you wish to allow uploading of specific file types
    
            $Err = "ERROR: Your image was not .gif, .jpg, or .png.";
            unlink($fileTmpLoc); // Remove the uploaded file from the PHP temp folder
        }
        else
        if ($fileErrorMsg == 1)
        { // if file upload error key is equal to 1
            $Err = "ERROR: An error occured while processing the file. Try again.";
        }
    
        // END PHP Image Upload Error Handling 
        // Place it into your "uploads" folder mow using the move_uploaded_file() function
    
        $moveResult = move_uploaded_file($fileTmpLoc, "uploads/$fileName");
    
        // Check to make sure the move result is true before continuing
    
        if ($moveResult != true) {
            $Err = "ERROR: File not uploaded. Try again.";
            // not needed PHP is supposed to do this
            // unlink($fileTmpLoc);
        }
    
        // ---------- Include Adams Universal Image Resizing Function --------
    
        if ( ! isset( $Err ) ) {    
    
            include_once ("libs/ak_php_img_lib_1.0.php");
    
            $target_file = "uploads/$fileName";
            $resized_file = "uploads/" . $file_uniq_id . "." . $fileExt;
            $resized_file_final = $file_uniq_id . "." . $fileExt;
            mysql_query("UPDATE users 
                         SET profile_image = '$resized_file_final' 
                         WHERE id = '$id' ");
            $wmax = 128;
            $hmax = 128;
            ak_img_resize($target_file, $resized_file, $wmax, $hmax, $fileExt);
            unlink($target_file);
    
            // ----------- End Adams Universal Image Resizing Function -----------
            // Display things to the page so you can see what is happening for testing purposes
    
            // as we had to process error in this if we better test again
            echo "The file named <strong>$fileName</strong> uploaded successfuly.<br /><br />";
            echo "It is <strong>$fileSize</strong> bytes in size.<br /><br />";
            echo "It is an <strong>$fileType</strong> type of file.<br /><br />";
            echo "The file extension is <strong>$fileExt</strong><br /><br />";
            echo "The Error Message output for this upload is: <strong>$fileErrorMsg</strong><br /><br />";
            echo "The new name for the file is: <strong>$resized_file_final</strong>";
    
        } else {
           echo $Err;
        }
    }