Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwenden von PHP zum Hochladen von Bildern in einen Ordner, während Beschreibungen in einer Datenbank gespeichert werden

1) Hochladen von Dateien

Bei Verwendung der Array-Syntax für Dateieingaben ist der Dateiindex der letzte Schlüssel. $_FILES["file"]["name"] ist beispielsweise ein Array von Dateinamen. Um die Informationen für die i-te Datei zu erhalten, müssen Sie auf $_FILES["file"]["name"][$i] zugreifen , $_FILES["file"]["size"][$i] &c.

2) Speichern von Bildern in einem Ordner

Einige der Daten in $_FILES (z. B. der Name) stammt vom Client und ist daher nicht vertrauenswürdig (d. h. zuerst überprüfen). Im Fall des Dateiname , könnten Sie mit realpath beginnen um zu überprüfen, ob der Pfadname der Zieldatei sicher ist, oder verwenden Sie basename oder pathinfo um die letzte Komponente des angegebenen Namens zu extrahieren, bevor der Zielpfadname zusammengesetzt wird.

3) Speichern von Bildinformationen in der DB

Das (unvollständige) Datenbankschema, das Sie angeben, sieht so aus, als ob Sie jedem Bild zwei Spalten in derselben Tabelle geben. Beim relationalen Modell werden To-Many-Beziehungen mit einer separaten Tabelle modelliert:

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;

Andernfalls brechen Sie die Null-Eins-Unendlichkeit Regel und Platzverschwendung, wenn weniger als die maximale Anzahl von Bildern vorhanden ist.

Andere

Beachten Sie, dass Sie die Array-Syntax für die Dateibeschreibungsfelder verwenden können, um deren Handhabung zu vereinfachen. Nennen Sie sie "filedesc[]".

Verwenden Sie anstelle einer langen Folge von Vergleichen eine Array-Suche oder einen Musterabgleich.

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

Der Dateityp ist einer dieser vom Client bereitgestellten Werte. Sicherer wäre die Verwendung von fileinfo um den Bildtyp zu erhalten.

$finfo = finfo_open(FILEINFO_MIME_TYPE);

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

Selbst das kann getäuscht werden, wenn die Datei einen gültigen Bildheader hat, der Rest jedoch nicht gültig ist. Sie können eine Bildbibliothek verwenden (z. B. GD oder ImageMagick), um die Datei zu validieren, indem überprüft wird, ob Sie die Datei erfolgreich als Bild öffnen können.