0

I'm trying to make a form for the user to upload multiple images at a time. I am trying to make all of the images that are submitted at once to be put into the same MySQL table row. The issue I am having is that when the user submits an image(s), all data is submitted properly into the columns, except for the image, image1, image2, image3, and image4 columns. These columns are the ones that hold the actual image file, i presume. For example, I submitted an image, and the image column shows [BLOB - 14 B], when I believe it should be at least 300 KB. I also have a viewimage.php page that should normally display an image, and it is showing a tiny error picture. I believe that means the column does not contain any image file.

Here is my full PHP page code:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  <html>
  <head><title>File Upload To Database</title></head>
  <body>
  <h2>Please Choose a File and click Submit</h2>
  <form enctype="multipart/form-data" action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>" method="post">
  <input type="hidden" name="MAX_FILE_SIZE" value="99999999" />
  <div><input name="userfile[]" type="file" /></div>
    <div><input name="userfile[]" type="file" /></div>
      <div><input name="userfile[]" type="file" /></div>
        <div><input name="userfile[]" type="file" /></div>
          <div><input name="userfile[]" type="file" /></div>
  <div><input type="submit" value="Submit" /></div>
  </form>

</body></html>

<?php
/*** check if a file was submitted ***/
if(!isset($_FILES['userfile']))
    {
    echo '<p>Please upload a display picture.</p>';
    }
else
    {
    try    {
        upload();
        /*** give praise and thanks to the php gods ***/
        echo '<p>Thank you for submitting</p>';
        }
    catch(Exception $e)
        {
        echo '<h4>'.$e->getMessage().'</h4>';
        }
    }

/*
 * Check the file is of an allowed type
 * Check if the uploaded file is no bigger thant the maximum allowed size
 * connect to the database
 * Insert the data
 */

/**
 *
 * the upload function
 * 
 * @access public
 *
 * @return void
 *
 */
function upload(){

$maxsize = 99999999;
$columnNames = '';
$columnValues = '';
$paramsToBeBound = array();

echo '<pre>' . print_r($_FILES, TRUE) . '</pre>';

/*** check if a file was uploaded ***/
for($i = 0; ($i < count($_FILES['userfile']['tmp_name']) && $i < 5); $i++) {
    if($_FILES['userfile']['tmp_name'][$i] != '') { // check if file has been set to upload
        if($_FILES['userfile']['error'][$i] == 0 && is_uploaded_file($_FILES['userfile']['tmp_name'][$i]) && getimagesize($_FILES['userfile']['tmp_name'][$i]) != false) {
            /***  get the image info. ***/
            $size = getimagesize($_FILES['userfile']['tmp_name'][$i]);
            /*** assign our variables ***/
            $type = $size['mime'];
            $imgfp = fopen($_FILES['userfile']['tmp_name'][$i], 'rb');
            $size = $size[3];
            $name = $_FILES['userfile']['name'][$i];


             /***  check the file is less than the maximum file size ***/
            if($_FILES['userfile']['size'][$i] < $maxsize)
                {
                    if($i > 0) {
                        $columnNames .= ', image_type' . $i . ', image' . $i . ', image_size' . $i . ', image_name' .$i;
                        $columnValues .= ', ?, ?, ?, ?';
                    } else {
                        $columnNames .= 'image_type, image, image_size, image_name';
                        $columnValues .= '?, ?, ?, ?';
                    }

                    $paramsToBeBound[] = $type;
                    $paramsToBeBound[] = $imgfp;
                    $paramsToBeBound[] = $size;
                    $paramsToBeBound[] = $name;
                } else
                    throw new Exception("File Size Error"); //throw an exception is image is not of type
            }
        else
            {
            // if the file is not less than the maximum allowed, print an error
            throw new Exception("Unsupported Image Format of image!");
            }
        }
    }
    if(count($paramsToBeBound) > 0) {
        $dbh = new PDO("mysql:host=scom;dbname=ksm", 'kesgbm', 'Kszer'); // I tested with MySQL database and worked fine.

        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $stmt = $dbh->prepare('INSERT INTO testblob (' . $columnNames . ') VALUES (' . $columnValues . ')');

        $i = 0;
        foreach($paramsToBeBound as &$param) {
            $i++;
            if($i == 2 || $i - floor($i / 4) == 2) {
                $stmt->bindParam($i, $param, PDO::PARAM_LOB);
            } else {
                $stmt->bindParam($i, $param);
            }
        }

        $stmt->execute();
    }
}


