Jump to content
rjsma

Erro ao utilizar o mysql_fetch_array

Recommended Posts

rjsma

Boas,

Está a dar-me um erro no mysql_fetch_array que eu já não sei é do que.Eu na semana passada usei o mysql_fetch_array para listar os dados da base de dados na mesma maneira que agora, mas é que desta vez aparece este aviso que não estou a ver porque aparece.Precisava que me dissessem do que pode ser, sff.

O erro que aparece-me na pagina é o seguinte:

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\xxx\xxx\xxx.php on line 133


$utilizador=$_SESSION['utilizador'];

$querydadosuser= "Select * from utilizadores where utilizador = ".$utilizador;

$busca = mysql_query($querydadosuser);


while($perfil=mysql_fetch_array($busca)){

echo "Nome: ".$perfil['nome']."<br>" ;
echo "Idade: ".$perfil['nascimento']." <br>" ;
echo "Sexo: ".$perfil['sexo']."<br>" ;
echo "Estado cívil: ".$perfil['estado_civil']."<br>" ;
echo "Nacionalidade: ".$perfil['nacionalidade']."<br>" ;
echo "Localidade: ".$perfil['localidade']."<br><br><br><br>" ;

echo"<p class='seccao'>Informações de contacto</p>";
echo "E-mail: ".$perfil['email']."<br>" ;
echo "Skype:".$perfil['skype']." <br>" ;
echo "Telemóvel: ".$perfil['telemovel']."<br>" ;
echo "Website: ".$perfil['website']."<br><br><br><br>" ;

}

Cumprimentos

Share this post


Link to post
Share on other sites
mjamado

Olha bem para o erro:

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given

O que quer dizer que tua variável $busca não é uma resource, mas sim um boolean. Como sabemos que a instrução mysql_query é suposto devolver uma resource, temos que nos interrogar: em que condições essa instrução devolve um boolean?

For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.

Conclusão: ocorreu um erro, ou na ligação à BD, ou na query. Verifica se a tabela e o campo existem, o que é que está a vir no $_SESSION['utilizador'] (se está ou não preenchido - se não estiver, dá granel) e certifica-te que estás a abrir a conexão à BD.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
brunoais

Aproveito para afirmar que, se usares o predefinido para a gravação das sessions isso abre uma falha de segurança enorme para acesso aos dados que tens na DB (incluindo apaga-los). Cria uma segurança aí...


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
rjsma

A ligacao a base de dados está bem feita porque utilizo em outra página e não tenho problema.E quando faço o login aparece o nome de utilizador na minha pagina inicial.

Na pagina que estou a trabalhar neste momento não sei se esta a passar o valor do $_SESSION['utilizador']

Antes do codigo php tenho session_start();, penso que assim a sessao continua aberta quando mudo da minha pagina inicial para a pagina que estou neste momento a desenvolver.

Resumindo o problema ou é do $_SESSION['utilizador'] que não tem nenhum valor ou falta fazer alguma coisa.

Encontrei agora um erro, Undefined index: utilizador. Quando tenho um submit na pagina costumo resolver este problema com um isset no submit.Mas como nesta pagina nao tenho nenhum submit não sei como posso fazer para impedir este erro quando a pagina e carregada.

Cumprimentos

Share this post


Link to post
Share on other sites
mjamado
Encontrei agora um erro, Undefined index: utilizador.

Ora aí está!  :)

Se $_SESSION['utilizador'] não tem nada dentro, a query vai ficar SELECT * FROM utilizadores WHERE utilizador = , o que é um erro de sintaxe.

Mete um if à volta disso tudo: if(!empty($_SESSION['utilizador']). Já agora, e como disse o brunoais, verifica se é (ou força uma conversão para) um número antes de enfiares na query. É tão fácil injectar qualquer coisa como:

0; DROP TABLE utilizadores;

E ficas lixado, mas com "F"...  :smoke:


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
rjsma

Resolvi o problema do $_SESSION['utilizador'].

Fiz um echo para mostrar o valor da $_SESSION['utilizador'] e já aparece o nome de utilizador da sessao.  Entretando o fetch_array ainda continua com o tal erro.Fiz tambem um echo no $querydadosuser e esta tudo bem.Por isso tambem nao e problema na query.

Valor do $querydadosuser

Select * from utilizadores where utilizador = anjo

Não percebi o problema que o brunoais detectou.Onde e que se pode inserir codigo malicioso?

Cumprimentos

Share this post


Link to post
Share on other sites
scorch

Na query. Tens de escapar a tua string de session. :confused:


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Share this post


Link to post
Share on other sites
rjsma

Na query. Tens de escapar a tua string de session. :confused:

???

Desculpa, não percebi o que queres dizer.

Share this post


Link to post
Share on other sites
scorch

É como o mjamado te disse. Repara, tu estás a fazer uma query, e essa query é uma sting certo? Essa string é que depois vai ser interpretada pelo MySQL. Mas antes de mandares essa query, tu estás-lhe a adicionar um texto dinamicamente (a variável de sessão), ou seja, se essa variável tiver texto que te altere a query, estás lixado.

Solução: tens de escapar a string. Podes usar esta função:

http://pt.php.net/manual/pt_BR/function.mysql-real-escape-string.php


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Share this post


Link to post
Share on other sites
rjsma

Já consegui resolver o problema do fetch_array.Essa questão de segurança penso que seja isto:


$utilizador=$_SESSION['utilizador'];
$escaped_item = mysql_real_escape_string($utilizador, $ligacao);
$busca = mysql_query("Select * from utilizadores where utilizador = '$escaped_item'");

Share this post


Link to post
Share on other sites
scorch

Sim. Embora não seja necessário tanto. ;)

$busca = mysql_query("Select * from utilizadores where utilizador = '".mysql_real_escape_string($_SESSION["utilizador"])."'");


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Devias de dar uma vista de olhos na classe MySQLi. Apesar de ser uma classe também é possível utilizar no estilo de procedimentos. A diferença entre MySQL e MySQLi é que a classe MySQL só te oferece as funcionalidades do MySQL até à versão 4.1, e a MySQLi oferece-te até à versão 4.1 e superior. E, usando o MySQLi não precisas de usar o mysql_real_escape_string e afins... ;)

Share this post


Link to post
Share on other sites
brunoais

E, usando o MySQLi não precisas de usar o mysql_real_escape_string e afins... ;)

Só uma nota:

É melhor tem atenção ao que referes. Se usar o mysqli em modo procedimental, em muitos dos casos, tb é preciso usar uma função/método para evitar injeção.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Em primeiro lugar, quero pedir desculpa se passei informação errada. Mas, penso que se utilizares a mysqli_prepare não precisas disso (não tenho a certeza, porque nunca usei o modo procedimental).

Share this post


Link to post
Share on other sites
brunoais

Mas, penso que se utilizares a mysqli_prepare não precisas disso (não tenho a certeza, porque nunca usei o modo procedimental).

Confirmo. É isso o que está na manual.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.