Как я могу хранить отдельное изображение в отдельном поле с одним кодом PHP

0

У меня есть два отдельных поля изображения и две отдельные ячейки в моей таблице. Я хочу сохранить отдельное изображение в этой ячейке. Я могу повторить следующую программу, но я думаю, что это не было бы мудрым. Что я могу здесь сделать?

<input type="file" id="exampleInputFile" name="featuredImg">
<input type="file" id="topImg" name="topImg">

$permitted  = array('jpg', 'jpeg', 'png', 'gif');
$file_name  = $file['featuredImg']['name'];
$file_size  = $file['featuredImg']['size'];
$file_temp  = $file['featuredImg']['tmp_name'];

$div             = explode('.', $file_name);
$file_ext        = strtolower(end($div));
$unique_image    = substr(md5(time()), 0, 10).'.'.$file_ext;
$uploaded_image = "../images/uploads/".$unique_image;

move_uploaded_file($file_temp, $uploaded_image);
$query = "INSERT INTO aboutafc(featuredimage, topimage) VALUES ('$uploaded_image', '$topImage')";
Теги:
upload

1 ответ

0

Что-то вроде этого:

foreach(['featuredImg','topImg'] AS $field){
    $permitted  = array('jpg', 'jpeg', 'png', 'gif');
    $file_name  = $file[$field]['name'];
    $file_size  = $file[$field]['size'];
    $file_temp  = $file[$field]['tmp_name'];

    $div             = explode('.', $file_name);
    $file_ext        = strtolower(end($div));
    $unique_image    = substr(md5(time()), 0, 10).'.'.$file_ext;
    $uploaded_image = "../images/uploads/".$unique_image;

    move_uploaded_file($file_temp, $uploaded_image); 
}

//-Note- this wont work as it is, logically it incompatible.
$query = "INSERT INTO aboutafc(featuredimage, topimage) VALUES ('$uploaded_image', '$topImage')";

Лично я хотел бы хранить изображения в отдельной таблице с отношением Many To Many и некоторыми другими данными, такими как тип изображения (в каком поле его).

Это решило бы проблему сохранения их в БД вне цикла. Мне вообще не нравится идея об этом (большая часть ошибок при сохранении вне цикла)

Чтобы исправить это, вам нужно сделать что-то вроде этого

$images = [];
foreach(['featuredImg','topImg'] AS $field){
  //...
  $unique_image = substr(md5(time()), 0, 10).'.'.$file_ext;
  $images[] =  $unique_image;
  move_uploaded_file($file_temp, $uploaded_image);
}

if( count($images) != 2 ){
     //Error checking before saving files in the DB
}

$query = "INSERT INTO aboutafc(featuredimage, topimage) VALUES (:image1, :image2)";

$stmt = $PDO->prepare($query);
$stmt->execute([':image1'=>$images[0],':image2'=>$images[1]]);

Обратите внимание, что я исправил ваши проблемы с SQL-инъекциями.

Также обратите внимание на мое использование $unique_image Я бы настоятельно рекомендовал не сохранять полный путь. Пути меняются, и вы не должны предоставлять пользователям доступ к пути к файлу только по имени. Вы открываете себя атакам Directory Traversal, если вы даете им доступ к пути.

Таким образом, у вас есть 2 проблемы безопасности.

SQL-инъекция

Обход каталога

  • 0
    Спасибо за ваши тяжелые усилия, я попробовал ваш первый код ... и это хранит только 2-е изображение (topimage). Но я думаю, что мы близки к решению проблемы. сейчас я попробую ваш второй способ ... как начинающий php-ученик, я немного дискомфорт в PDO. так что я собираюсь попробовать это по-другому.
  • 0
    Брат, можешь ли ты переписать программу без PDO, как ученик, она катится по моей голове.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню