Jump to content

Warning: mysql_num_rows() expects parameter 1 to be resource


Go to solution Solved by HappyHippyHippo,

Recommended Posts

Posted (edited)

eu estou a utilizar um script que tem ca na wiki mas ele esta a dar um erro sera que me podem ajudar des de ja desculpem a noobice.

o erro e o seguinte Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /home/pikaxo/public_html/esaf10n.uni.me/perdipassword.php on line 11

codigo php

<h1>Perdi a password</h1>
<?php
 if( !empty($_POST) ){
   // processar o pedido
   mysql_connect('localhost', 'pikaxo_pikaxo', '');  // ligar à base de dados
   mysql_select_db('pikaxo_esaf');  // escolher a base de dados pretendida

   $user = mysql_real_escape_string($_POST['email']);
   $q = mysql_query("SELECT email FROM usuarios WHERE email = '$user'");

   if( mysql_num_rows($q) == 1 ){
  // o utilizador existe, vamos gerar um link único e enviá-lo para o e-mail

  // gerar a chave
  // exemplo adaptado de http://snipplr.com/view/20236/
  $chave = sha1(uniqid( mt_rand(), true));

  // guardar este par de valores na tabela para confirmar mais tarde
  $conf = mysql_query("INSERT INTO recuperacao VALUES ('$user', '$chave')");
  echo "INSERT INTO recuperacao VALUES ('$user', '$chave')";

  if( mysql_affected_rows() == 1 ){

    $link = "http://example.net/recuperar.php?usuario=$user&confirmacao=$chave%22;

    if( mail($user, 'Recuperação de password', 'Olá '.$user.', visite este link '.$link) ){
	  echo '<p>Foi enviado um e-mail para o seu endereço, onde poderá encontrar um link único para alterar a sua password</p>';

    } else {
	  echo '<p>Houve um erro ao enviar o email (o servidor suporta a função mail?)</p>';

    }

 // Apenas para testar o link, no caso do e-mail falhar
 echo '<p>Link: '.$link.' (apresentado apenas para testes; nunca expor a público!)</p>';

  } else {
    echo '<p>Não foi possível gerar o endereço único</p>';

  }
   } else {
  echo '<p>Esse utilizador não existe</p>';
}
 } else {
   // mostrar formulário de recuperação
?>
<form method="post">
 <label for="email">E-mail:</label>
 <input type="text" name="email" id="email" />
 <input type="submit" value="Recuperar" />
</form>
<?php
 }
?>

base de dados

