Mysql
 sql >> база данни >  >> RDS >> Mysql

Използване на PHP за качване на изображения в папка, докато запазвате описания в база данни

1) Качване на файлове

Когато използвате синтаксис на масив за въвеждане на файлове, индексът на файла е последният ключ. $_FILES["file"]["name"] , например, е масив от имена на файлове. За да получите информацията за i-тия файл, ще трябва да получите достъп до $_FILES["file"]["name"][$i] , $_FILES["file"]["size"][$i] и др.

2) Записване на изображения в папка

Някои от данните в $_FILES (като името) идва от клиента и следователно не му се вярва (тоест първо проверете). В случай на име на файла , можете да започнете с помощта на realpath за да проверите дали пътят на целевия файл е безопасен или използвайте basename или pathinfo за да извлечете последния компонент на предоставеното име, преди да сглобите целевото име на пътя.

3) Запазване на информация за изображението в DB

(Непълната) схема на базата данни, която давате, изглежда, че давате на всяко изображение две колони в една и съща таблица. При релационния модел релациите към много се моделират с отделна таблица:

CREATE TABLE images (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    `path` VARCHAR(256) NOT NULL,
    `description` TEXT,
    `member` INT UNSIGNED NOT NULL,
    FOREIGN KEY `member` REFERENCES members (`id`) ON DELETE CASCADE ON UPDATE CASCADE -- the image's owner
) Engine=InnoDB;

-- Note: this is a many-to-many relationship
CREATE TABLE ad_images (
    `ad` INT UNSIGNED NOT NULL,
    `image` INT UNSIGNED NOT NULL,
    FOREIGN KEY `ad` REFERENCES ads (`ad_id`) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY `image` REFERENCES images (id) ON DELETE CASCADE ON UPDATE CASCADE,
    UNIQUE KEY (`ad`, `image`)
) Engine=InnoDB;

В противен случай нарушавате zero-one-infinity правило и губене на място, когато има по-малко от максималния брой изображения.

Друго

Имайте предвид, че можете да използвате синтаксис на масив за полетата за описание на файла, за да улесните работата с тях. Наименувайте ги "filedesc[]".

Вместо дълга поредица от сравнения, използвайте търсене в масив или съвпадение на шаблон.

function isImage($type) {
    static $imageTypes = array(
            'image/gif'=>1, 'image/jpeg'=>1, 'image/pjpeg'=>1, 'image/png'=>1,
        );
    return isset($imageTypes[$type]);
    /* OR */
    return preg_match('%^image/(?:p?jpeg|gif|png)%', $type);
    /* OR allow all images */
    return preg_match('%^image/%', $type);
}

if (isImage($_FILES["file"]["type"][$idx]) && ($_FILES["file"]["size"][$idx] < 1048600)) {

Типът на файла е една от тези стойности, предоставени от клиента. По-безопасно би било да използвате fileinfo за да получите типа на изображението.

$finfo = finfo_open(FILEINFO_MIME_TYPE);

if (isImage(finfo_file($finfo, $path)) && ($_FILES["file"]["size"][$idx] < 1048600)) {

Дори това може да се заблуди, ако файлът има валиден заглавка на изображението, но останалото не е валидно. Можете да използвате библиотека с изображения (като GD или ImageMagick), за да потвърдите файла, като проверите дали можете успешно да отворите файла като изображение.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Работа с пространствени данни в CakePHP

  2. Оптимизирайте заявката за бавно класиране

  3. Как да изчислим седмично активни потребители (WAU) в MySQL

  4. Използване на Union All и Order By в MySQL

  5. Как да сравним два резултата от заявка за равенство в MySQL?