Codeigniter image name send to data base as name - php

is this thing do is possible?
I want to send data and image name to database please help me to fix this error
i this image text name not send to db thats why there was a error please help me to fix this error
this is my controller
public function upload_file()
{
$config['allowed_types'] = '*';
$config['file_name'] = $data-> 'filename';
$config['upload_path'] = './uploads/Ehi';
$config['encrypt_name'] = false;
$this->load->library('upload', $config);
if ($this->upload->do_upload('image'))
{
print_r($this->upload->data());
$this->load->model('ehi_model');
$data = array(
'title' => $this->input->post('title'),
'description' => $this->input->post('description'),
'username' => $this->input->post('username'),
'password' => $this->input->post('password'),
'activedays' => $this->input->post('activedays'),
'filename' => $data-> 'filename';
);
$this->ehi_model->upload_file($data);
redirect(base_url() ."Ehi/index");
}
else
{
print_r($this->upload->display_error());
}
}
and this is my model
function upload_file($data)
{
$this->db->insert('ehi', $data);
}

Where is this $data defined?
$config['file_name'] = $data-> 'filename';
But following change will work for you.
'filename' => $this->upload->data('file_name')
Reference

Use that.
$this->ehi_model->upload_file($this->upload->data('file_name'));

Related

Codeigniter 3 and Ion-Auth application bug: undefined index userfile

I am working on a Social Network application with Codeigniter 3, Ion-Auth and Bootstrap 4. You can see the Github repo HERE.
I have tried to add an avatar at user's registration.
For this purpose, I first added an "avatar" column to the users table. Then, in the view I added:
<div class="form-group">
<?php $avatar['class'] = 'form-control';
echo lang('edit_user_avatar_label', 'avatar');?>
<input type="file" class="form-control" name="userfile" id="avatar" size="20">
</div>
In the Auth controller (application/controllers/Auth.php) I created this upload method:
public function upload_image() {
$config['upload_path'] = './assets/img/avatars';
$config['allowed_types'] = 'jpg|jpeg|png';
$config['max_size'] = 2048;
$this->load->library('upload', $config);
if (!$this->upload->do_upload('userfile')) {
$error = array('error' => $this->upload->display_errors());
$this->_render_page('auth' . DIRECTORY_SEPARATOR . 'create_user', $error);
} else {
$this->data = array('image_metadata' => $this->upload->data());
$this->_render_page('auth' . DIRECTORY_SEPARATOR . 'create_user', $this->data);
}
}
Finally, to the existing $additional_data array, from the orihinal create_user() method, I added the line 'avatar' => $_FILES['userfile']['name']:
$additional_data = [
'first_name' => $this->input->post('first_name'),
'last_name' => $this->input->post('last_name'),
'avatar' => $_FILES['userfile']['name'],
'company' => $this->input->post('company'),
'phone' => $this->input->post('phone'),
];
The above line, when added to the $data array from the edit_user($id) method, has no errors, yet when added to the $additional_data array, it gives the error: Undefined index: userfile.
Where is my mistake?
UPDATE:
I replaced <?php echo form_open("auth/create_user");?> with <?php echo form_open_multipart("auth/create_user");?>.
Result: the image filename (with extension), is added in the users table avatar column. There is a problem though: the actual upload of the image, to ./assets/img/avatars does not take place.
Finaly working!!
if ($this->form_validation->run() === TRUE)
{
$email = strtolower($this->input->post('email'));
$identity = ($identity_column === 'email') ? $email : $this->input->post('identity');
$password = $this->input->post('password');
//return $this->upload_image();
$config['upload_path'] = './assets/img/avatars';
$config['file_ext_tolower'] = TRUE;
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 100;
$config['max_width'] = 1024;
$config['max_height'] = 768;
$this->load->library('upload', $config);
if (!$this->upload->do_upload('userfile'))
{
$error = array('error' => $this->upload->display_errors());
print_r($error);
$file_name = null;
}
else
{
$file_name = $this->upload->data('file_name');
}
$additional_data = [
'first_name' => $this->input->post('first_name'),
'last_name' => $this->input->post('last_name'),
'avatar' => $file_name,
'company' => $this->input->post('company'),
'phone' => $this->input->post('phone'),
];
print_r($additional_data);
}
Result Array
Array ( [first_name] => admin [last_name] => admin [avatar] => design.png [company] => admin [phone] => 9999999999 )
The problem seems to be in your form. I reviewed your code and found that auth/create_user.php uses form_open() method instead of using form_open_multipart() method because a normal form won't post files, hence in your controller not getting userfile index from $additional_data variable.
UPDATE
In the comments OP posted a link to the full code. Checking that out, the problem is very clear. I described it, and a fix, in the comments below my answer. Copying that comment here:
You load the upload library on line 473, in the upload_image() method. But you are calling $this->upload->data() in a different method (line 530, in the create_user() method), where you have not loaded the upload library. Move the code from upload_image() into create_user(). Refactor once you have it working if you want, keep it simple until it is
Original Answer
It looks like you've been working through the documentation, your code is very similar to the example they provide. But you've stopped short of the critical last step where they explain how to access the details of the uploaded file! :-)
They demonstrate how to do that by returning a view with the upload data:
$data = array('upload_data' => $this->upload->data());
$this->load->view('upload_success', $data);
So the upload file info is available through $this->upload->data(), not PHP's superglobal $_FILES.
The docs go on to describe the data() method:
data([$index = NULL])
[...]
This is a helper method that returns an array containing all of the data related to the file you uploaded.
[...]
To return one element from the array:
$this->upload->data('file_name'); // Returns: mypic.jpg
So for your Ion Auth code, this should work (assuming the filename is all you need to store):
$additional_data = [
'first_name' => $this->input->post('first_name'),
'last_name' => $this->input->post('last_name'),
'avatar' => $this->upload->data('file_name'),
'company' => $this->input->post('company'),
'phone' => $this->input->post('phone'),
];
As has been clearly explained in the other answers, here is the Copy and Paste answer for you.
To reiterate what has been already stated.
$this->upload->data('file_name'),
Does not exist as you have not performed the required steps to create it and hence why you were getting the very "clearly stated" error message.
So you need to add in...
$config['upload_path'] = './assets/img/avatars/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 100;
$config['max_width'] = 1024;
$config['max_height'] = 768;
$this->load->library('upload', $config);
$this->upload->do_upload('userfile');
So your code becomes...
if ($this->form_validation->run() === TRUE) {
$email = strtolower($this->input->post('email'));
$identity = ($identity_column === 'email') ? $email : $this->input->post('identity');
$password = $this->input->post('password');
//return $this->upload_image();
$config['upload_path'] = './assets/img/avatars/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 100;
$config['max_width'] = 1024;
$config['max_height'] = 768;
$this->load->library('upload', $config);
$this->upload->do_upload('userfile');
$additional_data = [
'first_name' => $this->input->post('first_name'),
'last_name' => $this->input->post('last_name'),
'avatar' => $this->upload->data('file_name'),
'company' => $this->input->post('company'),
'phone' => $this->input->post('phone'),
];
}
Now, as you have this in your do_upload() method, you could put the file upload code in another method and call it from both, so you are not "repeating yourself". I'll leave that up to you do work out.
Update: A possible refactoring
Create a new method to init the File Upload
protected function init_do_upload() {
$config['upload_path'] = './assets/img/avatars';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 100;
$config['max_width'] = 1024;
$config['max_height'] = 768;
$this->load->library('upload', $config);
}
Your existing do_upload() becomes...
/**
* Upload avatar
*/
public function do_upload() {
$this->init_do_upload();
if ( ! $this->upload->do_upload('userfile')) {
$error = array('error' => $this->upload->display_errors());
$this->load->view('upload_form', $error);
} else {
$this->data = array('upload_data' => $this->upload->data());
$this->_render_page('auth' . DIRECTORY_SEPARATOR . 'create_user', $this->data['upload_data']);
}
}
And the code segment in create_user() becomes...
if ($this->form_validation->run() === TRUE) {
$email = strtolower($this->input->post('email'));
$identity = ($identity_column === 'email') ? $email : $this->input->post('identity');
$password = $this->input->post('password');
$this->init_do_upload();
$this->upload->do_upload('userfile');
$additional_data = [
'first_name' => $this->input->post('first_name'),
'last_name' => $this->input->post('last_name'),
'avatar' => $this->upload->data('file_name'),
'company' => $this->input->post('company'),
'phone' => $this->input->post('phone'),
];
}

Codeigniter Upload featured image and multiple images at the same time

