Problema di connesione al database

surapazzo

Utente Attivo
10 Dic 2013
63
0
0
Buongiorno a tutti mi sto avvicinando per le prime volte al php per un progetto e avrei bisogno di una mano...
Ho bisogno di connettermi al database ma mi da degli strani warning e nn si connette...
Vi mettoo un po di codice per capirci...

PHP:
<?php
class mysqlClass
{
  // parametri per la connessione al database
  private $hostname = "localhost";     
  private $port 	= "5670";
  private $dbname	= "pinco";
  private $username = "palla";          
  private $password = "prrrrr"; 
  // controllo sulle connessioni attive
  private $active = false;
  private $conn;
  
  // funzione per la connessione a MySQL
  public function connect()
  { // connessione al DBMS 
		$con= new mysqli($hostname, $username, $password, $dbname); 		
		
		if( mysqli_connect_errno())  
{ 
   		 echo ('Non riesco a connettermi: ' . mysqli_connect_errno() ); 
   
}
	else{ 
		echo ("Ti sei connesso al database"." ".$db); 

} 
  }

public function checklogin($username, $password){
			// Nome utente e password inviate attraverso il form 
			
			// To protect MySQL injection (more detail about MySQL injection) 
			$username = stripslashes($username); 
			$password = md5(mysql_real_escape_string($password)); 
			$username = mysql_real_escape_string($username); 
			$password = mysql_real_escape_string($password); 
			
		$sql="SELECT * FROM users WHERE user='$username' and password='$password'"; 
		var_dump($sql);//qui verifichi se la query viene scritta giusta 
		$result=mysql_query($sql); 
		// Mysql_num_row is counting table row 
		$count=mysql_num_rows($result); 
		// If result matched $username and $password, table row must be 1 row 
		if($count==1){ 
		// Register $username, $password and redirect to file "login_success.php" 
		return TRUE;
		}
		else {
			return FALSE;
		}

	}
}


?>

L'errore che mi ritorna è questo:
Notice: Undefined variable: hostname in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 17 Notice: Undefined variable: username in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 17 Notice: Undefined variable: password in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 17 Notice: Undefined variable: dbname in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 17 Warning: mysqli::mysqli(): (28000/1045): Access denied for user 'www-data'@'localhost' (using password: NO) in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 17 Non riesco a connettermi: 1045 Warning: mysql_real_escape_string(): Access denied for user 'www-data'@'localhost' (using password: NO) in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 75 Warning: mysql_real_escape_string(): A link to the server could not be established in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 75 Warning: mysql_real_escape_string(): Access denied for user 'www-data'@'localhost' (using password: NO) in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 76 Warning: mysql_real_escape_string(): A link to the server could not be established in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 76 Warning: mysql_real_escape_string(): Access denied for user 'www-data'@'localhost' (using password: NO) in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 77 Warning: mysql_real_escape_string(): A link to the server could not be established in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 77 string(49) "SELECT * FROM users WHERE user='' and password=''" Warning: mysql_query(): Access denied for user 'www-data'@'localhost' (using password: NO) in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 81 Warning: mysql_query(): A link to the server could not be established in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 81 Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 83




Riuscite a darmi un consiglio perchè è molto importante e nn riesco a trovare una soluzione.
Grazie
 
Ultima modifica di un moderatore:
Ciao e benvenuto!
Ti suggerisco di mettere il codice racchiuso nel tag PHP la prossima volta.

Quanto ai problemi in sè, ti segnalo che non stai accedendo agli oggetti della classe in modo appropriato in quanto devi usare la referenza $this, per farti un esempio:
PHP:
$this->con = new mysqli($this->hostname, $this->username, $this->password, $this->dbname);

Secondariamente, se stai usando mysqli ad oggetti e la versione di PHP su cui lavori è maggiore della 5.2.9, ti consiglio di usare sempre i metodi e le proprietà della classe mysqli anziché utilizzare lo stile procedurale per le varie funzioni, ad esempio:
PHP:
$this->con= new mysqli($this->hostname, $this->username, $this->password, $this->dbname);

if($this->con->connect_error) {
    echo 'Non riesco a connettermi: ', $this->conn->connect_error;
}else {
    echo "Ti sei connesso al database", " ", $this->dbname;
}

Altro errore è che stai usando le funzioni di real escape di mysql e non di mysqli.
Rispettando sempre lo stile ad oggetti dovresti realizzare così questi filtri:
PHP:
$username = $this->con->real_escape_string($username);

