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.