Problema pagina di LOGIN in php/mysql[RISOLTO]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
dottor3
Linux 1.x
Linux 1.x
Messaggi: 162
Iscritto il: dom 27 lug 2008, 12:59
Slackware: 13.37
Kernel: 2.6.37.6
Desktop: kde 4.5

Problema pagina di LOGIN in php/mysql[RISOLTO]

Messaggio da dottor3 »

Salve a tutti!!!
Oggi sono particolarmente esasperato!!! :scratch: :scratch:

Sto facendo una semplice pagina php per il login attraverso una lista di user/password in mysql.............ma c'e' un problema che nn riesco a capire!!!!

Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /var/www/*/*/auth.php on line 76

Ovvero quando passo la query con <b>$risultato = MYSQL_QUERY($QUERY)</b> nn restituisce nulla a $risultato!!!

Come faccio???
Sono veramente disperato!! :banghead: :banghead:

PS: se avete bisogno del cosice lo pasto su : http://rafb.net/p/S8sqGN85.html
Ultima modifica di dottor3 il gio 5 feb 2009, 18:16, modificato 1 volta in totale.

Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

Re: Problema pagina di LOGIN in php/mysql

Messaggio da danix »

Codice: Seleziona tutto

$result=mysql_query("SELECT * FROM users WHERE USER='$User' AND PASS='$Pass'", $connessione);
io uso una query del genere per interrogare la tabella degli utenti... come mai hai messo la password tra parentesi nella query??
Inoltre per verificare se mi risulta qualche utente io faccio:

Codice: Seleziona tutto

if(mysql_num_rows($risultatoutente)==0) {
non sono molto esperto e quindi non posso aiutarti molto, però magari ti può tornare utile in qualche modo...
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: Problema pagina di LOGIN in php/mysql

Messaggio da raffaele181188 »

@danix
ha usato la funzione PASSWORD() di MySQL nella query perchè (forse) le password nel suo database sono salvate criptate

@dottor3
Io non sono riuscito a capire cosa vorrebbe fare la tua funzione... Io, invece, per verificare il risultato di una query faccio

Codice: Seleziona tutto

if ($result) {
   ....
}
che è meno da scrivere, ovviamente mi sta bene questo comportamento
php.net ha scritto: For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.
For other type of SQL statements, INSERT, UPDATE, DELETE, DROP, etc, mysql_query() returns TRUE on success or FALSE on error.
The returned result resource should be passed to mysql_fetch_array(), and other functions for dealing with result tables, to access the returned data.
Use mysql_num_rows() to find out how many rows were returned for a SELECT statement or mysql_affected_rows() to find out how many rows were affected by a DELETE, INSERT, REPLACE, or UPDATE statement.
mysql_query() will also fail and return FALSE if the user does not have permission to access the table(s) referenced by the query.
In ogni caso, quando sono in dubbio con errori del genere, io provo le query direttamente dal prompt di mysql per verificare almeno se l'errore è nella sintassi SQL o piuttosto nel codice PHP. Se la tua $resource è false potrebbe anche trattarsi di un banalissimo errore di digitazione nei nomi... Ti conviene controllare prima la query secondo me

Avatar utente
neongen
Packager
Packager
Messaggi: 827
Iscritto il: ven 25 mag 2007, 12:37
Nome Cognome: Enrico
Slackware: 14.0_64
Kernel: 3.4.4
Desktop: KDE 4.5.5
Distribuzione: Maemo 5
Contatta:

Re: Problema pagina di LOGIN in php/mysql

Messaggio da neongen »

hai provato a passargli l'id della connessione?

Codice: Seleziona tutto

$result = mysql_query($query,$LINK_ID);
edit: tra l'altro io aggiungo anche un bel

Codice: Seleziona tutto

or die("Impossibile eseguire: ".mysql_error());

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: Problema pagina di LOGIN in php/mysql

Messaggio da raffaele181188 »

@neongen Scusate l'interruzione ma devo cogliere l'occasione per sciogliere un mio antico dubbio
La tua soluzione

Codice: Seleziona tutto

or die("Impossibile eseguire: ".mysql_error());
per caso funziona anche se la query non contiene errori? Cioè, nel caso in cui il risultato sia una resource con 0 rows...
Ma la madre dei miei dubbi è... Il costrutto funzione() or die("messaggio") (assolutamente non menzionato nel reference di php.net) viene applicato sempre e solo, negli esempi di cui la rete e piena, con le funzioni di MySQL. Io voglio sapere... di preciso cosa fa??? E' un'estensione ufficiale del linguaggio??? Gestione degli errori?? Costrutto condizionale abbreviato?? Cosa diavolo è?? e poi si può usare con altre funzioni? Io mi sono imposto di non usarlo

Avatar utente
neongen
Packager
Packager
Messaggi: 827
Iscritto il: ven 25 mag 2007, 12:37
Nome Cognome: Enrico
Slackware: 14.0_64
Kernel: 3.4.4
Desktop: KDE 4.5.5
Distribuzione: Maemo 5
Contatta:

Re: Problema pagina di LOGIN in php/mysql

Messaggio da neongen »

come non menzionato?
die — Equivalent to exit()
exit — Output a message and terminate the current script
se la query ha esito positivo e restituisce 0 righe die non viene valutato.

Avatar utente
nuitari
Linux 3.x
Linux 3.x
Messaggi: 777
Iscritto il: dom 14 ott 2007, 12:51
Slackware: 12.0
Località: San Colombano al Lambro
Contatta:

Re: Problema pagina di LOGIN in php/mysql

Messaggio da nuitari »

Ragazzi... questi valori di ritorno :) insomma :) mysql_query, mysql_num_rows e mysql_fetch_row restituiscono false in caso di errore, una risorsa o altro in caso di successo. Controllate sempre con l'identical (===), non con il not (!), non è affidabile. Soprattutto, controllate i codici d'errore di ritorno!!