La query di verifica dell'account presenta lo stesso problema e dovresti invece scriverla così:
PHP:
$sql = "SELECT * FROM users WHERE user='$username' and password='$password'";
$result = $this->con->query($sql);
$count = $result->num_rows;

#> Ora che non ci serve più, liberiamo la memoria impiegata dalla risorsa.
$result->close();


#> Dal momento che la tua funzione ritorna true o false, puoi anche evitare l'if
#> e fare direttamente così:

return $count == 1;


Passando invece a qualche suggerimento, ti consiglio di non usare md5 per l'hashing delle password. E' un algoritmo vecchio e al giorno d'oggi fin troppo vulnerabile per quel fine, usa qualcosa di più robusto come lo sha256 (che in PHP puoi ottenere grazie alla funzione hash()).
 
Ciao e benvenuto!
Ti suggerisco di mettere il codice racchiuso nel tag PHP la prossima volta.

Quanto ai problemi in sè, ti segnalo che non stai accedendo agli oggetti della classe in modo appropriato in quanto devi usare la referenza $this, per farti un esempio:
PHP:
$this->con = new mysqli($this->hostname, $this->username, $this->password, $this->dbname);

Secondariamente, se stai usando mysqli ad oggetti e la versione di PHP su cui lavori è maggiore della 5.2.9, ti consiglio di usare sempre i metodi e le proprietà della classe mysqli anziché utilizzare lo stile procedurale per le varie funzioni, ad esempio:
PHP:
$this->con= new mysqli($this->hostname, $this->username, $this->password, $this->dbname);

if($this->con->connect_error) {
    echo 'Non riesco a connettermi: ', $this->conn->connect_error;
}else {
    echo "Ti sei connesso al database", " ", $this->dbname;
}

Altro errore è che stai usando le funzioni di real escape di mysql e non di mysqli.
Rispettando sempre lo stile ad oggetti dovresti realizzare così questi filtri:
PHP:
$username = $this->con->real_escape_string($username);

La query di verifica dell'account presenta lo stesso problema e dovresti invece scriverla così:
PHP:
$sql = "SELECT * FROM users WHERE user='$username' and password='$password'";
$result = $this->con->query($sql);
$count = $result->num_rows;

#> Ora che non ci serve più, liberiamo la memoria impiegata dalla risorsa.
$result->close();


#> Dal momento che la tua funzione ritorna true o false, puoi anche evitare l'if
#> e fare direttamente così:

return $count == 1;


Passando invece a qualche suggerimento, ti consiglio di non usare md5 per l'hashing delle password. E' un algoritmo vecchio e al giorno d'oggi fin troppo vulnerabile per quel fine, usa qualcosa di più robusto come lo sha256 (che in PHP puoi ottenere grazie alla funzione hash()).





Anzi tutto Grazie mille, però ho un problemino mi da questo errore:

Ti sei connesso al database S3654125 Notice: Trying to get property of non-object in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 80 Fatal error: Call to a member function close() on a non-object in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 83



Il problema mio è che non ho ancora ben capito come approcciarmi bene con gli oggetti puoi mica darmi un aiuto a capire meglio?

Altra cosa mi dicevi della hash come funziona,ti spiego io ho scritto funzioni per evitare inject e mi sono uscite quelle puoi delucidarmi anche su questo punt se possibile?
Grazie mille..





Il mio codice ora è questo:
PHP:
public function checklogin($username, $password){
			// Nome utente e password inviate attraverso il form 
			
			// To protect MySQL injection (more detail about MySQL injection) 
			$username =$this->con->stripslashes($username); 
			$password =$this->con->md5(mysql_real_escape_string($password));
			
			$username = $this->con->real_escape_string($username);  
			$password = $this->con->real_escape_string($password); 
			
		$sql = "SELECT * FROM users WHERE user='$username' and password='$password'";	
		
		$result = $this->con->query($sql);
		$count = $result->num_rows;

#> Ora che non ci serve più, liberiamo la memoria impiegata dalla risorsa.
		$result->close();


#> Dal momento che la tua funzione ritorna true o false, puoi anche evitare l'if
#> e fare direttamente così:

return $count == 1; 
		}

	}
 
Ultima modifica:
Anzi tutto Grazie mille, però ho un problemino mi da questo errore:

Ti sei connesso al database S3654125 Notice: Trying to get property of non-object in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 80 Fatal error: Call to a member function close() on a non-object in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 83

