Lições de PHP - Lição 3.5 - Trabalhando com Banco de Dados MySQL. Operador JOIN. Carregamento de Arquivos no Servidor.
Antes de escrever esta lição, pensei muito sobre como melhor apresentar consultas com operadores JOIN. O fato é que o operador JOIN é necessário para selecionar de várias tabelas ao mesmo tempo. E como você precisa de outra tabela, vamos criá-la. Proponho criar uma tabela para arquivos que carregaremos através de um formulário já nesta lição. Resultará em uma lição sobre dois tópicos diferentes: trabalho com banco de dados e trabalho com formulários.
Vamos começar, adicione um campo para fazer upload de arquivo. Para que o formulário possa fazer upload de arquivos, você precisa adicionar um tipo de formulário aos seus parâmetros:
$content .= '<form action="' . $_SERVER['PHP_SELF'] . '" method="post" enctype="multipart/form-data">';
Assim, através do parâmetro enctype fornecemos ao navegador que através deste formulário carregaremos arquivos. Agora que o formulário está pronto, vamos adicionar um campo para fazer upload de arquivo:
public function display_admin() { // método de entrada de mensagem
$content = '';
$content .= '<form action="' . $_SERVER['PHP_SELF'] . '" method="post" enctype="multipart/form-data">';
$content .= '<label for="title">Nome:</label><br />';
$content .= '<input name="title" id="title" type="text" maxlength="150" />';
$content .= '<div class="clear"></div>';
$content .= '<label for="bodytext">Mensagem:</label><br />';
$content .= '<textarea name="bodytext" id="bodytext"></textarea>';
$content .= '<input type="file" name="filename">'; // campo de upload de arquivo
$content .= '<div class="clear"></div>';
$content .= '<input type="submit" value="Adicionar mensagem" />';
$content .= '</form>';
$content .= '<p><a href="/index.php">Voltar à página principal</a></p>';
return $content;
}
Através de input com tipo file, faremos upload do nosso arquivo. Se você salvar os arquivos e atualizar a página para adicionar mensagem, você deverá ver um campo de upload de arquivo.
Agora vamos ver como o arquivo é transmitido na solicitação POST.
public function write($p) {
print_r($p); // imprima o array do formulário
print_r($_FILES); // imprima o array de arquivos
$sql = 'INSERT INTO Messages (title, bodytext, created) VALUES ("'. $p["title"] . '", "' . $p["bodytext"] . '", ' . time() . ')';
return mysql_query($sql);
}
Agora vamos carregar algum arquivo e salvar a mensagem. Todos os arquivos que forem carregados através do formulário estarão disponíveis na variável superglobal $_FILES. Carrego um arquivo e obtenho esses arrays:
Array (
[title] => asfasdf
[bodytext] => asfasdf
)
Array (
[filename] => Array (
[name] => ip.txt
[type] => text/plain
[tmp_name] => Y:\tmp\phpAA.tmp
[error] => 0
[size] => 13
)
)
Agora que temos um array de dados e arquivo, vamos criar uma tabela de arquivos para salvar os arquivos carregados. Comece criando uma pasta de arquivos na raiz do seu site e se você estiver no Linux ou em um servidor de hospedagem, dê permissões a essa pasta 777 para que nosso script possa salvar arquivos nela.
Vamos alterar a consulta de criação de tabelas para o método buildDB():
$sql = "CREATE TABLE Messages ( mid int NOT NULL AUTO_INCREMENT, PRIMARY KEY(mid), title varchar(15), bodytext text, created int(11), file int(11), ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; CREATE TABLE Files ( fid int NOT NULL AUTO_INCREMENT, PRIMARY KEY(fid), filename varchar(255), filepath varchar(255), filemime varchar(255), filesize int(10), timestamp int(10), )ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
Além de adicionar uma nova tabela, também adicionaremos um campo fid que será uma chave estrangeira para a tabela de arquivos. Para a nova tabela de arquivos, teremos os seguintes campos:
fid - esta é a chave primária da nossa tabela, número do arquivo.
filename - nome do arquivo.
filepath - caminho para o arquivo da raiz do site.
filemime - tipo de arquivo para determinar a extensão do arquivo e para que ele pode ser usado (por exemplo, para arquivos de texto é text/plain, para imagens pode ser image/jpg, image/png).
filesize - tamanho do arquivo em bytes.
timestamp - hora do upload do arquivo.
Agora vamos escrever para salvar o arquivo e escrever a consulta para adicionar o arquivo ao banco de dados. Você pode criar os campos necessários através do phpMyAdmin.