Prova a scrivere il tuo codice (tralasciamo discorsi sulla sicurezza..) in questo modo:

Codice: Seleziona tutto

function auth_user($userid, $userpassword)
{
	global $default_dbname, $user_table;
	$link_id = db_connect();
	
	
	$query = "SELECT username FROM user WHERE userid = '$userid' AND userpassword= Password('$userpassword')";
	if (false === ($result = mysql_query($query)))
		die("mysql_error: " . mysql_error());

	if (false === ($n_rows = mysql_num_rows($result)))
		die("mysql_error: " . mysql_error());

	if(!$n_rows)
		return 0;

	if (false === ($query_data = mysql_fetch_row($result)))
		die("mysql_error: " . mysql_error());

	return $query_data[0];
}
Fatto ciò guarda bene il mex d'errore e se necessario postalo qui sul forum, cercheremo di capire come mai si verifica.

Se lo scrivevi con la mia classe era moooolto + semplice :p

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: Problema pagina di LOGIN in php/mysql

Messaggio da raffaele181188 »

@neongen Non parlavo del die() eh eh, ma dell'intero costrutto funct() or die(). Quell'or non è documentato da nessuna parte e volevo sapere se era una specie di if (false) {} abbreviato o cos'altro... Se hai lumi al riguardo... Perchè potrebbe essere comodo da usare. Giusto per fare un esempio:

Codice: Seleziona tutto

$result = mysql_query("bla bla bla") or die(mysql_error)
Ma una cosa del genere non si è mai vista... Non so nemmeno se funziona

@nuitari Ricapitoliamo. Sembra che questa funzione restituisca il nome dell'utente autenticato (o 0 in caso di errore) controllando id e password (già la logica di tutto questo mi sfugge, ma andiamo avanti). Essendo nuovo di PHP, ne approfitto per chiederti chiarimenti sull'identical === Mi spiego
php.net ha scritto: 1- For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.
2-$a === $b (Identical) TRUE if $a is equal to $b, and they are of the same type. (introduced in PHP 4)
3- Converting to Boolean: [...] Every other value is considered TRUE (including any resource)
Quindi se e solo se mysql_query() avverte un errore SQL il risultato è un false booleano, in tutti gli altri casi restituisce una resource che viene valutata comunque come true (anche se vuota). Domanda: quindi perchè === se if($risultato = mysql_query($q)) porterebbe allo stesso risultato ed è più compatto? Poi questo blocco

