Mysql
 sql >> Database >  >> RDS >> Mysql

Utilizzo di PHP per caricare le immagini in una cartella mentre si salvano le descrizioni in un database

1) Caricamento di file

Quando si utilizza la sintassi dell'array per gli input di file, l'indice del file è l'ultima chiave. $_FILES["file"]["name"] , ad esempio, è una matrice di nomi di file. Per ottenere le informazioni per l'i-esimo file, dovrai accedere a $_FILES["file"]["name"][$i] , $_FILES["file"]["size"][$i] ecc.

2) Salvataggio di immagini in una cartella

Alcuni dei dati in $_FILES (come il nome) deriva dal client e quindi non è attendibile (ovvero verifica prima). Nel caso del nome file , potresti iniziare utilizzando realpath per verificare che il percorso del file di destinazione sia sicuro oppure utilizzare basename o pathinfo per estrarre l'ultimo componente del nome fornito prima di assemblare il percorso di destinazione.

3) Salvataggio delle informazioni sull'immagine su DB

Lo schema (incompleto) del database che fornisci sembra che tu assegna a ciascuna immagine due colonne nella stessa tabella. Nel modello relazionale, le relazioni a-molti sono modellate con una tabella separata:

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;

Altrimenti, stai infrangendo lo zero-one-infinity regola e sprecare spazio quando il numero di immagini è inferiore al massimo.

Altro

Si noti che è possibile utilizzare la sintassi dell'array per i campi di descrizione del file per semplificarne la gestione. Chiamali "filedesc[]".

Piuttosto che una lunga sequenza di confronti, usa una ricerca di matrice o una corrispondenza di pattern.

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

Il tipo di file è uno di quei valori forniti dal client. Sarebbe più sicuro usare fileinfo per ottenere il tipo di immagine.

$finfo = finfo_open(FILEINFO_MIME_TYPE);

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

Anche questo può essere ingannato se il file ha un'intestazione dell'immagine valida ma il resto non è valido. Puoi utilizzare una libreria di immagini (come GD o ImageMagick) per convalidare il file verificando se è possibile aprire correttamente il file come immagine.