troubleshooting Question

I am trying to upload a form with multiple images and store the required data inside a data object and use the data object to upload to database.. Now I have it working without the images attached

Avatar of B O
B O asked on
PHP
21 Comments1 Solution17 ViewsLast Modified:
I am trying to upload multi files with php with the input type file set on multiple, and dynamically create a new variable for each file uploaded, these variables will be used as a key and value that I want to set inside a data object,
The data object willbe used for uploading the data to the server

View:

        <a href="<?php echo URLROOT; ?>/posts" class="btn btn-light"><i class="fas fa-chevron-left"></i> back</a>
        <div class="card card-body bg-light mt-5">
            <h2>Add posts</h2>
            <p>Create a post with this form</p>
            <form action="<?php echo URLROOT; ?>/posts/add" method="post" enctype="multipart/form-data">
                
                <div class="form-group">
                    <label for="title">Title: <sup>*</sup></label>
                    <input type="title" name="title" class="form-control form-control-lg <?php echo (!empty($data['title_err'])) ? 'is-invalid' : ''; ?>" value="<?php echo $data['title']; ?>" >
                    <span class="invalid-feedback"><?php echo $data['title_err']; ?></span>
                </div>


                <div class="form-group">
                    <label for="type_work">Short description of type work: <sup>*</sup></label>
                    <input type="title" name="type_work" class="form-control form-control-lg" value="<?php echo $data['type_work']; ?>" >
                    <span class="invalid-feedback"></span>
                </div>
                
                <div class="form-group">
                    <label for="body">Text: <sup>*</sup></label>
                    <textarea name="body" class="form-control form-control-lg <?php echo (!empty($data['body_err'])) ? 'is-invalid' : ''; ?>"><?php echo $data['body']; ?></textarea>
                    <span class="invalid-feedback"><?php echo $data['body_err']; ?></span>
                </div>


                <!-- Images upload -->
                <div class="form-group">
                    <label for="img">Image<sup>1</sup>: Main Image</label>v
                    <input type="file" name="img[]" class="form-control form-control-lg<?php echo (!empty($data['img_err'])) ? 'is-invalid' : ''; ?>"  multiple>
                    <span class="invalid-feedback"><?php echo $data['img_err']; ?></span>
                </div>


                <input type="submit" class="btn btn-success" value="Submit">
              
            </form>
</div>


Controller
public function add(){


        if($_SERVER['REQUEST_METHOD'] == 'POST'){


            // Sanitize Post array
            $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);


            $data = [                
                'title' => trim($_POST['title']),
                'type_work' => $_POST['type_work'],
                'body' => trim($_POST['body']),
                'user_id' => $_SESSION['user_id'],
                'title_err' => '',
                'body_err' => '',
                'img_err' => ''
            ];


           


            // Valitdate title
            if(empty($data['title'])){
                $data['title_err'] = 'Enter title';
            }


            // Valitdate body
            if(empty($data['body'])){
                $data['body_err'] = 'Enter text';
            }


            // Make sure there is no erro
            if(empty($data['title_err']) && empty($data['body_err'])){


            //      // get posted images
            // foreach($_FILES['img'] as $img){
                $countFiles = count($_FILES['img']['name']);
                // loop through images loaded
                for($i = 1; $i < $countFiles; $i++){
                    // if user load more than 5 images
                    if( $i > 5 ){
                        // set error message for user
                        $data['img_err'] = 'Load up to 5 images';
                    } else {
                        // set error inside variable
                        $fileError = $_FILES['img']['error'];
                        // Check if there is an error
                        if($fileError > 0){


                            $data['img_err'] = "There is an error with file {$i}";
                        } else {
                            // get file size
                            $fileSize = $_FILES['img']['size'];


                            // check file size
                            if($fileSize < 3000000){
                                // set error message
                                $data['img_err'] = "image {$i} to big";
                            } else {             
                                //  get file name e.g. mansamusa.png   
                                $fileName = $_FILES['img']['name'];


                                $fileExtension = explode(".", $fileName);
                                $fileActualName = strtolower(array_key_first($fileExtension));
                                $fileActualExt = strtolower(end($fileExtension));


                                $allowed = array("jpg", "jpeg", "png");
                                
                                // check if file extension is allowed
                                if (in_array($fileActualExt, $allowed)) {


                                    // get temp_name file
                                    $fileTempName = $_FILES['img']['tmp_name'];


                                    // set new name for image
                                    $imageFullName = $fileActualName . "." . uniqid("", true) . "." . $fileActualExt;
                                    // set destination of image
                                    $fileDestination = URLROOT. '/public/img/posts/' . $imageFullName;


                                    // creat a dynamic key name
                                    // function newVar($key, $value){


                                    //     return  ${"img_ $key"} = $value;


                                    // }


                                    // $data .= ${"img_ $key"}[$value];


                                    var_dump($data);


                                    // $data[] .= newVar($i, $imageFullName);
                                    
                                    // $data['img_err'] = $data;


                                    // move the current file[temp_name] and set it to path + new file name
                                    // if(move_uploaded_file($fileTempNameOne, $fileDestination)){
                                        // Set key[image #] and value[name] ready for upload
                                    //     $data .= ["img_{$i}" => $imageFullName];
                                    // } else {
                                    //     // set error message
                                    //      $data['img_err'] = 'Failure Image upload';
                                    // }


                                } else {
                                    
                                    // set error message
                                    $data['img_err'] = 'Type image is not allowed for upload';


                                }                                
                                
                            }
                            
                        }
                        
                    }
                    
                }
            // }


                
                // // validated
                // if($this->postModel->addPost($data)){
                //     flash('post_message', 'Post Added');
                //     redirect('posts');
                // } else {
                //     die('Something went wrong');
                // }
            } else {
                // Load view with errors
                $this->view('posts/add', $data);
            }
            
        } else {


        }


        $data = [
            'title' => '',
            'type_work' => '',
            'body' => ''
        ];


        $this->view('posts/add', $data);
    }




Model

 public function addPost($data){


                $this->db->query('INSERT INTO posts (title, user_id, body, img_1, img_2, img_3, img_4, img_5) VALUES(:title, :user_id, :body, :img_1, :img_2, :img_3, :img_4, :img_5)');
                
                //  Bind Values
                $this->db->bind(':title', $data['title']);
                $this->db->bind(':user_id', $data['user_id']);
                $this->db->bind(':body', $data['body']);


                // bind values of images
                $this->db->bind(':img_1', $data['img_1']);
                $this->db->bind(':img_2', $data['img_2']);
                $this->db->bind(':img_3', $data['img_3']);
                $this->db->bind(':img_4', $data['img_4']);
                $this->db->bind(':img_5', $data['img_5']);


    
                // Execute
                if($this->db->execute()){
                    return true;
                } else {
                    return false;
                }
        }

Image



ASKER CERTIFIED SOLUTION
Join our community to see this answer!
Unlock 1 Answer and 21 Comments.
Start Free Trial
Learn from the best

Network and collaborate with thousands of CTOs, CISOs, and IT Pros rooting for you and your success.

Andrew Hancock - VMware vExpert
See if this solution works for you by signing up for a 7 day free trial.
Unlock 1 Answer and 21 Comments.
Try for 7 days

”The time we save is the biggest benefit of E-E to our team. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange.

-Mike Kapnisakis, Warner Bros