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

Brug af PHP til at uploade billeder til en mappe, mens du gemmer beskrivelser til en database

1) Upload af filer

Når du bruger array-syntaks til filinput, er filindekset den sidste nøgle. $_FILES["file"]["name"] er for eksempel en række filnavne. For at få oplysningerne om den i-te fil skal du have adgang til $_FILES["file"]["name"][$i] , $_FILES["file"]["size"][$i] &c.

2) Lagring af billeder i en mappe

Nogle af dataene i $_FILES (såsom navnet) kommer fra klienten og er derfor ikke til at stole på (det vil sige verificere først). I tilfælde af filnavnet , kan du starte med at bruge realpath for at bekræfte, at målfilens stinavn er sikkert, eller brug basename eller pathinfo for at udtrække den sidste komponent af det angivne navn, før målstinavnet samles.

3) Gemmer billedoplysninger i DB

Det (ufuldstændige) databaseskema, du giver, ser ud til, at du giver hvert billede to kolonner i den samme tabel. Under den relationelle model modelleres to-mange relationer med en separat tabel:

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;

Ellers bryder du nul-én-uendeligheden regel og spild af plads, når der er færre end det maksimale antal billeder.

Andet

Bemærk, at du kan bruge array-syntaks til filbeskrivelsesfelterne for at gøre håndteringen nemmere. Navngiv dem "filedesc[]".

I stedet for en lang række af sammenligninger skal du bruge et matrixopslag eller et mønstermatch.

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

Filtypen er en af ​​disse klientleverede værdier. Sikrere ville være at bruge fileinfo for at få billedtypen.

$finfo = finfo_open(FILEINFO_MIME_TYPE);

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

Selv det kan narre, hvis filen har en gyldig billedheader, men resten er ikke gyldig. Du kan bruge et billedbibliotek (såsom GD eller ImageMagick) for at validere filen ved at kontrollere, om du kan åbne filen som et billede.



  1. 900 byte indeksstørrelsesgrænse i tegnlængde

  2. Valg af en float i MySQL

  3. Forstå PIVOT-funktionen i T-SQL

  4. Kan jeg registrere og håndtere MySQL-advarsler med PHP?