Se ottieni quell'errore significa che l'oggetto result non viene caricato e quindi la query molto probabilmente presenta errori, per capire cosa c'è di errato nella sintassi SQL puoi fare in questo modo:
PHP:
		$sql = "SELECT * FROM users WHERE user='$username' and password='$password'";	
		
		#> Verifichiamo che la query effettivamente riesca
		if ($result = $this->con->query($sql)) {
			$count = $result->num_rows;

			#> Ora che non ci serve più, liberiamo la memoria impiegata dalla risorsa.
			$result->close();
		}else {
			$count = 0;
			echo "Errore MySql: ", $this->conn->error;
		}


PHP:
Il problema mio è che non ho ancora ben capito come approcciarmi bene con gli oggetti puoi mica darmi un aiuto a capire meglio?

Non credo di essere capace di spiegarti la oop in poche righe di un post nel forum, ma posso linkarti una risorsa che potrebbe aiutare a farti comprendere tutto il necessario.


Altra cosa mi dicevi della hash come funziona,ti spiego io ho scritto funzioni per evitare inject e mi sono uscite quelle puoi delucidarmi anche su questo punt se possibile?
Grazie mille..

Usare il real_escape_string è sicuramente un buon modo di iniziare ma se vuoi evitare sql injection devi sicuramente usare i prepared statements.


Un ultima cosa..
PHP:
$username =$this->con->stripslashes($username);

mysqli non ha questo metodo.
 
Se ottieni quell'errore significa che l'oggetto result non viene caricato e quindi la query molto probabilmente presenta errori, per capire cosa c'è di errato nella sintassi SQL puoi fare in questo modo:
PHP:
		$sql = "SELECT * FROM users WHERE user='$username' and password='$password'";	
		
		#> Verifichiamo che la query effettivamente riesca
		if ($result = $this->con->query($sql)) {
			$count = $result->num_rows;

			#> Ora che non ci serve più, liberiamo la memoria impiegata dalla risorsa.
			$result->close();
		}else {
			$count = 0;
			echo "Errore MySql: ", $this->conn->error;
		}


PHP:
Il problema mio è che non ho ancora ben capito come approcciarmi bene con gli oggetti puoi mica darmi un aiuto a capire meglio?

Non credo di essere capace di spiegarti la oop in poche righe di un post nel forum, ma posso linkarti una risorsa che potrebbe aiutare a farti comprendere tutto il necessario.




Usare il real_escape_string è sicuramente un buon modo di iniziare ma se vuoi evitare sql injection devi sicuramente usare i prepared statements.


Un ultima cosa..
PHP:
$username =$this->con->stripslashes($username);

mysqli non ha questo metodo.



Ok leggero, pero continuano i problemi perchè mi da quest'errore:

Ti sei connesso al database S3654125 Notice: Undefined property: mysqlClass::$conn in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 86 Notice: Trying to get property of non-object in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 86 Errore MySql:


Cosa può essere con il codice che mi hai dato, lo riposto per meglio visione:

PHP:
	public function checklogin($username, $password){
			// Nome utente e password inviate attraverso il form 
			
			// To protect MySQL injection (more detail about MySQL injection) 
		//	$password =$this->con->md5(mysql_real_escape_string($password));
			
			$username = $this->con->real_escape_string($username);  
			$password = $this->con->real_escape_string($password); 
			
    $sql = "SELECT * FROM users WHERE user='$username' and password='$password'";     
         
        #> Verifichiamo che la query effettivamente riesca 
        if ($result = $this->con->query($sql)) { 
            $count = $result->num_rows; 

            #> Ora che non ci serve più, liberiamo la memoria impiegata dalla risorsa. 
            $result->close(); 
        }else { 
            $count = 0; 
            echo "Errore MySql: ". $this->conn->error; 
        }  

	
	}


Ho proprio fatto copia incolla da tuo codice però mi da quell'errore li...
Hai qualche idea?

Grazie mille e davvero importante...

altra cose funzione per evitare l'injection che non ho capito...
 
Ultima modifica di un moderatore:
Ok leggero, pero continuano i problemi perchè mi da quest'errore:

Ti sei connesso al database S3654125 Notice: Undefined property: mysqlClass::$conn in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 86 Notice: Trying to get property of non-object in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 86 Errore MySql:


Cosa può essere con il codice che mi hai dato, lo riposto per meglio visione:

PHP:
	public function checklogin($username, $password){
			// Nome utente e password inviate attraverso il form 
			
			// To protect MySQL injection (more detail about MySQL injection) 
		//	$password =$this->con->md5(mysql_real_escape_string($password));
			
			$username = $this->con->real_escape_string($username);  
			$password = $this->con->real_escape_string($password); 
			
    $sql = "SELECT * FROM users WHERE user='$username' and password='$password'";     
         
        #> Verifichiamo che la query effettivamente riesca 
        if ($result = $this->con->query($sql)) { 
            $count = $result->num_rows; 

            #> Ora che non ci serve più, liberiamo la memoria impiegata dalla risorsa. 
            $result->close(); 
        }else { 
            $count = 0; 
            echo "Errore MySql: ". $this->conn->error; 
        }  

	
	}
[/PHP ]


Ho proprio fatto copia incolla da tuo codice però mi da quell'errore li...
Hai qualche idea?

Grazie mille e davvero importante...

altra cose funzione per evitare l'injection che non ho capito...[/QUOTE]

Perchè ora la connessione va ma non mi fa la checklogin():confused:
 
ciao
a parte la semplice verifica della corrispondenza dei nomi tra la querry e i nomi dei campi, vedo che usi md5.
hai salvato le pass codificate?
 
Ad occhio, ti sei perso per strada questo:
PHP:
return $count == 1;

Quindi fammi capire non ci sono più errori, oppure gli errori che hai trascritto prima persistono ?
 
Ad occhio, ti sei perso per strada questo:
PHP:
return $count == 1;

Quindi fammi capire non ci sono più errori, oppure gli errori che hai trascritto prima persistono ?

Allora il mi codice adesso è questo:
PHP:
public function checklogin($username, $password){
			// Nome utente e password inviate attraverso il form 
			
			// To protect MySQL injection (more detail about MySQL injection) 
		//	$password =$this->con->md5(mysql_real_escape_string($password));
			
			$username = $this->con->real_escape_string($username);  
			$password = $this->con->real_escape_string($password); 
			
    $sql = "SELECT * FROM users WHERE user='$username' and password='$password'";     
         
        #> Verifichiamo che la query effettivamente riesca 
        if ($result = $this->con->query($sql)) { 
            $count = $result->num_rows; 

            #> Ora che non ci serve più, liberiamo la memoria impiegata dalla risorsa. 
            $result->close(); 
        }else { 
            $count = 0; 
            echo "Errore Connessione ";  
			
      return $count==1;
		} 

	
	}
}

Ma entra sempre nel else in quanto mi dice: " Sei connesso al database S3654125Errore di connessione"

Secondo te dove sbaglio?
 
Ad occhio, ti sei perso per strada questo:
PHP:
return $count == 1;

Quindi fammi capire non ci sono più errori, oppure gli errori che hai trascritto prima persistono ?

Ho fatto anche un controllo con isset se le variabili Post esistessero e non c'e problema li...
Il problema è nella chiamata vi metto anche il codice che riguarda questa parte....
PHP:
	include ("functions/mysqldb.php");
	
	$conn = new mysqlClass;
	$conn->connect();
	
	if(isset($_POST["username"])){ echo "controllo user andato";}//controllo che esistano serve per il debug
	if(isset($_POST["password"])){ echo "controllo pswd andato";}//controllo che esistano serve per il debug
	
	if($conn->checklogin($_POST["username"],$_POST["password"])){
			
		$_SESSION["loggedin"]=1;
		$title = "Congratulazioni!";
		$content = "sei loggato";
	}
	else {
		$title = "Errore!";
		$content = "errore nel login";
	}


