Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

rickygac

[Resolvido] Como resolvo isto?

Mensagens Recomendadas

rickygac

neste codigo estou a receber um erro que não consigo resolver...

(Warning: file_get_contents() [function.file-get-contents]: Filename cannot be empty in /home/index.php on line 23)

alem disso mal abre a pagina grava-me logo o registo e exibe o anterior, quando so o deveria fazer apos enviar o form pra base de dados.

<?php
//LIGA-SE Á BASE DE DADOS

include('ligar-bd.php');

//SE FOR PEDIDO UMA CONSULTA

if(!isset($_GET["getfile"])){

//SE ELA NÃO EXISTIR MOSTRA A MENSAGEM DE ERRO

if ($_FILES["file"]["error"] > 0){
	echo "Erro: " . $_FILES["file"]["error"] . "<br>";

//CASO CONTRÁRIO

}else{

//EXECUTA AÇÕES DE TRATAMENTO E CODIFICAÇÃO DAS IMAGENS

	move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]);

$bin_string = file_get_contents($_FILES["file"]["name"]);
	$hex_string = base64_encode($bin_string);

//CARREGA TODAS AS OPÇÕES DO FORMULÁRIO

$nome = $_POST['nome'];

//INSERE OS DADOS NA BASE DE DADOS

$mysqli->query(" INSERT INTO teste(imagem,nome) VALUES ('" . $hex_string . "','$nome') ");
}

//SE AINDA NADA FOI PEDIDO PARA SER MOSTRADO

}else{

//SELECIONA NA BASE DE DADOS A ULTIMA ENTRADA

	if ($result = $mysqli->query(" SELECT * FROM teste ORDER BY id DESC ")){

		if($row = $result->fetch_assoc()){
			$output_hex_string = $row["imagem"];
			$output_bin_string = base64_decode($output_hex_string);

			header("Content-Type: image/png");
			header("Content-Length: " . strlen($output_bin_string));

//MOSTRA A ULTIMA ENTRADA

			$result->free();
			echo $output_bin_string;
			}
	}
 }
?>

<html>
<body>

<form action="" method="POST" enctype="multipart/form-data">
Nome: <input type="text" name="nome">
<br>
Imagem: <input type="file" name="file">
<br>
<input type="submit">
</form>

<?php
//MOSTRA OS RESULTADOS

echo "<h2>Nome:<i> $nome </i></h2>";
?>

<img src="index.php?getfile=1">

</body>
</html>

Editado por Rui Carlos
GeSHi

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

boas

será melhor dizeres qual é a linha 23 da pagina index

cumps

acao

Editado por acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

é impossível dizer exactamente qual o teu problema, mas uma coisa é clara:

if(!isset($_GET["getfile"])){
}else{
}

alguma coisa está mal nesta lógica

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

boas

será melhor dizeres qual é a linha 23 da pagina index

cumps

acao

a linha é $bin_string = file_get_contents($_FILES["file"]["name"]);

estou fartod e rever o código mas nao estou a dar ca coisa


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

como te disse, o problema está na verificação do pedido, mais informação é complicado porque não só não apresentas o código com as tags corretas (ver ajuda do fórum) assim como não dizes quas os parâmetros do pedido que originou o erro


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

como te disse, o problema está na verificação do pedido, mais informação é complicado porque não só não apresentas o código com as tags corretas (ver ajuda do fórum) assim como não dizes quas os parâmetros do pedido que originou o erro

o problema é que não percebo assim tanto de PHP e não sei o que esta correto ou errado, sei que tal como postei no código acima (tem o codigo todo que estou a usar) me esta a dar esse erro e a guardar um registo em branco cada vez que abro a pagina mesmo antes de enviar o que quer que seja pra base de dados....

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

como te disse, ao menos apresenta o URL que estás a usar

Warning: file_get_contents() [function.file-get-contents]: Filename cannot be empty in /home/rpublici/public_html/teste/index.php on line 18

é isto?

e o código é este:

<?php
// LIGA-SE À� BASE DE DADOS
include('ligar-bd.php');

// SE FOR PEDIDO UMA CONSULTA
if(!$_GET[getfile]){

// SE ELA NÃO EXISTIR MOSTRA A MENSAGEM DE ERRO
if ($_FILES["file"]["error"] > 0){
echo "Erro de envio, tente novamente: " . $_FILES["file"]["error"] . "<br>";

// CASO CONTRÁ�RIO
}else{

// EXECUTA O TRATAMENTO E CODIFICAÇÃO DAS IMAGENS
move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]);

$bin_string = file_get_contents($_FILES["file"]["name"]);
$hex_string = base64_encode($bin_string);

// CARREGA TODAS AS OPÇÕES DO FORMULÁ�RIO
$nome = $_POST['nome'];

// INSERE OS DADOS NA BASE DE DADOS
$mysqli->query(" INSERT INTO teste(imagem, nome) VALUES ('" . $hex_string . "', '$nome') ");
}

