mysql_num_rows() expects parameter 1 to be resource, boolean given

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Buongiorno, magari l'argomento è già stato trattato ma non ne vengo a capo. Sicuramente qualcuno di voi mi può dare un consiglio.
Il problema è questo, ho un form oramai ben sviluppato nel quale devo far registrare un utente, dopo aver processato i dati sia con js che php mi appare questo warning ma dal quale non riesco ad uscirne. Qua di seguito vi metto il motore del form
PHP:
<?php

	header ('Content-Type: text/html; charset=UTF-8');	//Codifica caratteri accentati TESTO

if(!isset($_GET['passkey'])){
	if(!isset($_POST['invia'])){

		if($_SERVER['REQUEST_METHOD'] == 'POST'){

			$nome = trim($_POST['nome']);
			$cognome = trim($_POST['cognome']);
			$età = trim($_POST['nascita']);
			$username = trim($_POST['username']);
			$email = trim($_POST['email']);
			$interessi = trim($_POST['interessi']);
			$password = trim($_POST['password']);
			$password2 = trim($_POST['password2']);

Ci sono qua i controlli su email, controllo dns etc che ho omesso


			//preparo un messaggio a vuoto per gli errori
			$ok_ko="";
			if(!ver_testo($username,6,15)){$ok_ko.="Username non corretto, deve essere compreso tra 6 e 15 caratteri compresi i caratteri jolly <br />";}
			if(!ver_testo($password,6,12)){$ok_ko.="La password deve essere composta da 6 a 12 caratteri <br />";}
			if(!ver_testo($password2,6,12)){$ok_ko.="La password di conferma non coincide con la prima <br />";}
			if($password != $password2){$ok_ko.="Le password non coincidono <br />";}
			if(!filter_var($email, FILTER_VALIDATE_EMAIL)){$ok_ko.="L'indirizzo email non è valido <br />";}

			function controllodata($età){
				//"/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/"
				if (!preg_match("/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/", $età)) {
					return false;
				} else {
					$arrayData = explode("/",$età );
					$Giorno = $arrayData[0];
					$Mese = $arrayData[1];
					$Anno = $arrayData[2];
					if(!checkdate($Mese,$Giorno,$Anno)){
						return FALSE;
					} else {
						return TRUE;
					}
				}
			}
			if(!controllodata($età)){$ok_ko.="La data non è stata inserita in modo corretto <br />";}
			//if(preg_match("/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/", $età)){$ok_ko.="Devi inserire la tua età <br />";};
			if($ok_ko == ""){
				//se è rimasto vuoto non ci sono errori

			// creazione di un codice di conferma in MD5
			$codiceconferma = md5(uniqid(rand()));
			$nome = mysql_real_escape_string(strtolower($nome));
			$cognome = mysql_real_escape_string(strtolower($cognome));
			$username = mysql_real_escape_string((strtolower($username))); //salvo il nickname tutto in minuscolo onde evitare problemi.
			$email = mysql_real_escape_string(strtolower($email)); //metto in minuscolo la mail

			//Verifico che non ci sia un username o una mail uguale a quello inserito nel form
				//$verificauser = mysql_query("SELECT id FROM biblionet nuova ok WHERE username='$username' OR email='$email'");
				//$contausermail = mysql_num_rows($verificauser);

				//Prova user doppio
				$verificauser = "SELECT * FROM biblionet nuova ok WHERE username = '$username' OR email = '$email'";
				$risultatouser = mysql_query($verificauser);
				$num_righe = mysql_num_rows($risultatouser);


//				$recuperouser = mysql_query("SELECT * FROM biblionet nuova ok WHERE username = '$username' OR email = '$email'");
//				$controllouser = mysql_num_rows($recuperouser);
				if($num_righe > 0){
					//$contauserdoppio = mysql_num_rows($risultatoverificauser);
					//if($contauserdoppio > 0){
						//if($contausermail > 0 ){
						//if(mysql_num_rows($verificauseremail > 0)){
						//avvisi e torni al form pulito
						echo "ATTENZIONE: Username o Email già esistenti, scegline un altro. <br />";
						echo "<meta http-equiv='Refresh' content='100; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
					} else {

					//Invio i dati dell'utente al db

					$nome = mysql_real_escape_string($nome);
					$cognome = mysql_real_escape_string($cognome);
					$età = mysql_real_escape_string($età);
					$username = mysql_real_escape_string($username);
					$email = mysql_real_escape_string($email);
					$interessi = mysql_real_escape_string($interessi);
					$password = mysql_real_escape_string($password);
					$inviautentitemp = "INSERT INTO biblionet_nuova_temp (codiceconferma, nome, cognome, età, interessi, username, email, password) VALUES ('$codiceconferma', '$nome', '$cognome', '$età', '$interessi', '$username', '$email', '$password')";

					if($inviautentitemp){
						//se tutto è OK da qua preparo l'invio della mail di conferma per l'avvenuta registrazione.
						include_once("class.phpmailer.php");
						$mail = new PHPmailer();
						$mail->IsSMTP();
						$mail->isHTML(true);
						$mail->SMTPDebug = true;
						$mail->Host = "smtp.fastwebnet.it";
						$mail->Port = "25";
						$mail->SMTPAuth = true;
						$mail->Username = "[email protected]";
						$mail->Password = "xxxxxxxx";
						// Impostazioni invio mail al cliente
						$mail->Setfrom ("[email protected]","Biblionet");   //Inserire la mail dell'amministratore ed il nome del sito
						$mail->AddReplyTo("[email protected]","Amministratore");
						$mail->AddAddress ($email); //Mail di chi si è iscritto che riceverà la richiesta di conferma
						$mail->AltBody = "Il tuo client di posta non è settato per la ricezione in HTML";
						$mail->Subject = "Conferma di registrazione al sito www.biblionetsanmaurizio.com";
						//poi prova a modificare il testo da inviare
						$testo="<p>Ecco il tuo codice di attivazione</p><br />";
						$testo.="<p>Clicca sul link per confermare la registrazione</p><br />";
						$testo.="<a href=\"http://siti/Biblionet%20Nuova%20OK/registrazione.php?passkey=$codiceconferma\">Clicca qui</a>";
						$mail->Body =$testo;

							if ($mail->Send()){
								echo "Tra poco riceverai una mail con il codice di attivazione per confermare l'iscrizione";
								echo "<meta http-equiv='Refresh' content='30; URL=Newindex.php'>";
							} else {
								echo "Si è verificato un errore di trasmissione riprova più tardi";
								echo "<meta http-equiv='Refresh' content='30; URL=Newindex.php'>";
							}

				} else {
					echo "ERRORE di connesione, ti preghiamo di riprovare più tardi<br />";
					echo "<meta http-equiv='Refresh' content='30; URL=Newindex.php'>";
				}

				}

			} else {
				echo $ok_ko;
				echo "<meta http-equiv='Refresh' content='300; URL=Newindex.php'>";
			}
			}

		}
			} else {

			$passkey = htmlspecialchars($_GET['passkey']);

			$sqlrecuperauser = "SELECT * FROM biblionet_nuova_temp WHERE codiceconferma = '$passkey'";
			$risultatouser = mysql_query($sqlrecuperauser);


			if($risultatouser) {

				$contauser = mysql_num_rows($risultatouser);

				if($contauser == 1){

					$rows = mysql_fetch_array($risultatouser);
					$nome = $rows ['nome'];
					$cognome = $rows ['cognome'];
					$età = $rows ['età'];
					$username = $rows['username'];
					$email = $rows['email'];
					$interessi = $rows ['interessi'];
					$password = $rows ['password'];

					$passwordcript = md5($password);

					$sqlconfermauser = mysql_query("INSERT INTO biblionet nuova ok (nome, cognome, età, username, email, interessi, password) VALUES ('$nome', '$cognome', '$età', '$username', '$email', $interessi', '$passwordcript'");

					if ($sqlconfermauser == 1) {

						echo "Il tuo account è stato attivato con successo, da adesso potrai accedere alle pagine del sito inserendo i tuoi dati.";
						$sqleliminadati = mysql_query("DELETE FROM biblionet_nuova_temp WHERE codiceconferma = '$passkey'");

					} else {

						echo "C'è stato un errore, se hai sbagliato qualcosa riprova, altrimenti segnalacelo. Lo correggeremo il prima possibile!";
						echo "<meta http-equiv='Refresh' content='30; URL=Newindex.php'>";

					}

				}

			}



	} //Chiudo il controllo sul invio dati alla seconda riga
 //Chiudo if/else della passkey alla seconda riga