I have modified the code to use a foreach loop, now I can access the files names, and the print_r is printing the files names in an array like this:
Array ( [0] => Uconn.png [1] => UW_Medicine.png [2] => Yale.png ) Axis.png
but I am still getting the following error:
A PHP Error was encountered
Severity: Notice
Message: Array to string conversion
and a databse error:
Error Number: 1054
Unknown column 'Array' in 'field list'
INSERT INTO `yacht_slider` (`yacht_slide_id`, `slide`) VALUES (87, Array)
I just don't know how should I pass the looped files inside the model to upload.
I am trying to upload a featured image in one input, and multiple images in another input at the same time, I tried many ways and methods to do this, but I always end with an error, mostly Array to string conversion error.
the featured image is stored in one database table and the multiple images are stored in another table.
My current code:
HTML:
<div class="form-group">
<label for="" class="control-label">Image</label>
<input type="file" class="form-control" name="featured">
</div>
<div class="form-group">
<label for="" class="control-label">Slider</label>
<input type="file" class="form-control" name="userfile[]" multiple>
</div>
Model:
public function create_yacht($yacht_img, $slider){
$slug = url_title($this->input->post('title'));
$data = array(
'title' => $this->input->post('title'),
'slug' => $slug,
'img' => $yacht_img,
'city' => $this->input->post('city'),
'category' => $this->input->post('category'),
'price' => $this->input->post('price'),
'description' => $this->input->post('description')
);
$this->db->insert('yachts', $data);
$insert_id = $this->db->insert_id();
$data_4 = array(
'yacht_slide_id' => $insert_id,
'slide' => $slider
);
$this->db->insert('yacht_slider', $data_4);
}
Controller:
public function create_yacht(){
$data['title'] = 'Create';
$data['categories'] = $this->category_model->get_categories();
$this->form_validation->set_rules('title', 'Title', 'required');
$this->form_validation->set_rules('city', 'City', 'required');
if($this->form_validation->run() === FALSE){
$this->load->view('templates/admin_header');
$this->load->view('admin/create_yacht', $data);
$this->load->view('templates/admin_footer');
}else{
$config['upload_path'] = './assets/images';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '2048';
$this->load->library('upload', $config);
$featured = 'featured';
if (!$this->upload->do_upload($featured)) {
$errors = array('errors' => $this->upload->display_errors());
$yacht_img = 'https://via.placeholder.com/1920x1080';
}else{
$data = array('upload_data' => $this->upload->data());
$yacht_img = $_FILES['featured']['name'];
}
foreach ($_FILES['userfile']['name'] as $name) {
$this->upload->initialize($config);
$this->upload->do_upload($name);
$data = array('upload_data' => $this->upload->data());
$slider = $_FILES['userfile']['name'];
}
print_r($slider);
print_r($yacht_img);
$this->yacht_model->create_yacht($yacht_img, $slider);
// redirect('admin');
}
}
I've cleaned up your code a bit and put in some error reporting so users won't be befuddled when an error occurs.
Controller:
public function create_yacht() {
$data['title'] = 'Create';
$data['categories'] = $this->category_model->get_categories();
$this->form_validation->set_rules('title', 'Title', 'required');
$this->form_validation->set_rules('city', 'City', 'required');
if ($this->form_validation->run() === FALSE) {
$this->load->view('templates/admin_header');
$this->load->view('admin/create_yacht', $data);
$this->load->view('templates/admin_footer');
} else {
$this->load->library('upload');
$upload_path = './testupload/';
// just in case, make path if it doesn't exist
// if we can't die
if (!is_dir($upload_path) && #mkdir($upload_path, DIR_WRITE_MODE) == false) {
show_error('Could not make path!');
}
$config['upload_path'] = $upload_path;
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '2048';
$config['file_ext_tolower'] = true;
//$config['encrypt_name'] = true; // might be a good idea
$this->upload->initialize($config);
// featured image
if (!$this->upload->do_upload('featured')) {
show_error($this->upload->display_errors());
}
$yacht_img = $this->upload->data('file_name');
// multi images
$slider_images = array();
$multi_files = $_FILES['userfile'];
if (!empty($multi_files['name'][0])) { // if slider images are required remove this if
$multi_count = count($_FILES['userfile']['name']);
for ($i = 0; $i < $multi_count; $i++) {
$_FILES['userfile']['name'] = $multi_files['name'][$i];
$_FILES['userfile']['type'] = $multi_files['type'][$i];
$_FILES['userfile']['tmp_name'] = $multi_files['tmp_name'][$i];
$_FILES['userfile']['error'] = $multi_files['error'][$i];
$_FILES['userfile']['size'] = $multi_files['size'][$i];
if (!$this->upload->do_upload()) {
// failure cleanup to prevent orphans
#unlink($upload_path . $yacht_img);
if (count($slider_images) > 0) {
foreach ($slider_images as $image) {
#unlink($upload_path . $image);
}
}
show_error($this->upload->display_errors());
}
$slider_images[] = $this->upload->data('file_name');
}
}
$this->yacht_model->create_yacht($yacht_img, $slider_images);
}
}
Model:
public function create_yacht($yacht_img, $slider_images) {
$slug = url_title($this->input->post('title'));
$data = array(
'title' => $this->input->post('title'),
'slug' => $slug,
'img' => $yacht_img,
'city' => $this->input->post('city'),
'category' => $this->input->post('category'),
'price' => $this->input->post('price'),
'description' => $this->input->post('description')
);
$this->db->insert('yachts', $data);
$insert_id = $this->db->insert_id();
if (count($slider_images) > 0) {
foreach ($slider_images as $image) {
$this->db->insert('yacht_slider', array('yacht_slide_id' => $insert_id, 'slide' => $image));
}
}
}
if you are using mySQL 7 then it supports json datatype and you can save as array. If your using lower version of MySQL best solution is to convert your image array into JSON format then insert that into table.
For more details on JSON in MySQL you can refer
https://dev.mysql.com/doc/refman/8.0/en/json.html#json-values

