Por que dá erro nesta Query? [RESOLVIDO]

1. Por que dá erro nesta Query? [RESOLVIDO]

Diego
diegobh

(usa CentOS)

Enviado em 19/12/2013 - 16:22h

<?php
$sql5 = mysql_query('select * from contratos where cliente = '.$id.' AND (select vencimento from contratos where cliente = '.$id.') >= CURRENT_DATE AND (select active from contratos where cliente = '.$id.') == 1');

if (mysql_result($sql5, 0) > 0) { echo '<img src="imgs/on.png" style="width: 25px; height: 25px;">'; } else { echo '<img src="imgs/off.png" style="width: 25px; height: 25px;">'; }

?>


Tabela clientes:
id (int, pk) / nome (varchar)

Tabela contratos:
id (int, pk) / cliente (int, fk: clientes/id) / vencimento (date YYYY-mm-dd) / active (int)

O $id vem de um while com todos os ids cadastrados.

O que eu quro fazer:
Imagem ON se todos os contratos estiverem no prazo de validade (data venc > data atual) e para os contratos ativos (active = 1).

Imagem OFF se pelo menos 1 contrato ativo (active = 1) estiver vencido. Se active = 0, ignorar a checagem.

Não funciona de jeito nenhum, recebo este erro:
Warning: mysql_result() expects parameter 1 to be resource, boolean given in index.php on line 57


Linha 57:
if (mysql_result($sql5, 0) > 0) { echo '<img src="imgs/on.png" style="width: 25px; height: 25px;">'; } else { echo '<img src="imgs/off.png" style="width: 25px; height: 25px;" alt="Contrato(s) Vencido!">'; }


Valew galera!!!


  


2. MELHOR RESPOSTA

cr0n
_di0

(usa FreeBSD)

Enviado em 19/12/2013 - 20:12h

Se você ler com atenção o manual do PHP, na parte da documentação sobre a função mysql_query(), verá que em caso de falha na consulta passada nessa função, o retorno será FALSE, ou seja, um resultado tipo booleano.

Já na função mysql_result(), o primeiro parâmetro deve ser o tipo especial resource(uma referência para um recurso externo, nesse caso o mysql).

A mensagem citada por você não se trata de um erro, mas de um warning, e ela diz justamente o que descrevi acima: Que a função mysql_result(), espera no primeiro argumento uma referência resource e você passou um tipo booleano. Isso quer dizer que a variável $sql5 recebeu como resultado, um valor booleano, indicando que alguma coisa errada aconteceu no momento da consulta, quando se usou a função mysql_query().

Uma boa prática é não passar diretamente a variável que recebeu o resultado da função mysql_query(), diretamente para a função myqsl_result(), sem antes testar se ela é mesmo uma referência para um recurso externo (indicando sucesso) ou apenas uma variável que recebeu um booleano FALSE (indicando que erros ocorreram).

Veja o exemplo retirado do próprio manual oficial do PHP:



<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
$result = mysql_query('SELECT name FROM work.employee');
if (!$result) {
die('Could not query:' . mysql_error());
}
echo mysql_result($result, 2); // outputs third employee's name

mysql_close($link);
?>





3. Re: Por que dá erro nesta Query? [RESOLVIDO]

Diego
diegobh

(usa CentOS)

Enviado em 20/12/2013 - 15:08h

Isso eu já tinha percebido, esperava que retornasse 0 ou a quantidade de registros e tava retornando false =( Não consegui fazer realmente como queria, o erro estava na ultima subselect, onde eu checava se o valor de active == 1.

Mesmo assím, muito obrigado pela ajuda!!!
Não resolveu meu problema no código, pois não consegui linkar o exemplo do manual do php com meu código =P Mas minha pergunta, que foi o assunto do tópico foi muito be respondida xD

Consegui fazer de um jeito que funcione. Não era como esperava, mas me atendeu.

Segue abaixo a resoução, para caso alguém tenha o mesmo problema:

<?php
$sql5 = mysql_query('select count(vencimento) from contratos where cliente = '.$id.' AND (select vencimento from contratos where cliente = '.$id.') < CURRENT_DATE AND (select active from contratos where cliente = '.$id.') != 0');

if (mysql_result($sql5, 0) > 0) { echo '<img src="imgs/off.png" style="width: 25px; height: 25px;">'; } else { echo '<img src="imgs/on.png" style="width: 25px; height: 25px;">'; }

?>