Долгое время я пытался удалить изображение из базы данных, а также путь к файлу. Нет проблем с загрузкой изображений. Мой контроллер:
public function deleteFile() {
if ($this->images_model->delete_file($user_id, $fileName)) {
$status = 'success';
$msg = 'File successfully deleted';
}else{
$status = 'error';
$msg = 'Something went wrong when deleting the file, please try again';
}
echo json_encode(array('status' => $status, 'msg' => $msg));
Модель Images_model следующая:
public function delete_file ($user_id, $fileName) {
$this->db->where('user_id', $user_id);
unlink("uploads/".$fileName);
$this->db->delete('images', array('user_id' => $user_id));
}
Думаю, проблема может заключаться в моем коде для выполнения удаления. Вот представление, в котором я пытаюсь сделать что-то вроде следующего. «main» указывает на контроллер:
<input type = "image" id = "delete-profile-img" src = "<?= base_url('/assets/images/delete-icon-gray.png') ?>" title = "Delete Image" onclick = "'$this->main->deleteFile'" >
Можно ли использовать «onclick» при указании на функцию или мне нужно использовать более сложные java или ajax? Заранее спасибо за любой вклад.






Вы смешиваете и путаете события JavaScript с кодом Codeigniter таким образом, что это не сработает. Вам нужно передать идентификатор файлу, который вы хотите удалить. Я предлагаю вам разрешить вашему контроллеру получать параметр для файла, который вы хотите удалить:
public function deleteFile($fileName) { // SET THE FILE NAME AS PARAMETER
// Make sure to also set the variable $user_id here in some appropriate way
if ($this->images_model->delete_file($user_id, $fileName)) {
$status = 'success';
$msg = 'File successfully deleted';
}else{
$status = 'error';
$msg = 'Something went wrong when deleting the file, please try again';
}
echo json_encode(array('status' => $status, 'msg' => $msg));
}
А ссылка на удаление файла может быть простой ссылкой с именем файла в качестве параметра, который вы можете указать при отрисовке страницы:
<a href = "/deleteFile/<?=$filename?>">Delete</a>
Но я предполагаю из вашего кода, что вам нужна некоторая обработка AJAX через запрос GET или POST для обработки ответа JSON. То, как вы это настроите, зависит от того, какую библиотеку JavaScript или другой подход вы используете. Вам нужно написать функцию JavaScript для обработки запроса. Ссылка может быть примерно такой:
<input type = "image" id = "delete-profile-img" src = "<?= base_url('/assets/images/delete-icon-gray.png') ?>" title = "Delete Image" onclick = "delete(<?=$fielname?>)" >
И функция JavaScript может выглядеть примерно так, если вы используете Jquery:
function delete(filename){
var url = '/deleteFile/'+ filename;
$.get(url, function(obj) {
//console.info(obj);
// DO SOMETHING WITH THE RESPONSE HERE...
})
}
Также я не слишком знаком с JS. Не могли бы вы сказать мне, что вы подразумеваете под //сделать что-то с ответом//. Похоже, это может сработать. Дам вам знать. Благодарить!
Это работает, но удаляет ВСЕ изображения для уважаемого пользователя. Я также получаю сообщение об ошибке, что путь оператора unlink не существует, когда я знаю, что он существует. Модель: публичная функция deleteFile ($user_id, $fileName) { $this->db->where('user_id', $user_id); unlink('uploads/'.$fileName); $this->db->delete('images', array('user_id' => $user_id)); Посмотрим, смогу ли я понять проблему. Спасибо.
«Что-то сделать с ответом», например, если вы хотите предупредить пользователя об удаленном файле с помощью Javascript. Вы должны изменить модель, чтобы удалить только файл, а не все файлы для пользователя. Что-то вроде: $this->db->where( array('user_id' => $user_id, 'filename' => $fileName)); В переводе на SQL: DELETE FROM table WHERE user_id = ? AND filename = ?
Я разместил еще один связанный вопрос об удалении изображения. Он по-прежнему удаляет ВСЕ изображения. У меня аналогичная проблема с копированием изображения на другой путь. Это говорит мне, что я должен найти способ присвоить переменную выбору пользователя. Если вы видите новый вопрос, вы должны получить информацию. Еще раз спасибо!
Я смог это исправить. Я разместил ответ на него, так что, надеюсь, кто-то еще может извлечь из этого пользу.
Посмотрев видео об этом, я нашел недостающую ссылку, которая мне нужна, чтобы отсоединить и удалить мое изображение, чтобы оно работало очень хорошо. Поскольку изображения уже загружались, я использовал тот же путь и имя изображения, чтобы добавить их к кнопке удаления в VIEW:
<a id = "delete-profile-img" class = "btn btn-danger btn-xs" href = "<?php echo base_url().'main/deleteFile/'."uploads/".$images->imageName ?>" title = "Delete">Delete</a>
Затем я добавил дополнительный код в КОНТРОЛЛЕР:
public function deleteFile($images, $imageName) {
$user_id = $this->session->userdata['user_id'];
$result = $this->db->get_where('images', array('user_id' => $user_id, 'imageName' => $imageName));
$rows = $result->result();
foreach ($rows as $row) {
unlink("uploads/".$imageName);
}
$this->images_model->deleteFile($user_id, $imageName);
redirect(site_url().'main/index');
}
Модель:
public function deleteFile ($user_id, $imageName) {
return $this->db->delete('images', array('user_id' => $user_id, 'imageName' => $imageName));
}
Спасибо тем, кто предоставил ценные отзывы по этой теме. Надеюсь, это может помочь другим, которые пытаются сделать то же самое.
Извините, я был немного занят, но я все еще изучаю ваши предложения. Единственное, у меня нет отдельного файла для удаления. Я постараюсь сослаться на функцию.