Codice: Seleziona tutto

if (false === ($n_rows = mysql_num_rows($result)))
      die("mysql_error: " . mysql_error());
non lo capisco. Provo a farmi seguire: per arrivare qui non bisogna uscire col die() di prima, quindi il risultato di mysql_query() deve essere una resource. Se il risultato è una resource mysql_num_rows() non restituirà mai false, ma tutt'al più 0 (zero), che comunque non sarà mai uguale a false usando === (identical). Quindi mi sembra che questo blocco non abbia chance di essere eseguito mai. E a proposito dell'ultimo if, che viene eseguito se mysql_fetch_row() restituisce false,

Codice: Seleziona tutto

 
if (false === ($query_data = mysql_fetch_row($result)))
      die("mysql_error: " . mysql_error());
ti faccio notare che questo accade se e solo se non ci sono più risultati nella resource. E poichè il nostro select non può restituire più di UN SOLO riscontro ciò significa che mysql_num_rows($resource) ritornerebbe 0 (nel caso l'utente non sia nel db), e quindi la funzionre ritornerebbe 0 a causa del blocco immediatamente precedente. Anche questo blocco non può essere eseguito. Ovviamente ti chiedo così tante cose perchè mastico poco di PHP e mi sembra, a questo punto, di non capirci un c :D :D :D

@dottor3
Magari fai prima a dire quello che devi fare, perchè il tuo codice mi sembra proprio strano... Magari ti sei intestardito a percorrere la strada sbagliata!!!

Avatar utente
nuitari
Linux 3.x
Linux 3.x
Messaggi: 777
Iscritto il: dom 14 ott 2007, 12:51
Slackware: 12.0
Località: San Colombano al Lambro
Contatta:

Re: Problema pagina di LOGIN in php/mysql

Messaggio da nuitari »

raffaele181188 ha scritto:@nuitari Ricapitoliamo. Sembra che questa funzione restituisca il nome dell'utente autenticato (o 0 in caso di errore) controllando id e password (già la logica di tutto questo mi sfugge, ma andiamo avanti). Essendo nuovo di PHP, ne approfitto per chiederti chiarimenti sull'identical === Mi spiego
php.net ha scritto: 1- For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.
2-$a === $b (Identical) TRUE if $a is equal to $b, and they are of the same type. (introduced in PHP 4)
3- Converting to Boolean: [...] Every other value is considered TRUE (including any resource)
Quindi se e solo se mysql_query() avverte un errore SQL il risultato è un false booleano, in tutti gli altri casi restituisce una resource che viene valutata comunque come true (anche se vuota). Domanda: quindi perchè === se if($risultato = mysql_query($q)) porterebbe allo stesso risultato ed è più compatto?
Eheh ho sorvolato anch'io sulla logica. Il motivo per l'utilizzo dell'identical è che il *not* è semanticamente sbagliato ed è un *bad habit* che porta a fare errori quando invece andrebbe usato. Inoltre è incongruente con la documentazione dell'API. E' vero che una risorsa valida viene convertita in TRUE nella tipizzazione debole del PHP, ma se la funzione restituisce come errore un FALSE booleano, è corretto verificare il FALSE booleano con l'operatore apposito, che è l'identical. Il modo di gestire una risorsa o la conversione dei tipi cambia in base ai settaggi dell'interprete e delle revisioni del PHP. Se il confronto è fatto rispettando *le regole*, il codice andrà sempre e comunque.
A meno che non cambino l'API, ovviamente, ma in tal caso trovare e sistemare le occorrenze nell'utilizzo diventa molto più semplice.
raffaele181188 ha scritto: Poi questo blocco

Codice: Seleziona tutto

if (false === ($n_rows = mysql_num_rows($result)))
      die("mysql_error: " . mysql_error());
non lo capisco. Provo a farmi seguire: per arrivare qui non bisogna uscire col die() di prima, quindi il risultato di mysql_query() deve essere una resource. Se il risultato è una resource mysql_num_rows() non restituirà mai false, ma tutt'al più 0 (zero), che comunque non sarà mai uguale a false usando === (identical). Quindi mi sembra che questo blocco non abbia chance di essere eseguito mai.
E invece ne ha eccome :) Le funzioni di api mysql_* lavorano su risorse, sulla connessione al DB, etc. Possono succedere una quantità di errori che dipendono dall'api stessa, dalla connessione con il db, dalla gestione di PHP della risorsa, dagli interventi del programmatore, etc. Se la documentazione dell API specifica che questa funzione può restituire FALSE on failure (e questo è il caso di mysql_num_rows()), è compito del programmatore verificare il valore di ritorno nel modo appropriato. La differenza fra lo *spaghetti code* ed un buon codice almeno per il 50% risiede nel controllo dei codici di errore restituiti dalle funzioni.

