Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Używanie PHP do przesyłania obrazów do folderu podczas zapisywania opisów w bazie danych

1) Przesyłanie plików

W przypadku używania składni tablicowej dla danych wejściowych plików indeks pliku jest ostatnim kluczem. $_FILES["file"]["name"] na przykład jest tablicą nazw plików. Aby uzyskać informacje o i-tym pliku, musisz uzyskać dostęp do $_FILES["file"]["name"][$i] , $_FILES["file"]["size"][$i] &c.

2) Zapisywanie obrazów w folderze

Niektóre dane w $_FILES (takie jak nazwa) pochodzi od klienta, a zatem nie można mu ufać (to znaczy najpierw zweryfikuj). W przypadku nazwy pliku , możesz zacząć od użycia realpath aby sprawdzić, czy ścieżka pliku docelowego jest bezpieczna, lub użyj basename lub pathinfo aby wyodrębnić ostatni komponent podanej nazwy przed złożeniem docelowej ścieżki.

3) Zapisywanie informacji o obrazie do bazy danych

Podany (niekompletny) schemat bazy danych wygląda tak, jakby każdemu obrazowi przypisano dwie kolumny w tej samej tabeli. W modelu relacyjnym relacje do wielu są modelowane za pomocą oddzielnej tabeli:

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;

W przeciwnym razie łamiesz zero-one-infinity reguła i marnowanie miejsca, gdy liczba obrazów jest mniejsza niż maksymalna.

Inne

Zwróć uwagę, że możesz użyć składni tablicowej dla pól opisu plików, aby ułatwić ich obsługę. Nazwij je "filedesc[]".

Zamiast długiej sekwencji porównań użyj wyszukiwania tablicy lub dopasowania wzorca.

Funkcja
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)) {

Typ pliku jest jedną z tych wartości dostarczonych przez klienta. Bezpieczniej byłoby użyć fileinfo aby uzyskać typ obrazu.

$finfo = finfo_open(FILEINFO_MIME_TYPE);

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

Nawet to można oszukać, jeśli plik ma prawidłowy nagłówek obrazu, ale reszta nie jest prawidłowa. Możesz użyć biblioteki obrazów (takich jak GD lub ImageMagick), aby zweryfikować plik, sprawdzając, czy możesz pomyślnie otworzyć plik jako obraz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Podzapytanie zwracające więcej niż 1 wiersz

  2. MySQL tylko w bieżącym miesiącu?

  3. Podgląd obrazu i przesyłanie za pomocą bazy danych PHP i MySQL

  4. MySql WorkBench AES 256 Deszyfrowanie

  5. Funkcja MySQL password() do PHP