?>

Here is the code I used in PHP MyAdmin SQL to create the MySQL Table:

CREATE TABLE testblob ( image_id tinyint(3) NOT NULL AUTO_INCREMENT, image_type varchar(25) NOT NULL, image longblob NOT NULL, image_size varchar(25) NOT NULL, image_name varchar(50) NOT NULL, image_type1 varchar(25) NOT NULL, image1 longblob NOT NULL, image_size1 varchar(25) NOT NULL, image_name1 varchar(50) NOT NULL, image_type2 varchar(25) NOT NULL, image2 longblob NOT NULL, image_size2 varchar(25) NOT NULL, image_name2 varchar(50) NOT NULL, image_type3 varchar(25) NOT NULL, image3 longblob NOT NULL, image_size3 varchar(25) NOT NULL, image_name3 varchar(50) NOT NULL, image_type4 varchar(25) NOT NULL, image4 longblob NOT NULL, image_size4 varchar(25) NOT NULL, image_name4 varchar(50) NOT NULL, image_ctgy varchar(25) NOT NULL, KEY image_id (image_id) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Thank you for any help. I appreciate all help given.

Additional Information: The form is only supposed to submit images if at least the first input has been given an image. If the user leaves the first image input blank but chooses the second to input an image, the form won't submit. The first image input is supposed to act as the display picture for the user, which is why I would like it to be required, first and foremost. The user shouldn't have to upload all 5 images for the form to submit.

10
  • I'm not sure what you mean with "The issue I am having is that when the user submits multiple images at once, each image is put into a new, and seperate row." but have you considered to save the images in a folder and the PATH in the DB? Commented Feb 13, 2014 at 19:58
  • No, but that would take too long. Commented Feb 13, 2014 at 21:19
  • I deleted my answer, I'll setup MySQL database, test everything and post my answer when it will work. At this moment it is useless. Commented Feb 13, 2014 at 21:52
  • Answer updated with working code(tested). Commented Feb 13, 2014 at 23:46
  • Thank you, Daniel. The SQL part is working in the sense that it is no longer creating new rows for each image. The problem is that if an image is added, all columns for that image is filled out exactly the same. For example, if I added an image named 'home.jpg', it will enter the image_size, image_name, image, and image_type columns as 'home.jpg'. If I add all five images, it appears that the last image added will fill out all every images' columns as the last image's name. I have added the code I used in PHP MyAdmin's SQL to add the table, and I updated my code to what I currently have. Commented Feb 13, 2014 at 23:53

2 Answers 2

1

For every image uploaded you're executing INSERT query. 4 images is equal to 4 insert queries. Every insert query generates new row in MySQL database. You should execute only one INSERT query at the end, and if image has been uploaded add more values to that query. It's going to take some time to rewrite your code. I think you could also use:

<input name="userfile[]" type="file" /><br />
<input name="userfile[]" type="file" /><br />

instead of userfile, userfile1 etc.

@EDIT

Finally, I've rewritten code and it's working. I tested it on MySQL database.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  <html>
  <head><title>File Upload To Database</title></head>
  <body>
  <h2>Please Choose a File and click Submit</h2>
  <form enctype="multipart/form-data" action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>" method="post">
  <input type="hidden" name="MAX_FILE_SIZE" value="99999999" />
  <div><input name="userfile[]" type="file" /></div>
    <div><input name="userfile[]" type="file" /></div>
      <div><input name="userfile[]" type="file" /></div>
        <div><input name="userfile[]" type="file" /></div>
          <div><input name="userfile[]" type="file" /></div>
  <div><input type="submit" value="Submit" /></div>
  </form>

</body></html>

<?php
/*** check if a file was submitted ***/
if(!isset($_FILES['userfile']))
    {
    echo '<p>Please upload a display picture.</p>';
    }
else
    {
    try    {
        upload();
        /*** give praise and thanks to the php gods ***/
        echo '<p>Thank you for submitting</p>';
        }
    catch(Exception $e)
        {
        echo '<h4>'.$e->getMessage().'</h4>';
        }
    }

/*
 * Check the file is of an allowed type
 * Check if the uploaded file is no bigger thant the maximum allowed size
 * connect to the database
 * Insert the data
 */

/**
 *
 * the upload function
 * 
 * @access public
 *
 * @return void
 *
 */
function upload(){

$maxsize = 99999999;
$columnNames = '';
$columnValues = '';
$paramsToBeBound = array();

echo '<pre>' . print_r($_FILES, TRUE) . '</pre>';

/*** check if a file was uploaded ***/
for($i = 0; ($i < count($_FILES['userfile']['tmp_name']) && $i < 5); $i++) {
    if($_FILES['userfile']['tmp_name'][$i] != '') { // check if file has been set to upload
        if($_FILES['userfile']['error'][$i] == 0 && is_uploaded_file($_FILES['userfile']['tmp_name'][$i]) && getimagesize($_FILES['userfile']['tmp_name'][$i]) != false) {
            /***  get the image info. ***/
            $size = getimagesize($_FILES['userfile']['tmp_name'][$i]);
            /*** assign our variables ***/
            $type = $size['mime'];
            $imgfp = fopen($_FILES['userfile']['tmp_name'][$i], 'rb');
            $size = $size[3];
            $name = $_FILES['userfile']['name'][$i];


             /***  check the file is less than the maximum file size ***/
            if($_FILES['userfile']['size'][$i] < $maxsize)
                {
                    if($i > 0) {
                        $columnNames .= ', image_type' . $i . ', image' . $i . ', image_size' . $i . ', image_name' .$i;
                        $columnValues .= ', ?, ?, ?, ?';
                    } else {
                        $columnNames .= 'image_type, image, image_size, image_name';
                        $columnValues .= '?, ?, ?, ?';
                    }

                    $paramsToBeBound[] = $type;
                    $paramsToBeBound[] = $imgfp;
                    $paramsToBeBound[] = $size;
                    $paramsToBeBound[] = $name;
                } else
                    throw new Exception("File Size Error"); //throw an exception is image is not of type
            }
        else
            {
            // if the file is not less than the maximum allowed, print an error
            throw new Exception("Unsupported Image Format of image!");
            }
        }
    }
    if(count($paramsToBeBound) > 0) {
        $dbh = new PDO('mdsm;dbname=kesm', 'kabm', 'Kar'); // I tested with MySQL database and worked fine.

        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $stmt = $dbh->prepare('INSERT INTO testblob (' . $columnNames . ') VALUES (' . $columnValues . ')');

        $i = 0;
        foreach($paramsToBeBound as &$param) {
            $i++;
            if($i == 2 || $i - floor($i / 4) == 2) {
                $stmt->bindParam($i, $param, PDO::PARAM_LOB);
            } else {
                $stmt->bindParam($i, $param);
            }
        }

        $stmt->execute();
    }
}


?>
Sign up to request clarification or add additional context in comments.

13 Comments

I tried out your code, and I am getting the error " Unsupported Image Format! ".
I took out throw new Exception("Unsupported Image Format!");, and it is not giving the error anymore. It now says "Thank you for submitting.", but no rows/images are added to the table. I have updated the code in my question.
I used your code, and when I try to submit one image using the first input I get the "Unsupported Image Format!" error. I tried uploading all five images at once, and I got the "Thank you for submitting" message, but my MySQL table did not recieve any new rows or images. I updated my code in my question to what I am currently using.
If the user uploaded 5 images at once, I would like all 5 images to be saved into the same MySQL table row. I am just letting you know, in case you didn't already know.
I am now using the code posted in your answer. It appears that when a user hits submit, the files do not get sent to the SQL table. Although, it appears array code gets displayed on the php page when submit is hit. I posted the code in my question.
|
0

You have "INSERT INTO testblob ( run for each file.

Put the SQL query outside of the loop.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.