raffaele181188 ha scritto: E a proposito dell'ultimo if, che viene eseguito se mysql_fetch_row() restituisce false,

Codice: Seleziona tutto

 
if (false === ($query_data = mysql_fetch_row($result)))
      die("mysql_error: " . mysql_error());
ti faccio notare che questo accade se e solo se non ci sono più risultati nella resource. E poichè il nostro select non può restituire più di UN SOLO riscontro ciò significa che mysql_num_rows($resource) ritornerebbe 0 (nel caso l'utente non sia nel db), e quindi la funzionre ritornerebbe 0 a causa del blocco immediatamente precedente. Anche questo blocco non può essere eseguito. Ovviamente ti chiedo così tante cose perchè mastico poco di PHP e mi sembra, a questo punto, di non capirci un c :D :D :D
Vai tranquillo, chiedere è lecito, rispondere è cortesia :)
Questa è stata solo estrema pignoleria. Per logica non dovrebbe arrivare li se i risultati sono quelli premessi, hai ragione. Il fatto è che lui ha una situazione di errore, e per risolvere una situazione di errore devi applicare controlli completi, a volte persino estremi. Per cui, piuttosto che perdere tempo a rimbalzare fra 1.000 post ho preferito suggerirgli di scrivere la funzione in questo modo, a prova dell'errore più scemo, di corruzione della memoria, etc.

Volendo concludere, non bisogna mai dare per scontati i risultati e bisogna SEMPRE controllare i valori di ritorno delle funzioni nel modo corretto, non facendo MAI affidamento sulle conversioni e su altri meccanismi *impliciti*, se si vuole scrivere codice *sempre* funzionante.

Scrivendo codice di una certa complessità mi è capitato d'incappare in corruzioni della memoria in PHP, trovandomi con risultati inaspettati in cose come gli array superglobal. Scrivevo codice del tipo:

Codice: Seleziona tutto

echo $_REQUEST["username"];
$username = $_REQUEST["username"];
echo $username;
il primo echo mi restituiva il valore corretto, il secondo un riferimento ad una risorsa... è illogico vero? eppure può accadere. Se verifichi ogni operazione che esegui nel modo corretto, scovare e risolvere bug, limitare i comportamenti imprevisti dell'applicazione dovuti agli errori tuoi e quelli non gestiti dell'utente diventa molto, molto più semplice :)

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: Problema pagina di LOGIN in php/mysql

Messaggio da raffaele181188 »

:thumbright: Ora magari tocca a lui postare l'output...

Avatar utente
nuitari
Linux 3.x
Linux 3.x
Messaggi: 777
Iscritto il: dom 14 ott 2007, 12:51
Slackware: 12.0
Località: San Colombano al Lambro
Contatta:

Re: Problema pagina di LOGIN in php/mysql

Messaggio da nuitari »