// SE AINDA NADA FOI PEDIDO PARA SER MOSTRADO
}else{

// SELECIONA NA BASE DE DADOS A ULTIMA ENTRADA
if ($result = $mysqli->query(" SELECT * FROM teste ORDER BY id DESC ")){

	if($row = $result->fetch_assoc()){
		$output_hex_string = $row["imagem"];
		$output_bin_string = base64_decode($output_hex_string);

		header("Content-Type: image/png");
		header("Content-Length: " . strlen($output_bin_string));

// MOSTRA A ULTIMA ENTRADA
		$result->free();
		echo $output_bin_string;
		}
	}
}
?>  






<html>
<body>

<?php
// MOSTRA OS RESULTADOS
echo "
<center>
<h2>Nome:<i> $nome </i></h2>
<img src='index.php?getfile=1'>
<br><br><hr><br>
";

// MOSTRA O FORMULÁRIO?>

<form action="" method="POST" enctype="multipart/form-data">
Nome: <input type="text" name="nome">
<br>
Imagem: <input type="file" name="file"> <input type="submit" value="Enviar">
</form>

</center>

</body>
</html>

Editado por Rui Carlos
GeSHi

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruicosta.web

Quando executas o ficheiro pela 1ª vez:

- Esta variável não existe: $_GET['getfile']

- O Formulário não foi submetido

Logo a variável $bin_string está vazia e gera o erro.

Se for este o problema, tens de validar se o o $_GET existe e se o count($_POST) > 0 ou igualar ao número de campos que realmente o formulário deverá passar.

Dica:

Sempre que utilizas:

$_GET, $_POST, $_SESSION, $_SERVER, $_COOKIE, faz o sanitize das variáveis para evitares surpresas desagradáveis

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

Quando executas o ficheiro pela 1ª vez:

- Esta variável não existe: $_GET['getfile']

- O Formulário não foi submetido

Logo a variável $bin_string está vazia e gera o erro.

Se for este o problema, tens de validar se o o $_GET existe e se o count($_POST) > 0 ou igualar ao número de campos que realmente o formulário deverá passar.

Dica:

Sempre que utilizas:

$_GET, $_POST, $_SESSION, $_SERVER, $_COOKIE, faz o sanitize das variáveis para evitares surpresas desagradáveis

entendi o que dizes... mas e como faço isso? inda sou inda não percebo muito disto :/


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

ok resolvi o assunto separando por mais ficheiros em vez de ter tudo no mesmo.


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruicosta.web

ok resolvi o assunto separando por mais ficheiros em vez de ter tudo no mesmo.

Alguma alteração nas validações fizeste além de separares os ficheiros.

Para limpares o lixo que pode vir junto da informação do utilizador, utiliza o comando filter_var

// CARREGA TODAS AS OPÇÕES DO FORMULÁRIO
$nome = $_POST['nome'];

// CARREGA TODAS AS OPÇÕES DO FORMULÁRIO
$nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);

Literatura Obrigatória: http://php.net/manual/en/filter.filters.sanitize.php

Editado por ruicosta.web
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

sinceramente nem conhecia essa cena dos filtros... mas ja adaptei e como n me esta a dar erro algum e falas disso, presumo que seja algo bom que melhore o script :) ...

dividi em 3 ficheiros e ficou bom, o index.php com o form, o envia.php com o php para enviar e o ultimo_envio.php para include do ultimo post.

Mas gostaria mesmo é de criar um campo para categoria abaixo do Nome onde desse pra inserir a nova categoria ou escolher num select a existente caso existisse... coisa que ando á meses a tentar e ainda não consegui fazer as categorias :(

Se me puderes ajudar agradeço!

vê como ficou...

index.php

<?php

include "estilos/estilos.css";

?>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<html>

<body>

<center>

<h2>Adicionar Nova Entrada</h2>

<form action="envia.php" method="POST" enctype="multipart/form-data">

<table align="center" width="300px" border="0" cellpading="4" cellspacing="8" bgcolor="#f0f0f0">

<tr><td align="center">

<hr size=1 width=300 class="degrade">

Nome:

<br>

<input type="text" name="nome">

<br>

Adicionar uma imagem:

<br>

<input type="file" name="file">

<hr size=1 width=300 class="degrade">

<br>

<input type="submit" value="Adicionar Entrada" class="button buttonfx buttonredondo">

<br>

<br>

</td></tr></table>

</form>

<hr size=1 width=300 class="listado">

</center>

</body>

</html>

envia.php

<?php

include('ligar-bd.php');

if(!$_GET[getfile]){

if ($_FILES["file"]["error"] > 0){

echo "Ups... falha no envio, tente novamente. ERRO: " . $_FILES["file"]["error"] . "<br>";

}else{

move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]);

$bin_string = file_get_contents($_FILES["file"]["name"]);

$hex_string = base64_encode($bin_string);

$nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);