Spero davvero che possiate aiutarmi perchè non trovo una soluzione:(
 
Prendi la tua query vai in phpmyadmin->sql, la incolli, sostituisci le varibabili con i valori.
Almeno controlliamo se la query è giusta
 
Prendi la tua query vai in phpmyadmin->sql, la incolli, sostituisci le varibabili con i valori.
Almeno controlliamo se la query è giusta

ho copiato solo questo
SELECT * FROM users WHERE user='PIPPO' and password='1234'

e mi dici no database selected
ho sbagliato io a copiare qualcosa o è sbagliata la query?
 
sei in local host?

prima di copiare la query devi entrare nel tuo db sulla sinistra vedrai varie voci se hai piu db e tu clicchi su quello desiderato e rifai il procedimento copiando
 
sei in local host?

prima di copiare la query devi entrare nel tuo db sulla sinistra vedrai varie voci se hai piu db e tu clicchi su quello desiderato e rifai il procedimento copiando

Si allora la query è a posto l'unico problema è che si connette fa la query ma non ritorna vero o falso quindi l'if dove vi è la chiamata non ha riscontro quindi fa sempre false e passa all'else...

Altra discorso è se il codice lo scrivo cosi:

PHP:
	public function checklogin($username, $password){
			// Nome utente e password inviate attraverso il form 
			
			// To protect MySQL injection (more detail about MySQL injection) 
		//	$password =$this->con->md5(mysql_real_escape_string($password));
			
			$username = $this->con->real_escape_string($username);  
			$password = $this->con->real_escape_string($password); 
			
    $sql = "SELECT * FROM users WHERE NICKNAME='$username' and PASSWORD='$password'";     
     
        #> Verifichiamo che la query effettivamente riesca 
        if ($result = $this->con->query($sql)) { 
            $count = $result->num_rows; 

            #> Ora che non ci serve più, liberiamo la memoria impiegata dalla risorsa. 
            $result->close(); 
			return true;
        }
        else { 
            $count = 0; 
            echo "Errore Connessione ";  
			
      return false;
		} 

	
	}


Cosi qualsiasi login mi ritorna true e non capisco il perchè sinceramente...

Riuscite a darmi delucidazioni in merito?
 
Hai sbagliato a mettere l'if. Tu metti l'if se la query si verifica e non se ritorna dei risultati.

PHP:
    public function checklogin($username, $password){ 
            // Nome utente e password inviate attraverso il form  
             
            // To protect MySQL injection (more detail about MySQL injection)  
        //    $password =$this->con->md5(mysql_real_escape_string($password)); 
             
            $username = $this->con->real_escape_string($username);   
            $password = $this->con->real_escape_string($password);  
             
    $sql = "SELECT * FROM users WHERE NICKNAME='$username' and PASSWORD='$password'";      
      
        #> Verifichiamo che la query effettivamente riesca  
      $result = $this->con->query($sql)) 
            $count = $result->num_rows;  
             if ($count != ""){
            #> Ora che non ci serve più, liberiamo la memoria impiegata dalla risorsa.  
            $result->close();  
            return true; 
        } 
        else {  
            $count = 0;  
            echo "Errore Connessione ";   
             
      return false; 
        }
 
Hai sbagliato a mettere l'if. Tu metti l'if se la query si verifica e non se ritorna dei risultati.

PHP:
    public function checklogin($username, $password){ 
            // Nome utente e password inviate attraverso il form  
             
            // To protect MySQL injection (more detail about MySQL injection)  
        //    $password =$this->con->md5(mysql_real_escape_string($password)); 
             
            $username = $this->con->real_escape_string($username);   
            $password = $this->con->real_escape_string($password);  
             
    $sql = "SELECT * FROM users WHERE NICKNAME='$username' and PASSWORD='$password'";      
      
        #> Verifichiamo che la query effettivamente riesca  
      $result = $this->con->query($sql)) 
            $count = $result->num_rows;  
             if ($count != ""){
            #> Ora che non ci serve più, liberiamo la memoria impiegata dalla risorsa.  
            $result->close();  
            return true; 
        } 
        else {  
            $count = 0;  
            echo "Errore Connessione ";   
             
      return false; 
        }

Perfetto grazie mille=)
 
Se ottieni quell'errore significa che l'oggetto result non viene caricato e quindi la query molto probabilmente presenta errori, per capire cosa c'è di errato nella sintassi SQL puoi fare in questo modo:
PHP:
		$sql = "SELECT * FROM users WHERE user='$username' and password='$password'";	
		
		#> Verifichiamo che la query effettivamente riesca
		if ($result = $this->con->query($sql)) {
			$count = $result->num_rows;

			#> Ora che non ci serve più, liberiamo la memoria impiegata dalla risorsa.
			$result->close();
		}else {
			$count = 0;
			echo "Errore MySql: ", $this->conn->error;
		}


PHP:
Il problema mio è che non ho ancora ben capito come approcciarmi bene con gli oggetti puoi mica darmi un aiuto a capire meglio?

Non credo di essere capace di spiegarti la oop in poche righe di un post nel forum, ma posso linkarti una risorsa che potrebbe aiutare a farti comprendere tutto il necessario.




Usare il real_escape_string è sicuramente un buon modo di iniziare ma se vuoi evitare sql injection devi sicuramente usare i prepared statements.


Un ultima cosa..
PHP:
$username =$this->con->stripslashes($username);

mysqli non ha questo metodo.


Ho un ultima domanda:
$count = $result->num_rows;
Questa istruzione so che è corretta ma non capisco il perchè puoi fugare il mio dubbio please:)
Grazie mille della pazienza:)
 

Discussioni simili