У меня есть два отдельных поля изображения и две отдельные ячейки в моей таблице. Я хочу сохранить отдельное изображение в этой ячейке. Я могу повторить следующую программу, но я думаю, что это не было бы мудрым. Что я могу здесь сделать?
<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')";
Что-то вроде этого:
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 проблемы безопасности.