Codeigniter: how to edit form without edit image input

I need a small help to figure out the edit page.
I have the Insert data and Edit data.
On edit data is requesting also the form for file/image upload, and on submit this send the null to the column file/image.
What i need is that on edit if no new file is on file/image input to skip this input.
This is my controller to insert and edit data.
// Set up the form
$rules = $this->image_m->rules;
$this->form_validation->set_rules($rules);
// Upload File Image
$status = "";
$msg = "";
$file_element_name = 'file_name';
if ($status != "error")
{
$config['upload_path'] = './uploads/images/';
$config['allowed_types'] = 'gif|jpg|png|doc|txt';
$config['max_size'] = '2000';
$config['max_width'] = '1024';
$config['max_height'] = '768';
$config['encrypt_name'] = FALSE;
$config['remove_spaces'] = TRUE;
$this->load->library('upload', $config);
if (!$this->upload->do_upload($file_element_name))
{
$status = 'error';
$msg = $this->upload->display_errors('', '');
}
else
{
$image = $this->upload->data();
}
}
// Process the form
if ($this->form_validation->run() == TRUE) {
$data = array(
'pubdate' => $this->input->post('pubdate'),
'enddate' => $this->input->post('enddate'),
'name' => $this->input->post('name'),
'image' => $image['file_name']
);
$this->image_m->save($data, $id);
redirect('admin/image');
}
Any help is appreciated.
Solution:
// Process the form
if ($this->form_validation->run() == TRUE) {
if(is_null($image['file_name'])){
$data = array(
'pubdate' => $this->input->post('pubdate'),
'enddate' => $this->input->post('enddate'),
'name' => $this->input->post('name'),
'caption' => $this->input->post('caption')
);
} else {
$data = array(
'pubdate' => $this->input->post('pubdate'),
'enddate' => $this->input->post('enddate'),
'name' => $this->input->post('name'),
'image' => $image['file_name'],
'caption' => $this->input->post('caption')
);
}
$img = null;
//Check if a file is being uploaded/updated
if($_FILES['fieldname'][tmp_name] != ''){
//upload file here.....
$file = $this->upload->data();
$img = $file['file_name'];
}
//if no file name assigned to var, use the data stored in the model
//default_image.jpg
if(is_null($img)) $img = (string)$model->image;
-
`image` varchar(255) not null default 'default_image.jpg'
if($_FILES['image'][tmp_name] != '') will work fine...

File not uploading in codeigniter

This is the codeigniter function for file uploading
public function doctor_signup()
{
$this->load->library('encrypt');
$rand = time() . rand(0, 9999);
if($_FILES["file"]["name"]!="")
{
$config['upload_path'] = realpath(dirname(__FILE__)). '/uploads/';
$config['max_size'] = '100';
$config['max_width'] = '1024';
$config['max_height'] = '768';
$config['name']=$rand;
print_r($config);
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload())
{
echo $error = array('error' => $this->upload->display_errors());
exit;
}
}
$data = array(
'username' => $_POST['username'],
'password' => $this->encrypt->encode($_POST['password']),
'name' => $_POST['name'],
'address' => $_POST['address'],
'city' => $_POST['city'],
'state' => $_POST['state'],
'photo'=> $rand,
'email' => $_POST['email'],
'date_of_join'=>date('Y-m-d H:m:s'),
'landline' => $_POST['landline'],
'mobile' => $_POST['mobile'],
'specialist' => $_POST['specialist'],
'comments' => $_POST['comments'],
'degree' => $_POST['degree']
);
if( $this->db->insert('doctor_user', $data))
{
$this->load->view('header', $data);
$this->load->view('user_created', $data);
$this->load->view('footer', $data);
}
}
But the file is not uploaded to the upload directory an also not giving any error. The uploads folder in under the home directory. Any suggestion.
Thanks
I think it could be because $config['name'] should be
$config['file_name']
Try renaming this and see if it works. Also you are not using $config['allowed_types'] to specify what files can be uploaded. Otherwise whats to stop someone upload a nasty file?

codeigniter upload image

Hello all im working on a admin system that can create news with a image but i cant find out how to send the image name from my model file to my controller,
this is my model file:
function uploadImg()
{
$config = array(
'allowed_types' => 'jpg|jpeg|gif|png',
'upload_path' => $this->gallery_path,
'max_size' => 2000,
'encrypt_name' => true
);
$this->load->library('upload', $config);
$this->upload->do_upload();
$image_data = $this->upload->data();
$config = array(
'source_image' => $image_data['full_path'],
'new_image' => $this->gallery_path . '/thumbs',
'maintain_ration' => true,
'width' => 200,
'height' => 200,
'encrypt_name' => true,
'max_size' => 2000
);
$this->load->library('image_lib', $config);
$this->image_lib->resize();
# Ret profil billed navn #
$file_array = $this->upload->data('file_name');
return $billed_sti['billed_sti'] = $file_array['file_name'];
//$this->db->where('username', $this->input->post('username'));
//$this->db->update('users', $profilBilledNavn);
}
This is my controller:
function opret() {
$this->form_validation->set_rules('overskrift', 'overskrift', 'required');
$this->form_validation->set_rules('description', 'description', 'required');
$this->form_validation->set_rules('indhold', 'indhold', 'required');
if($this->form_validation->run() == true)
{
$this->load->model('admin/nyheder_model');
$billed_sti = $this->nyheder_model->uploadImg();
$data = array(
'overskrift' => $this->input->post('overskrift'),
'description' => $this->input->post('description'),
'indhold' => $this->input->post('indhold'),
'billed_sti' => $billed_sti,
'brugernavn' => $this->session->userdata('username'),
'godkendt' => 'ja'
);
$this->db->insert('nyheder', $data);
redirect('admin/nyheder/index');
} else {
$this->index();
}
}
I do the image processing in the controller rather than the model.
"Models are PHP classes that are designed to work with information in your database."
from: http://codeigniter.com/user_guide/general/models.html
What you need to do is move the code for uploading the image to the controler.
function do_upload()
{
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '100';
$config['max_width'] = '1024';
$config['max_height'] = '768';
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload())
{
$error = array('error' => $this->upload->display_errors());
$this->load->view('upload_form', $error);
}
else
{
$data = array('upload_data' => $this->upload->data());
$this->load->view('upload_success', $data);
}
}
Once you did that,
You can insert the name of the file from the $data variable created in this line:
$data = array('upload_data' => $this->upload->data());
and you can get the value like this:
$data['file_name']
The file will upload the the folder you configured, and you will insert the filename to the DB From the controller.
I hope it helps.
Please use the upload function in your controller as the model classes are used to handle the database information. Please check the code below
//Controller Class
function upload_image()
{
//Check for the submit
// Submit Name refers to the name attribute on the submit input tag.
// $filename refers to the name attribute of the file input tag.
if($_SERVER['REQUEST_METHOD'] == "POST")
{
$submit = $this->input->post('submit');
if($submit == "Submit Name")
{
//Load the relevant classes and libraries
$this->load->library('upload');
$this->load->model('admin/nyheder_model','nmodel');
$filename = "image_file";
//Define the config array
$config = array();
$config['upload_path'] = $this->gallery_path;
$config['allowed_types'] = "jpg|gif|png";
$config['max_size'] = 0; //0 is for no limit
$this->upload->initalize($config);
if(!$this->upload->do_upload("$filename"))
{
echo $this->upload->display_errors();
}
else
{
$file_data = $this->upload->data();
$filename_1 = $file_data['file_name'];
$insert_array = array('filename'=>"$filename_1");
$this->nmodel->insert_data($insert_array);
} // end of the else statement
} // end of the isset statement
} // end of the outer conditional statement
Now you have the value of the filename in the $filename_1 variable which you can pass to the model class and can store the value in the database.
Thanks
J

Categories