-- phpMyAdmin SQL Dump
-- version 3.4.10.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Oct 02, 2012 at 07:32 PM
-- Server version: 5.1.65
-- PHP Version: 5.2.6
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Database: `pikaxo_esaf`
--
-- --------------------------------------------------------
--
-- Table structure for table `recuperacao`
--
CREATE TABLE IF NOT EXISTS `recuperacao` (
`usuario` varchar(255) NOT NULL,
`confirmacao` varchar(40) NOT NULL,
PRIMARY KEY (`usuario`),
KEY `usuario` (`usuario`,`confirmacao`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Table structure for table `usuarios`
--
CREATE TABLE IF NOT EXISTS `usuarios` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`nome` varchar(50) NOT NULL,
`usuario` varchar(25) NOT NULL,
`senha` varchar(40) NOT NULL,
`email` varchar(100) NOT NULL,
`nivel` int(1) NOT NULL COMMENT 'Aluno (1) e encarregado de educaçao(2) admin (3)',
`ativo` tinyint(1) NOT NULL DEFAULT '1',
`cadastro` datetime NOT NULL,
`enc_nome` varchar(1000) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `usuario` (`usuario`),
KEY `niveis` (`nivel`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=18 ;
--
-- Dumping data for table `usuarios`
--
INSERT INTO `usuarios` (`id`, `nome`, `usuario`, `senha`, `email`, `nivel`, `ativo`, `cadastro`, `enc_nome`) VALUES
(1, 'Usu?rio Teste', 'demo', '89e495e7941cf9e40e6980d14a16bf023ccd4c91', 'usuario@demo.com.br', 1, 1, '2009-07-24 08:32:53', '0'),
(2, 'Administrador Teste', 'admin', 'd033e22ae348aeb5660fc2140aec35850c4da997', 'admin@demo.com.br', 2, 1, '2009-07-24 08:40:40', '0');
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

pgp, sql
Edited by pikaxo
Posted

Já experimentaste fazer var_dump() da string que envias para a função?

o teu erro é na query experimenta

$q = mysql_query("SELECT email FROM usuarios WHERE email = '",$user,"'");

Não experimentaste isso, pois n?

Essa função só aceita 1 ou 2 parâmetros.

"[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%.

  • Solution
Posted

como o SQL parece estar bem construído, o erro pode estar em 2 locais diferentes

- não existe ligação à base de dados

- a base de dados não existe

- o SQL (apesar de estar bem construído) não corresponde a um SQL válido para a base de dados em questão

para verificar o primeiro ponto, verifica se a ligação foi correctamente efectuada

if (mysql_connect('localhost', 'pikaxo_pikaxo', '') === false)
 die("ups, wrong authentication information");

para o segundo e terceiro, não te posso ajudar muito a não ser verificar qual o erro que poderá ter sido originado:

if ((mysql_select_db('pikaxo_esaf') === false) ||
   (($q = mysql_query("SELECT email FROM usuarios WHERE email = '$user'")) === false)
  )
{
 die(mysql_error());
}

ps : é óbvio que o código apresentado pelo @mota77 não é correcto

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

obrigado esse problema esta resolvido mas a seguir a esse apareceu um na outra pagina.

Alterar password

Não é possível alterar a password: dados em falta

ele diz que nao tem dados mas os dados ja estao na bd

<h1>Alterar password</h1>
<?php
 if( empty($_GET['usuario']) || empty($_GET['confirmacao']) )
die('<p>Não é possível alterar a password: dados em falta</p>');

 mysql_connect('localhost', 'pikaxo_pikaxo', '');  // ligar à base de dados
 if (mysql_connect('localhost', 'pikaxo_pikaxo', '') === false)
 die("ups, wrong authentication information");
 mysql_select_db('pikaxo_esaf');  // escolher a base de dados pretendida
 $user = mysql_real_escape_string($_GET['usuario']);
 $hash = mysql_real_escape_string($_GET['confirmacao']);

 $q = mysql_query("SELECT COUNT usuario FROM recuperacao WHERE usuario = '$user' AND confirmacao = '$hash'");

 if( mysql_result($q, 0, 0) == "1" ){
// os dados estão corretos: eliminar o pedido e permitir alterar a password
mysql_query("DELETE FROM recuperacao WHERE usuario = '$user' AND confirmacao = '$hash'");

echo 'Sucesso! (Mostrar formulário de alteração de password aqui)';  

 } else {
echo '<p>Não é possível alterar a password: dados incorretos</p>';

 }

?>
Edited by pikaxo
Posted

a ti só te interessa saber se o registo existe, para isso basta :

// ler o registo de utilizador que guarda a informação pretendida
$q = mysql_query("SELECT usuario FROM recuperacao WHERE usuario = '$user' AND confirmacao = '$hash'");
// verificar o número de registos lidos
// se for 1 então a informação do utilizador é a correcta
if( mysql_num_rows($q) == 1 ){
IRC : sim, é algo que ainda existe >> #p@p
Posted

tens a certeza/confirmação que existe um utilizador com os valores inseridos na query ??

tenho as minhas dúvidas principalmente no campo confirmação por lhe chamares $hash

-- phpMyAdmin SQL Dump
-- version 3.4.10.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Oct 03, 2012 at 02:22 PM
-- Server version: 5.1.65
-- PHP Version: 5.2.6

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `pikaxo_esaf`
--

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

--
-- Table structure for table `recuperacao`
--

CREATE TABLE IF NOT EXISTS `recuperacao` (
 `usuario` varchar(255) NOT NULL,
 `confirmacao` varchar(40) NOT NULL,
 KEY `usuario` (`usuario`,`confirmacao`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dumping data for table `recuperacao`
--

INSERT INTO `recuperacao` (`usuario`, `confirmacao`) VALUES
('jonnie_fagundes1@hotmail.com', '35cb81a728f0544be7891360661296c89b95cff5'),
('jonnie_fagundes1@hotmail.com', 'a0083beca323ce0eb0b5b614d4b403bdfaa341d1');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Posted

mas o erro que está a dar é este?

if( empty($_GET['usuario']) || empty($_GET['confirmacao']) )
	die('<p>Não é possível alterar a password: dados em falta</p>');

É que se é ainda nem chegou ao ponto de executar a query, simplesmente não estás a passar os dados necessários para essa página - usuario e confirmacao

Posted

qal e' a form que estas a enviar para o php?? tens os nomes certos na form???

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

usa o isset em vez do empty.

if( !isset($_GET['usuario']) || !isset($_GET['confirmacao']) )
	die('<p>Não é possível alterar a password: dados em falta</p>');

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

usa o isset em vez do empty.

if( !isset($_GET['usuario']) || !isset($_GET['confirmacao']) )
	die('<p>Não é possível alterar a password: dados em falta</p>');

continua igual

e que entrada da base de dados tem o valor de confirmação "0f7999bd8acc46982787fc0c62d4dec58d3f436e" ??

eu nessa dei apenas um exemplo a entrada que estou a utilizar agora e a http://esaf10n.uni.me/recuperar.php?utilizador=jonnie_fagundes1@hotmail.com&confirmacao=35cb81a728f0544be7891360661296c89b95cff5

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.