Question

How can I separate multiple uploaded files ($new_file_name) out of foreach loop for sql query process? How to assign each files to its variable?

// manipulate uploaded images
if(isset($_FILES['files'])){

    foreach($_FILES['files']['tmp_name'] as $key => $tmp_name){

        $file_name = $key.'_'.$_FILES['files']['name'][$key];
        $file_size = $_FILES['files']['size'][$key];
        $file_tmp = $_FILES['files']['tmp_name'][$key];
        $file_type = $_FILES['files']['type'][$key];

        //explode fine name and extension
        $ext_x = explode('.', $_FILES['files']['name'][$key]);
        $ext = strtolower(end($ext_x));
        $file_name = str_replace('.'.$ext, '', $_FILES['files']['name'][$key]);

        //new file name
        $output_dir = '../items/'.$list_id;
        $new_file_name = rand(1, 999999).'.'.$ext;
        $pathfile = $output_dir.'/'.$new_file_name;

        // create directory if does not exist
        if(is_dir($output_dir) == false){
            mkdir($output_dir, 0700);
        }

        if(is_dir($pathfile) == false){

            if(move_uploaded_file($file_tmp, $pathfile)){

                //resize original image
                WideImage::load($pathfile)->resize(300, 400)->saveToFile($pathfile);

                //generate thumbnail
                $split = explode('.', $new_file_name);
                $thumb = $split[0].'_t.'.$split[1];

                WideImage::load($pathfile)->resize(70, 70)->saveToFile($output_dir.'/'.$thumb);
            }

        }

    }

}

//here I needed to get each of the uploaded images to update database (max 3 images)

//how to explode above $new_file_name into variable here?
$new_file_name1 = $new_file_name[0]; //and so on...

$q = $mysqli->query("UPDATE `listing` SET image1='".$new_file_name1."', image2='".$new_file_name2."', image3='".$new_file_name3."', thumbnail='".$thumb1."', WHERE list_id='".$list_id."' AND user_id='".$user_id."'") or die($mysqli->error);

I can get each of the file by

$var0 = $_FILES['files']['name'][0];
$var1 = $_FILES['files']['name'][1];
$var2 = $_FILES['files']['name'][2];

but I can't

$var0 = $new_file_name[0];
$var1 = $new_file_name[1];
$var2 = $new_file_name[2];

Thanks for advise!

Était-ce utile?

La solution

Use this to set the name:

$new_file_name[] = rand(1, 999999).'.'.$ext;

and inside the for loop use:

end($new_file_name)

for the current file. E.g:

    $pathfile = $output_dir.'/'.end($new_file_name);

The problem you are having is because in every iteration through the loop you setup the $new_file_name to a new random string. By using $new_file_name[] you are adding an element to $new_file_name which is then becoming an array. Using the end() functions returns the last element of the array so in the current iteration of the loop it will return the last added random string which corresponds to your current file;

EDIT:

// manipulate uploaded images
if(isset($_FILES['files'])){

foreach($_FILES['files']['tmp_name'] as $key => $tmp_name){

    $file_name = $key.'_'.$_FILES['files']['name'][$key];
    $file_size = $_FILES['files']['size'][$key];
    $file_tmp = $_FILES['files']['tmp_name'][$key];
    $file_type = $_FILES['files']['type'][$key];

    //explode fine name and extension
    $ext_x = explode('.', $_FILES['files']['name'][$key]);
    $ext = strtolower(end($ext_x));
    $file_name = str_replace('.'.$ext, '', $_FILES['files']['name'][$key]);

    //new file name
    $output_dir = '../items/'.$list_id;
    $new_file_name[] = rand(1, 999999).'.'.$ext;
    $pathfile = $output_dir.'/'.end($new_file_name);

    // create directory if does not exist
    if(is_dir($output_dir) == false){
        mkdir($output_dir, 0700);
    }

    if(is_dir($pathfile) == false){

        if(move_uploaded_file($file_tmp, $pathfile)){

            //resize original image
            WideImage::load($pathfile)->resize(300, 400)->saveToFile($pathfile);

            //generate thumbnail
            $split = explode('.', end($new_file_name));
            $thumb = $split[0].'_t.'.$split[1];

            WideImage::load($pathfile)->resize(70, 70)->saveToFile($output_dir.'/'.$thumb);
        }

    }

}

}

//Getting the variables
$new_file_name1 = $new_file_name[0]; //and so on...

$q = $mysqli->query("UPDATE `listing` SET image1='".$new_file_name1."', image2='".$new_file_name2."', image3='".$new_file_name3."', thumbnail='".$thumb1."', WHERE list_id='".$list_id."' AND user_id='".$user_id."'") or die($mysqli->error);

You could also use: $new_file_name[0] inside the SQL query.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top