The output of the matrix $_FILES
is coming out with the following information:
Array (
[AlvaraAnexo] => Array (
[name] => cc2.pdf // nome do teu ficheiro
[type] => application/pdf // header detectado
[tmp_name] => C:\wamp\tmp\phpFE7C.tmp // localização e nome temporário
[error] => 0 // Erro código 0 é o mesmo que tudo correu bem
[size] => 153613 // tamanho do ficheiro
)
)
This tells us that as far as the HTML form, file upload and server acceptance are concerned, everything is going as expected.
If you want to know more about other error codes, you can visit the PHP documentation page: Explained error messages (English) where the various values you can receive in $_FILES["AlvaraAnexo"]["error"]
.
So we can then take your file that has a temporary name, read it to a variable and insert it into the database.
This requires a series of verification steps to garnther that everything is being accomplished as it is supposed to. Since you are not accurately indicating where your problem might be located, I will try to cover all steps of the process by assuming what I said above (error with 0 code = file successfully loaded to the server.):
Check the file array
Before starting operations with the file array, it is important to check if it is present, if the input we want exists and if there were no errors:
// Variáveis de controlo
$campoForm = "AlvaraAnexo";
$mensagemErro = "";
// verificar se existe a matriz $_FILES
if (isset($_FILES)) {
// verificar se existe a entrada com o nome do nosso campo no formulário HTML
if (isset($_FILES[$campoForm])) {
// verificar se a entrada "error" contém o valor 0
if ($_FILES[$campoForm]["error"]==0) {
/* tudo OK, vamos continuar
*/
} else {
switch($_FILES[$campoForm]["error"]) {
case 1: {
$mensagemErro = "O arquivo enviado excede a directiva upload_max_filesize no php.ini.";
break;
}
case 2: {
$mensagemErro = "O arquivo enviado excede a directiva MAX_FILE_SIZE que foi especificado no formulário HTML.";
break;
}
case 3: {
$mensagemErro = "O arquivo foi apenas parcialmente carregado.";
break;
}
case 4: {
$mensagemErro = "Nenhum arquivo enviado.";
break;
}
case 6: {
$mensagemErro = "Faltando uma pasta temporária.";
break;
}
case 7: {
$mensagemErro = "Falha ao gravar o arquivo no disco.";
break;
}
case 8: {
$mensagemErro = "Uma extensão do PHP parou o upload dos arquivos.";
break;
}
default: {
$mensagemErro = "Erro desconhecido com o código:".$_FILES[$campoForm]["error"];
break;
}
}
}
} else {
$mensagemErro = "Não foi possível encontrar na matriz de ficheiros a entrar para o campo ".$campoForm.".";
}
} else {
$mensagemErro = "Não foi possível encontrar a matriz de ficheiros!";
}
// verifica se temos erros antes de continuar
if (!empty($mensagemErro))
die($mensagemErro);
Check the temporary file
In order to use the file, in your case read the contents of it to the database, we have to check if it exists, can be read and is not empty:
// verifica sem temos o caminho e nome do ficheiro
if (!empty($_FILES[$campoForm]["tmp_name"])) {
$ficheiroTemp = $_FILES["AlvaraAnexo"]["tmp_name"];
// verifica se o ficheiro existe no servidor
if (is_file($ficheiroTemp)) {
// verifica se o ficheiro pode ser lido
if (is_readable($ficheiroTemp)) {
/* se chegamos aqui, podemos iniciar a leitura do
* ficheiro para uma variável e preparar os dados
* lidos para inserção na base de dados
*/
$fp = fopen($ficheiroTemp, 'r');
$AlvaraAnexo = fread($fp, filesize($ficheiroTemp));
$AlvaraAnexo = addslashes($AlvaraAnexo);
fclose($fp);
} else {
$mensagemErro = "O ficheiro não pode ser lido!";
}
} else {
$mensagemErro = "Ficheiro temporário não foi localizado no servidor!";
}
} else {
$mensagemErro = "Nome temporário do ficheiro está vazio!";
}
Final code
To make things easier, I wrapped the code that handles the file in a function that returns the read result of the file or the error found.
A single function is far from being the correct way to organize the code, you would need several or even a class to handle the upload of the file, but not to make things too complicated:
/**
* Ler Ficheiro para Variavel
*
* Ler o conteúdo de um ficheiro temporário
* que acabou de ser carregado para o servidor
* para uma variabel de forma a ser guardado
* na base de dados.
*
* @param array $fileArr Matriz $_FILES
* @param string $campoForm Nome do campo no formulário
*
* @return mix string|array Matriz com mensagem de erro ou ficheiro
*/
function lerFicheiroParaVariavel($fileArr, $campoForm = '') {
// Variáveis de controlo
$mensagemErro = "";
// verificar se existe a matriz $_FILES
if (isset($fileArr) && is_array($fileArr)) {
// verificar se existe a entrada com o nome do nosso campo no formulário HTML
if (isset($fileArr[$campoForm])) {
// verificar se a entrada "error" contém o valor 0
if ($fileArr[$campoForm]["error"]==0) {
/* tudo OK, vamos continuar
*/
} else {
$erro = $fileArr[$campoForm]["error"];
switch($erro) {
case 1: {
$mensagemErro = "O arquivo enviado excede a directiva upload_max_filesize no php.ini.";
break;
}
case 2: {
$mensagemErro = "O arquivo enviado excede a directiva MAX_FILE_SIZE que foi especificado no formulário HTML.";
break;
}
case 3: {
$mensagemErro = "O arquivo foi apenas parcialmente carregado.";
break;
}
case 4: {
$mensagemErro = "Nenhum arquivo enviado.";
break;
}
case 6: {
$mensagemErro = "Faltando uma pasta temporária.";
break;
}
case 7: {
$mensagemErro = "Falha ao gravar o arquivo no disco.";
break;
}
case 8: {
$mensagemErro = "Uma extensão do PHP parou o upload dos arquivos.";
break;
}
default: {
$mensagemErro = "Erro desconhecido com o código:".$erro;
break;
}
}
}
} else {
$mensagemErro = "Não foi possível encontrar na matriz de ficheiros a entrar para o campo ".$campoForm.".";
}
} else {
$mensagemErro = "Não foi possível encontrar a matriz de ficheiros!";
}
// verifica se temos erros antes de continuar
if (!empty($mensagemErro))
return array("erro" => $mensagemErro);
// verifica sem temos o caminho e nome do ficheiro
if (!empty($fileArr[$campoForm]["tmp_name"])) {
$ficheiroTemp = $fileArr["AlvaraAnexo"]["tmp_name"];
// verifica se o ficheiro existe no servidor
if (is_file($ficheiroTemp)) {
// verifica se o ficheiro pode ser lido
if (is_readable($ficheiroTemp)) {
/* se chegamos aqui, podemos iniciar a leitura do
* ficheiro para uma variável e preparar os dados
* lidos para inserção na base de dados
*/
$fp = fopen($ficheiroTemp, 'r');
$AlvaraAnexo = fread($fp, filesize($ficheiroTemp));
$AlvaraAnexo = addslashes($AlvaraAnexo);
fclose($fp);
return $AlvaraAnexo;
} else {
$mensagemErro = "O ficheiro não pode ser lido!";
}
} else {
$mensagemErro = "Ficheiro temporário não foi localizado no servidor!";
}
} else {
$mensagemErro = "Nome temporário do ficheiro está vazio!";
}
// se chegamos aqui é porque temos um erro, vamos devolver o mesmo
return array("erro" => $mensagemErro);
}
To use the function, place it at the beginning of your file and apply this code where you are reading the file.
Where have you:
if (isset($_FILES["AlvaraAnexo"]) && $_FILES["AlvaraAnexo"]["name"] != '') {
...
}
Erases all the if
statment and trade for this, where you either have a mistake realizing what’s going on or you have the variable $AlvaraAnexo
containing the contents of the loaded file.
/* verifica se temos a matriz de ficheiros
* e se sim procedemos à leitura do ficheiro,
* caso não recolhemos a mensagem de erro
*/
if (isset($_FILES)) {
$ficheiro = lerFicheiroParaVariavel($_FILES, "AlvaraAnexo");
if (is_array($ficheiro)) {
$mensagemErro = $ficheiro["erro"];
} else {
$AlvaraAnexo = $ficheiro;
}
} else {
$mensagemErro = "Não foi possível encontrar a matriz de ficheiros!";
}
if (!empty($mensagemErro))
die($mensagemErro);
Note: This handles a file loaded by the field name="AlvaraAnexo"
, but the process must be repeated for all files that are being loaded.
Database
On the question of the database, we need to check whether the insertion queries are taking place, whether the table is well configured and whether the fields are being filled in with something:
Table structure
Your fields that receive PDF documents must all be in format blob
.
In addition, it is necessary to take into account the size of the data to be saved:
BLOB
can be up to 65535 bytes;
MEDIUMBLOB
can have up to 16777215 bytes at most;
LONGBLOB
can have up to 4294967295 bytes.
A warning: Store several blob
in databases is not generally considered the best idea as it may cause bloat
swelling (English) table, also having a number of other problems associated.
The best solution for your case since you are working several files would be to move them to a folder and save only the path to them in the database.
Insertion consultation
You must protect the data that the user gave you before sending it to the database. For this you can make use of mysql_real_escape_string (English) to prepare your consultation:
// Preparar a consulta de inserção
$sqlinsert = sprintf(
"INSERT INTO tb_trabalhador VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
mysql_real_escape_string(null),
mysql_real_escape_string($Nome),
mysql_real_escape_string($Morada),
mysql_real_escape_string($Tipo),
mysql_real_escape_string($Email),
mysql_real_escape_string($AlvaraNumero),
mysql_real_escape_string($AlvaraValidade),
mysql_real_escape_string($AlvaraAnexo),
mysql_real_escape_string($AcidenteNumero),
mysql_real_escape_string($AcidenteValidade),
mysql_real_escape_string($AcidenteAnexo),
mysql_real_escape_string($SeguroNumero),
mysql_real_escape_string($SeguroValidade),
mysql_real_escape_string($SeguroAnexo),
mysql_real_escape_string($FinancasValidade),
mysql_real_escape_string($FinancasAnexo),
mysql_real_escape_string($SocialValidade),
mysql_real_escape_string($SocialAnexo),
mysql_real_escape_string($RemuneracaoValidade),
mysql_real_escape_string($RemuneracaoAnexo),
mysql_real_escape_string($InstaladorNumero),
mysql_real_escape_string($InstaladorValidade),
mysql_real_escape_string($InstaladorAnexo),
mysql_real_escape_string($MontadorNumero),
mysql_real_escape_string($MontadorValidade),
mysql_real_escape_string($MontadorAnexo)
);
// tentar inserir dados na base de dados
mysql_query($sqlinsert) or die("Não foi possível inserir os dados");
Note: For each mysql_real_escape_string
there should be a '%s'
in the query. And for each field there should be a mysql_real_escape_string
. Check everything right with the fields on your table.
What type of field in the database for the file variable?
Blob
orText
? And what the variable$AlvaraAnexo
is printing?– Guh
blob data for all attached fields. is what use
– ChrisAdler
Attempt of a
print_r($_FILES["AlvaraAnexo"])
. Why is returning data from FILES and not the inserted variables from the file.– henrique