Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usando PHP para fazer upload de imagens para uma pasta enquanto salva descrições em um banco de dados

1) Fazendo upload de arquivos


Ao usar a sintaxe de matriz para entradas de arquivo, o índice do arquivo é a última chave. $_FILES["file"]["name"] , por exemplo, é uma matriz de nomes de arquivos. Para obter as informações do i-th arquivo, você precisará acessar $_FILES["file"]["name"][$i] , $_FILES["file"]["size"][$i] &c.

2) Salvando imagens em uma pasta


Alguns dos dados em $_FILES (como o nome) vem do cliente e, portanto, não é confiável (ou seja, verifique primeiro). No caso do nome do arquivo , você pode começar usando realpath para verificar se o nome do caminho do arquivo de destino é seguro ou use basename ou pathinfo para extrair o último componente do nome fornecido antes de montar o nome do caminho de destino.

3) Salvando informações da imagem no banco de dados


O esquema de banco de dados (incompleto) que você fornece parece que você fornece a cada imagem duas colunas na mesma tabela. No modelo relacional, os relacionamentos para muitos são modelados com uma tabela separada:
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;

Caso contrário, você está quebrando o zero-one-infinity regra e desperdiçando espaço quando há menos do que o número máximo de imagens.

Outro


Observe que você pode usar a sintaxe de matriz para os campos de descrição do arquivo para facilitar o manuseio. Nomeie-os como "filedesc[]".

Em vez de uma longa sequência de comparações, use uma pesquisa de matriz ou uma correspondência de padrões.
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)) {

O tipo de arquivo é um desses valores fornecidos pelo cliente. Mais seguro seria usar fileinfo para obter o tipo de imagem.
$finfo = finfo_open(FILEINFO_MIME_TYPE);

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

Mesmo isso pode ser enganado se o arquivo tiver um cabeçalho de imagem válido, mas o resto não for válido. Você pode usar uma biblioteca de imagens (como GD ou ImageMagick) para validar o arquivo verificando se você consegue abrir o arquivo com sucesso como uma imagem.