?>

Il warning me lo da alla riga 205 e cioè
PHP:
	$num_righe = mysql_num_rows($risultatouser);
Sapete dirmi come mi cdevo regolare per evitare questo avviso?
Premetto che a parte questo il tutto funziona, la mai la ricevo e vengono inseriti i dati i tabella.

Grazie:eek::eek:
 
Ciao borgo.
in che modo verifico la query? Non so proprio da dove partire ed inoltre non mi mette i dati nel db temporaneo! :incazz2: Ricevo la mail di conferma registrazione ma non ho dati in sql.
Inoltre volevo sapere se il motore della registrazione è meglio metterlo cme file a parte oppure direttamente nel codice html del sito. Così da non avere in action il file che rimanda al motore di registrazione ma di averlo direttamente li.
 
ciao
con il solito var_dump

PHP:
<?php
//............
$verificauser = "SELECT * FROM biblionet nuova ok WHERE username = '$username' OR email = '$email'";
var_dump($verificauser);
$risultatouser = mysql_query($verificauser);
var_dump($risultatouser);
$num_righe = mysql_num_rows($risultatouser);
//.........
?>
 
Eccomi, allora dopo aver inserito il var_dump come mi hai consigliato ho ottenuto questi errori:
bool(false)
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\xampp\....\registrazioneuser2.php on line 205
string(247) "INSERT INTO biblionet_nuova_temp (codiceconferma, nome, cognome, et�, interessi, username, email, password) VALUES ('a1e107d052beee02f32738806874b6a2', 'nome', 'cognome', '01/01/1950', 'prova 2', 'paperino', '[email protected]', 'pass')".

