Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utilisation de PHP pour télécharger des images dans un dossier tout en enregistrant des descriptions dans une base de données

1) Télécharger des fichiers

Lors de l'utilisation de la syntaxe de tableau pour les entrées de fichier, l'index de fichier est la dernière clé. $_FILES["file"]["name"] , par exemple, est un tableau de noms de fichiers. Pour obtenir les informations du ième fichier, vous devez accéder à $_FILES["file"]["name"][$i] , $_FILES["file"]["size"][$i] &c.

2) Enregistrer des images dans un dossier

Certaines des données dans $_FILES (tel que le nom) provient du client et n'est donc pas digne de confiance (c'est-à-dire, vérifiez d'abord). Dans le cas du nom de fichier , vous pouvez commencer par utiliser realpath pour vérifier que le chemin du fichier cible est sûr, ou utilisez basename ou pathinfo pour extraire le dernier composant du nom fourni avant d'assembler le chemin cible.

3) Enregistrement des informations sur l'image dans la base de données

Le schéma de base de données (incomplet) que vous donnez semble donner à chaque image deux colonnes dans le même tableau. Dans le modèle relationnel, les relations à plusieurs sont modélisées avec une table distincte :

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;

Sinon, vous cassez le zero-one-infinity règle et gaspiller de l'espace lorsqu'il y a moins que le nombre maximum d'images.

Autre

Notez que vous pouvez utiliser une syntaxe de tableau pour les champs de description de fichier afin de faciliter leur manipulation. Nommez-les "filedesc[]".

Plutôt qu'une longue séquence de comparaisons, utilisez une recherche de tableau ou une correspondance de modèle.

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

Le type de fichier est l'une de ces valeurs fournies par le client. Plus sûr serait d'utiliser fileinfo pour obtenir le type d'image.

$finfo = finfo_open(FILEINFO_MIME_TYPE);

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

Même cela peut être trompé si le fichier a un en-tête d'image valide mais que le reste n'est pas valide. Vous pouvez utiliser une bibliothèque d'images (comme GD ou ImageMagick) pour valider le fichier en vérifiant si vous pouvez ouvrir avec succès le fichier en tant qu'image.