sql >> Databáze >  >> RDS >> Mysql

Použití PHP k nahrání obrázků do složky při ukládání popisů do databáze

1) Nahrávání souborů

Při použití syntaxe pole pro vstupy souborů je index souboru posledním klíčem. $_FILES["file"]["name"] , je například pole názvů souborů. Chcete-li získat informace pro i-tý soubor, budete potřebovat přístup k $_FILES["file"]["name"][$i] , $_FILES["file"]["size"][$i] atd.

2) Ukládání obrázků do složky

Některá data v $_FILES (například jméno) pochází od klienta, a proto nelze důvěřovat (tj. nejprve ověřit). V případě název souboru , můžete začít pomocí realpath k ověření, zda je cesta k cílovému souboru bezpečná, nebo použijte basename nebo pathinfo k extrahování poslední komponenty zadaného názvu před sestavením cílové cesty.

3) Uložení informací o obrázku do DB

Zadané (neúplné) schéma databáze vypadá, jako byste každému obrázku dali dva sloupce ve stejné tabulce. V rámci relačního modelu jsou vztahy k mnoha modelovány pomocí samostatné tabulky:

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;

Jinak porušujete nula-jedna-nekonečno pravidlo a plýtvání místem, když je méně než maximální počet obrázků.

Jiné

Všimněte si, že pro pole popisu souboru můžete použít syntaxi pole, aby se s nimi snadněji pracovalo. Pojmenujte je „filedesc[]“.

Spíše než dlouhou sekvenci porovnávání použijte vyhledávání v poli nebo shodu vzoru.

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 souboru je jednou z hodnot dodaných klientem. Bezpečnější by bylo použít fileinfo získat typ obrázku.

$finfo = finfo_open(FILEINFO_MIME_TYPE);

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

I to lze oklamat, pokud má soubor platnou hlavičku obrázku, ale zbytek není platný. Můžete použít knihovnu obrázků (jako je GD nebo ImageMagick) pro ověření souboru kontrolou, zda můžete soubor úspěšně otevřít jako obrázek.



  1. postgresql - nahradí všechny výskyty řetězce v textovém poli

  2. Je pro cizí klíče preferován řetězec nebo int?

  3. Přihlašovací třída PHP

  4. InnoDB:nalezeny duplicitní indexy – je to velmi špatné?