eheh aspettiamo con ansia . almeno un [RISOLTO] magari..

Avatar utente
neongen
Packager
Packager
Messaggi: 827
Iscritto il: ven 25 mag 2007, 12:37
Nome Cognome: Enrico
Slackware: 14.0_64
Kernel: 3.4.4
Desktop: KDE 4.5.5
Distribuzione: Maemo 5
Contatta:

Re: Problema pagina di LOGIN in php/mysql

Messaggio da neongen »

:oops: quello è il normalissimo or
credo in tutti i linguaggi <expr1> or <expr2> significa valuta expr2 se e solo se expr1 è falsa [associativo a sinistra]

comunque se dottor3 non fa stampare gli errori non se ne viene a capo.

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: Problema pagina di LOGIN in php/mysql

Messaggio da raffaele181188 »

:oops: :oops: :oops:
Be' sarà pure normalissimo ma non l'avevo mai visto da nessuna parte :D :D :D ... Ho spulciato anche la guida di php.net e adesso l'ho trovato eh eh... scusate!!! E' che non l'ho mai visto usato da nessuna parte e quella pagina della guida l'avevo saltata perchè mi sembrava banale... grazie della precisazione. Io conoso solo un po' di java e lì non c'è... JavaScript nemmeno (mi pare) lo usa... Di C ho giusto le basi delle basi e, se in quel linguaggio esiste, non me ne hanno fatto cenno! eh eh .. Io roba per confrontare i booleani l'avevo usata sempre e solo nelle strutture tipo l'if e il for, e non avevo mai avuto bisogno dell'or scritto così(tutt'al più ||...). Negli script bash c'è l'&& (non so se esiste anche l'|| perchè la mia conoscenza non arriva così a fondo!)

Ora, se magari dottor3 posta l'output... Vuoi vedere che semplicemente hai sbagliato a digitare l'username??? :D :D :D

Avatar utente
dottor3
Linux 1.x
Linux 1.x
Messaggi: 162
Iscritto il: dom 27 lug 2008, 12:59
Slackware: 13.37
Kernel: 2.6.37.6
Desktop: kde 4.5

Re: Problema pagina di LOGIN in php/mysql

Messaggio da dottor3 »

Dunque ragazzi..........
Il listato e' molto semplice.....

Questa funzione riceve le due stringhe ($userid e $userpassword) e controlla che siano uguali a quelle ricavate dal database.......se la corrispondenza c'e' restituisce l'username ALTRIMENTI restituisce zero.

Il perche' della chiamata a Password() e' solo perche' essendo univoca la cifratura devo vedere se le due parole cifrate sono uguali!

Ora:

function auth_user($userid, $userpassword){
global $default_dbname; ---> nome database;
$link_id = db_connect(); ------>si connette al DB

$query = "SELECT username FROM user WHERE userid = '$userid' AND userpassword= Password('$userpassword')"; --->Query esatta provatela pure nel client mysql

$result = mysql_query($query);---->restituisce il risultato della query mandata a SQL

if(!mysql_num_rows($result){ ------se mysql_num_row restituisce 0 chudi
return 0;
}else{
$query_data = mysql_fetch_row($result); -------->Altrimenti inserisci la riga di risultato in $query_data e ritornalo come risultato della funzione!!!

return $query_data[0];
}
}

SEMPLICE NO?

L'unica cosa che mi restituisce il browser e' ( oltre a dirmi che la passworde e' errata) <b>Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /var/www/htdocs/gigetto/gigetto/gigetto/auth.php on line 76</b>


Vi assicuro che la password e' corretta

Avatar utente
nuitari
Linux 3.x
Linux 3.x
Messaggi: 777
Iscritto il: dom 14 ott 2007, 12:51
Slackware: 12.0
Località: San Colombano al Lambro
Contatta:

Re: Problema pagina di LOGIN in php/mysql

Messaggio da nuitari »

perchè non copi ed incolli il codice che ti ho postato, e ci incolli l'errore, per favore?

Rispondi