$mysqli->query(" INSERT INTO teste(

imagem,

nome

) VALUES (

'" . $hex_string . "',

'$nome'

) ");

}

}else{

if ($result = $mysqli->query(" SELECT * FROM teste ORDER BY id DESC ")){

if($row = $result->fetch_assoc()){

$output_hex_string = $row["imagem"];

$output_bin_string = base64_decode($output_hex_string);

header("Content-Type: image/png");

header("Content-Length: " . strlen($output_bin_string));

$result->free();

echo $output_bin_string;

}

}

}

include "ultimo_envio.php";

?>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

ultimo_envio.php

<html>

<body>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<?php

echo "

<center>

<hr size=1 width=300 class='degrade'>

Última entrada adicionada:

<br>

<i><b> $nome </b></i>

<hr size=1 width=300 class='listado'>

<a href='envia.php?getfile=1' target='blank''><img src='envia.php?getfile=1'></a>

";

include "index.php";

?>

</center>

</body>

</html>


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruicosta.web

Em relação aos filtros de todas as possíveis entradas de informação na tua aplicação é preciso conhecer os perigos para nos protegermos.

https://www.owasp.org/index.php/Testing_for_SQL_Injection_(OTG-INPVAL-005)

http://www.unixwiz.net/techtips/sql-injection.html

Em relação à selectbox para categorias, presumo que tenhas uma tabela com categorias, certo?

Imagina que a tabela se chama categorias e tem 2 campos: id - INT(11) e categoria- VARCHAR(50)

<select name="categorias">
<?php
$sql = "select id, categoria from categorias order by categoria asc"
$mysqli->query($sql);
$rows = $mysqli->mysqli_fetch_array();
foreach($rows as $row){
echo '<optionvalue="'.$row['id'].'">'.$row['categoria'].'</option>'."\r\n";
}
?>
</select>

Nota: nunca trabalhei com mysqli mas deve ser algo dentro disto.

Para obteres o valor escolhido após a submissão do formulário, basta $categoria = (int)$_POST['categorias'];

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

Em relação aos filtros de todas as possíveis entradas de informação na tua aplicação é preciso conhecer os perigos para nos protegermos.

https://www.owasp.org/index.php/Testing_for_SQL_Injection_(OTG-INPVAL-005)

http://www.unixwiz.net/techtips/sql-injection.html

Em relação à selectbox para categorias, presumo que tenhas uma tabela com categorias, certo?

Imagina que a tabela se chama categorias e tem 2 campos: id - INT(11) e categoria- VARCHAR(50)

<select name="categorias">
<?php
$sql = "select id, categoria from categorias order by categoria asc"
$mysqli->query($sql);
$rows = $mysqli->mysqli_fetch_array();
foreach($rows as $row){
echo '<optionvalue="'.$row['id'].'">'.$row['categoria'].'</option>'."\r\n";
}
?>
</select>

Nota: nunca trabalhei com mysqli mas deve ser algo dentro disto.

Para obteres o valor escolhido após a submissão do formulário, basta $categoria = (int)$_POST['categorias'];

Boa boa... vou testar isso... mas isso so mostra o select? imagina que nao existe a categoria, tem que dar criala!


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

naaa... não funcionou, eu tenho uma so tabela com (id, nome, imagem, catid, categoria)


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruicosta.web

naaa... não funcionou, eu tenho uma so tabela com (id, nome, imagem, catid, categoria)

Se fizeste copiar/colar sem adaptares à tua realidade, logicamente não sou adivinho para saber o que terás do teu lado.

Parece-me que tens um problema de modelagem de dados. Essa tabela de imagens....tere o catid e em simultaneo a categoria é um erro.

Divide isso em duas tabelas:

Imagens

---------------------

id

id_categoria

imagem

Categorias

----------------------

id

categoria

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

foi um expert de php que me explicou que basta uma tabela para ter tudo, que mais que uma so complica e que deveria usar o "0" para a categoria principal e o "1" para as subcategorias "2" para subsub etc... tar a mudar tabelas agora é capaz de me baralhar os codigos todos...

a meu ver o ideal seria ter um campo para adicionar novas categorias e um select inativo caso não existissem categorias na base de dados, se existisse esse select deveria dar para escolhe-las

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruicosta.web

foi um expert de php que me explicou que basta uma tabela para ter tudo, que mais que uma so complica e que deveria usar o "0" para a categoria principal e o "1" para as subcategorias "2" para subsub etc... tar a mudar tabelas agora é capaz de me baralhar os codigos todos...

a meu ver o ideal seria ter um campo para adicionar novas categorias e um select inativo caso não existissem categorias na base de dados, se existisse esse select deveria dar para escolhe-las

Ok... Não sou de um patamar tão alto como o php expert....

Ainda bem que o mote dele é colocar tudo numa tabela se nao vai complicar....deve estar habituado a trabalhos "pequeninos"...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.