il problema è sempre il warning che non so che pesci pigliare e sopratutto la data che non riesco a togliere gli slash nemmeno con stripslashes. Ho inserito prima di inviare i dati al db questa riga
PHP:
	$età = stripslashes($età);
ma non riesco a venirne a capo.
 
Aggiornamento!
Nel html ho uno script che mi inserisce gli slash dopo aver messo al data di nascita ed è questo:
HTML:
function addSlashes(input) {
    var v = input.value;
    if (v.match(/^\d{2}$/) !== null) {
        input.value = v + '/';
    } else if (v.match(/^\d{2}\/\d{2}$/) !== null) {
        input.value = v + '/';
    }
}
anche mettendo questa stringa
PHP:
	$età = str_replace("//","-" ,$età );
il var_dump mi da la data con gli slash. cosa posso fare?
 
Problema di mysql_num_rows sembra risolto, :fonzie::fonzie: ho sistemato il codice in questo modo cnhe se non mi è chiarissimo
PHP:
	$mysqli = new mysqli("localhost", "root", "");
if ($verificauser = $mysqli->query("SELECT * FROM biblionet nuova ok WHERE username='$username' OR email='$email'")) {
$userusato = (($verificauser->num_rows) > 0);

quanto a gli slash non ho capito cosa posso fare. :incazz2::incazz2:
 
Proprio nessuno sa darmi qualche informazione??
Ripeto, inserendo il codice che ho postato in forma javascript come posso eliminare gli slash per inserire la data in mysql? Vorrei evitare di fare un form con 3 campi distinti per giorno mese e anno.

Grazie
 
ciao
PHP:
<?php
$eta="10/01/2013";
echo "$eta<br />";
$eta = str_replace("/","-" ,$eta ); 
echo "$eta<br />";
?>

edit
sripslashes toglie \ non /
 
Ultima modifica:
Grazie borgo! Sempre il migliore.
senti un'altra domanda. Il form ora funziona ed è tutto ok, ricevo la mail e posso completare la registrazione la data me la da come 01011950 come giorno mese anno, quindi per me va bene, il problema invece è che non riesc ad inserire i dati in db, l'inserimento deve coincidere con i nomi creati nel db? Cioè mi spiego meglio, se io creo una tabella con nome cognome indirizzo, in questo ordine anche in php devo metterli in questo ordine oppure basta associare il nome al VALUE ?
questo è il codice secondo te è corretto?
PHP:
$inviautentitemp = "INSERT INTO biblionet_nuova_temp (codiceconferma, nome, cognome, eta, interessi, username, password, email) VALUES ('$codiceconferma', '$nome', '$cognome', '$eta', '$interessi', '$username', '$password', '$email')";
 
ciao
dal punto di vista dell'ordine e per evitare errori di digitazione è sempre meglio seguire l'ordine dei campi come in tabella.
vista così la query non sembra contenere errori.
comunque fai un var dump
PHP:
<?php
//....
$inviautentitemp = "INSERT INTO biblionet_nuova_temp (codiceconferma, nome, cognome, eta, interessi, username, password, email) VALUES ('$codiceconferma', '$nome', '$cognome', '$eta', '$interessi', '$username', '$password', '$email')"; 
var_dump($inviautentitemp);
//poi anche (immagino che sia così
var_dump(mysql_query($inviautentitemp));
//....
?>
e verifica cosa ti restituiscono i var_dump
 
Questo è l'errore che mi da
PHP:
bool(false) bool(false) ERRORE di connesione

inserendo questo controllo
PHP:
$inviautentitemp = mysql_query("INSERT INTO biblionet_nuova_temp (codiceconferma, nome, cognome, eta, interessi, username, password, email) VALUES ('$codiceconferma', '$nome', '$cognome', '$eta', '$interessi', '$username', '$password', '$email')");
var_dump($inviautentitemp);
var_dump (mysql_query($inviautentitemp));
if ($inviautentitemp) {
qua compilo la mail e la invio.
 
ciao
tieni divisa la querystringa dalla query in modo da vedere se la stringa viene formata come dovrebbe
es.
PHP:
 <?php
//....
$inviautentitemp = "INSERT INTO biblionet_nuova_temp (codiceconferma, nome, cognome, eta, interessi, username, password, email) VALUES ('$codiceconferma', '$nome', '$cognome', '$eta', '$interessi', '$username', '$password', '$email')"; 
var_dump($inviautentitemp);//qui dovrebbe darti STRING (xy) "INSERT.....e tutti i valori"
$ris=mysql_query($inviautentitemp);
var_dump($ris);//qui resuorce se ok o bool false se ko
//....
?>
comunque verifica anche la corrispondenza dei nomi campi con quelli scritti nella querystringa (comprese maiuscole/minuscole)
 
Ti confermo che al primo var_dump ottengo questo
PHP:
"INSERT INTO biblionet_nuova_temp (codiceconferma, nome, cognome, eta, interessi, username, password, email) VALUES ('7661facb5505210ea60e50b94a98b4e7', 'qwqwq', 'qwqwqqw', '05061950', 'qpqpqp', 'zzzzzz', 'zzzzz', '[email protected]')"
mentre al secondo var_dump ottengo questo
PHP:
 bool(false) ERRORE di connesione, ti preghiamo di riprovare più; tardi
e tutti i campi sono corrispondenti al db che ho.
 
Spero sia corretta!
PHP:
-- Server version	5.5.27

/*!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 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
 

Discussioni simili