Newsgroup: it.comp.www.php
Titolo: ma mysql mi risponde a caso????

Ogni volta che credo di essere entrato nel meccanismo del php 
puntualmente mi ritrovo con problemi che mi disorientano.
Il problema ora e' questo.
Sto facendo un gestionale per cui rilascio delle schede di lavorazione 
ai clienti. Queste schede riportano tra l'altro il numero progressivo 
alias chiave primaria e una password casuale per ora di 3 caratteri (per 
ora!).
Ho pensato che sarebbe interessante che il cliente si connettesse a 
internet ed accedesse allo stato di lavorazione usando come username il 
numero progressivo e quindi unico, e ovviamente come password la 
password generata. Per fare le prove sono entrato con le credenziali:
user=2
password=h24
Ho fatto un po' di prove. Sembrava funzionare. Se cambio le credenziali 
mi da login errato.
Poi casualmente ho provato a mettere
user=2e
password=h24
ed entra. (???)
Ho fatto varie combinazioni.
per esempio con user=22 oppure 221 ecc non entra, mentre con 2 piu' 
caratteri alfabetici entra (2e, 2ge, 2jksi).
Sui manuali non ho trovato nulla che mi segnalasse questo possibile bug, 
probabilmente come al solito sono io che ho fatto qualche stupidagine.
Riporto la pagina di accesso.php che riceve i dati dal form, li 
convalida ed eventualmente rimanda all'area riservata.
Ovviamente la forma maccheronica rispecchia il mio livello attuale che 
non e' granche'.
<?php
   session_name('areacliente');
   session_start ();
   include 'include/variabili.php';
   include 'include/connessione.php';
   $_SESSION['utente']=$_POST['utente'];
   $_SESSION['webpassword']=$_POST['password'];
   $id_lavorazione= $_SESSION['utente'];
$sql="select * from lavorazioni where id_lavorazione 
='".$id_lavorazione."';";
$query=mysql_query($sql);
     if (mysql_num_rows($query) == "0"){
        echo "Login errato";
     }
     else
/* qui dovrei fare una verifica per assicurarmi che
   mysql_num_rows($query) sia al massimo 1. Non l'ho ancora fatto ma nel
caso specifico non accade */
         {
           $lavorazione=mysql_fetch_assoc($query);
           $webpassword=$lavorazione["webpassword"];
	// confronto la password inserita con quella
	// nella tabella. Se sono uguali mi copio il resto
	// dei dati e la mando a web_area_riservata_cliente.php
           if ($_SESSION['webpassword'] == $webpassword)
             {
				$_SESSION['id_lavorazione']=$lavorazione["id_lavorazione"];
				$_SESSION['id_cliente']=$lavorazione["id_cliente"];
				$_SESSION['data_in']=$lavorazione["data_in"];
				$_SESSION['id_macchina']=$lavorazione["id_macchina"];
				$_SESSION['macchina_altro']=$lavorazione["macchina_altro"];
				$_SESSION['id_marca']=$lavorazione["id_marca"];
				$_SESSION['modello']=$lavorazione["modello"];
				$_SESSION['difetto']=$lavorazione["difetto"];
				$_SESSION['alimentatore']=$lavorazione["alimentatore"];
				$_SESSION['altro']=$lavorazione["altro"];
				$_SESSION['id_stato']=$lavorazione["id_stato"];
				$_SESSION['borsa']=$lavorazione["borsa"];
				$_SESSION['webmessage']=$lavorazione["webmessage"];
				$_SESSION['data_end']=$lavorazione["data_end"];
				$_SESSION['data_out']=$lavorazione["data_out"];
				$_SESSION['ricambi_int']=$lavorazione["ricambi_int"];
				$_SESSION['ricambi_est']=$lavorazione["ricambi_est"];
				$_SESSION['manodopera']=$lavorazione["manodopera"];
				$_SESSION['rapporto']=$lavorazione["rapporto"];
 
                 header("Location: web_area_riservata_cliente.php");
             /*  echo "iela avemo fatta, siamo dentro";
               	echo "<br/>";
             */
             }
           else
             {
               echo "Login errato";
             }
         }
?>

 ='".$id_lavorazione."';";
Probabilmente id_lavorazione e' un campo numerico, mentre tu glielo passi 
come stringa (tra virgolette singole).
MySQL, come PHP in questi casi, probabilmente converte la stringa in 
numero, e scarta tutti i caratteri a partire dal primo non numerico. 
Quindi per lui "2n3984798" e` comunque "2"
Usa PDO per gli accessi al database, che ti risparmi un po' di mal di 
testa.
Bye.

Alessandro Pellizzari ha scritto:


Molte grazie del suggerimento.
mi sono inventato questo controllo
if ((string)(int)$_POST['utente']!==(string)$_POST['utente'])
allora login errato altrimenti prosegui.
in questo modo verifico che l'utente abbia solo numeri.
Come lo trovi? Ho inventato l'acqua calda?
PDO? ecco questo mi mancava. Esiste documentazione o libri in proposito?
Grazie ancora

Come lo trovi? Ho inventato l'acqua calda?
is_numeric() is your friend ;-)
Leonardo
-- 
The cock doth craw, the day doth daw,
the channerin' worm doth chide:
gin we be mist oot o' oor place,
a sair pain we maun bide.

 
wow
grazie
:-o

 is_numeric() is your friend ;-)
*mysqli* is your friend :)
	Y.