View Full Version : [PHP][Mysql]La query non dà risultati anche se li ha
Mattyfog
31-10-2010, 14:34
Salve!
Ho un problemino nell'eseguire una query. La faccenda è curiosa perchè se eseguo la query su phpmyadmin essa da un risultato mentre con il mio script php no. :mbe: :muro:
Dunque la query è la seguente, ma credo che il problema sia da ricercare nella mia classe: SELECT * FROM cms_user WHERE username="super administrator" AND password="<codice hash, o come diamine si chiama>".
La classe:
<?php
$mysqli;
class Database {
//impostazioni
private $nomeutente = "root";
private $password = "";
private $host = "127.0.0.1";
private $database = "mattyfog_cms";
private $prefisso = "cms_";
private $mysqli;
//fine impostazioni
public function Connetti() {
$this->mysqli = new mysqli($this->host, $this->nomeutente, $this->password, $this->database);
if (mysqli_connect_errno())
{
$this->mysqli = new mysqli($this->host, $this->nomeutente, $this->password, $this->database);
if (mysqli_connect_errno())
{
echo "Errore durante la connessione al DBMS: ".mysqli_connect_error();
exit();
}
}
}
public function Chiudi() {
$this->mysqli->close();
}
public function Query($query) {
/*i vari echo sono stati inseriti per effettuare dei test, ad ogni modo viene stampato il testo '$result è diverso da null'*/
$result = $this->mysqli->query($query);
echo '$this->mysqli->affected_rows:'.$this->mysqli->affected_rows;
if($this->mysqli->affected_rows > 0) {
echo'$result è diverso da null';
return $result->fetch_array(MYSQLI_BOTH);
}
else {
echo'$result è uguale a null';
return null;
}
}[
}
?>
Grazie! :)
Mattyfog
01-11-2010, 18:31
Ragas sto impazzendo! Ci dev'essere dietro la classica svista...
Ciao, da questo
$result->fetch_array(MYSQLI_BOTH);
Cosa ti aspetti di ottenere?
Mattyfog
02-11-2010, 12:49
Un array contente i risultati e che ha per indici sia i numeri dei campi sia il nome del campi?
Con altre query funziona perfettamente, solo una query non funziona, ma ripeto tale query che non dà risultati con la mia classe, in phpmyadmin funziona e sono sicuro che la query che passo alla classe non contenga errori e che sia la stessa che ho inserito in phpmyadmin.
In ogni caso quando eseguo la quey con cui ho il problema la mia classa ritorna sempre null. La query è: SELECT * FROM cms_user WHERE username="nomeutente" AND password="5f4dcc3b5aa765d61d8327deb882cf99" , ma ripeto su phpmyadmin essa ha dei risultati.
Perchè non va?
Ti torna solo un record se lo usi così, e non credo sia quello che tu voglia visto che è alquanto inutile.
Mattyfog
02-11-2010, 19:53
Ti riferisci alla query o alla classe?
Se è la query: la query deve ritornare solo un record.
Se è la classe: perchè dovrebbe tornarmi solo un record? non dovrebbe ritornarmi l'array di record? come risolvo?
Ti riferisci alla query o alla classe?
Se è la query: la query deve ritornare solo un record.
Se è la classe: perchè dovrebbe tornarmi solo un record? non dovrebbe ritornarmi l'array di record? come risolvo?
Alla funzione che hai fatto.
Ti torna solo il primo record della query, perché $result lo devi ciclare per prendere tutti i record:
while($row=$result->fetch_array()){
//usi $row che rappresenta solo un record
}
In questo modo ottieni tutti record interessati, e per ogni record tiri fuori una array per i campi.
Mattyfog
02-11-2010, 20:35
Quindi restituisce l'array da ciclare, cosa ho detto di sbagliato?
Però il problema, non so se l'ho detto sopra è un altro:
public function Query($query) {
/*i vari echo sono stati inseriti per effettuare dei test, ad ogni modo viene stampato il testo '$result è diverso da null'*/
$result = $this->mysqli->query($query);
echo '$this->mysqli->affected_rows:'.$this->mysqli->affected_rows;
if($this->mysqli->affected_rows > 0) questa condizione non si verifica perchè mysqli->affected_rows risulta uguale a -1{
echo'$result è diverso da null';
return $result->fetch_array(MYSQLI_BOTH);
}
else {
echo'$result è uguale a null';
return null;
}
}[
Quindi restituisce l'array da ciclare, cosa ho detto di sbagliato?
Però il problema, non so se l'ho detto sopra è un altro:
public function Query($query) {
/*i vari echo sono stati inseriti per effettuare dei test, ad ogni modo viene stampato il testo '$result è diverso da null'*/
$result = $this->mysqli->query($query);
echo '$this->mysqli->affected_rows:'.$this->mysqli->affected_rows;
if($this->mysqli->affected_rows > 0) questa condizione non si verifica perchè mysqli->affected_rows risulta uguale a -1{
echo'$result è diverso da null';
return $result->fetch_array(MYSQLI_BOTH);
}
else {
echo'$result è uguale a null';
return null;
}
}[
NO!, Ti torna il primo record se fai così, controlla bene.
Si il problema è un altro, ma in tanto risolvi anche quello, per l'altro problema non saprei cosa dirti, dici che la query funziona su phpmyadmin, ma nel tuo progetto no, ora le query che fai pensi siano identiche ma in realtà son diverese, o magari non ti stai connettendo allo stesso db, o tanto altro che mi è difficile verificare da qui :p
Mattyfog
02-11-2010, 20:38
Ma il punto è che this->mysqli->affected_rows è uguale a -1 anche se ci dovrebbero essere risultati.
Comunque $result->fetch_array(MYSQLI_BOTH) l'ho trattato come un array senza problemi.
Ma il punto è che this->mysqli->affected_rows è uguale a -1 anche se ci dovrebbero essere risultati.
Comunque $result->fetch_array(MYSQLI_BOTH) l'ho trattato come un array senza problemi.
E' un array, ma quell'array contiene dei campi, i campi del tuo db, ma relativi al primo record che ottieni dalla query.
Mattyfog
02-11-2010, 20:41
Ok grazie capito! Controllerò!
Però ripeto il problema non è quello! Il problema è che non sono soddisfatte le condizioni del primo null anche se dovrebbero! Perchè $result è uguale a -1!
Ok grazie capito! Controllerò!
Però ripeto il problema non è quello! Il problema è che non sono soddisfatte le condizioni del primo null anche se dovrebbero! Perchè $result è uguale a -1!
Fai una cosa, fai un echo della query che gli passi, così vediamo com'è in realtà.
Altre query hai detto che invece funzionano vero?
Mattyfog
02-11-2010, 20:44
Altre query funzionano e il metodo dell'echo l'ho già usato. La query che mi ha stampato l'echo ho provato ad eseguirla su phpmyadmin e dà risultati.
Mattyfog
02-11-2010, 20:50
Aspetta! Forse sono sparite delle virgolette che orima c'erano! Mmmm ora controllo che stupidaggine ho fatto.
Mattyfog
02-11-2010, 20:54
Noooooo! Non ci credo! Quando avevo corretto il codice avevo corretto quello che stampava l'echo e non quello che creava la query. Questo mi ha insegnato che la prossima volta prima salvo la query in una variabile poi stampo la variabile, non con cose come queste:
echo 'SELECT * FROM cms_user WHERE username="'.$_POST['username'].'" AND password="'.md5($_POST['password']).'"';
$user_temp = $database->Query('SELECT * FROM cms_user WHERE username="'.$_POST['username'].'" AND password="'.md5($_POST['password']).'"');
Beh almeno è risolto :)
E in più ho scoperto l'errore che restituisce solo un record.
Senti, non c'è un modo per far si che la query restituisca tutti i record senza usare cicli ma che salvi tutto in un bell'array?
Vedi mistero risolto :asd:
No non c'è, sia fetch_array che fetch_object ti tornano qualocosa di relativo ad un solo record alla volta, ti consiglio comunque di ritornare direttamente $result dalla tua funzione e poi fare il fetch fuori.
Fai una cosa del genere ad esempio:
public function Query($query) {
return $this->mysqli->query($query);
}
Altro consiglio è di utilizzare una classettina che fa già quello che stai cercando di fare: PDO (http://php.net/manual/en/book.pdo.php)
Mattyfog
02-11-2010, 21:14
Naa voglio usare la mia di classe, così fatico di più anche se mi sa che soprattutto all'inizio perderò in sicurezza :asd:
Comunque credo che genererò un array e farò ritornare quello, performance totali permettendo ovviamente.
Naa voglio usare la mia di classe, così fatico di più anche se mi sa che soprattutto all'inizio perderò in sicurezza :asd:
Comunque credo che genererò un array e farò ritornare quello, performance totali permettendo ovviamente.
Non ha senso perchè devi cicliare due volte l'intero risultato della query, una volta per creare l'array e una per usare l'array. Considera che di solito un databse si usa per contenere molti dati, pensa se devi applicare il tuo metodo ad una query che ti torna 100000 record(per dire)
Non capisco perchè non vuoi usare il fetch come si dovrebbe... ed è anche molto più comodo di come vorresti fare tu.
Mattyfog
02-11-2010, 21:22
Si effettivamente hai ragione :D
Giusto per studiare un po' di sicurezza, oltre alla sql injection quali sono gli attacchi più frequenti?
In linea di massima direi che per ora ti basta evitare l'sql injection.
Magari se non l'hai già letta leggi dai un'occhiata alla piccola guida su html.it (http://php.html.it/guide/leggi/121/guida-sicurezza-di-php/) e poi interessante anche questo (http://phpsec.org/projects/guide/)
Mattyfog
02-11-2010, 21:31
Stavo proprio leggendo quella di html.it !
Ma per evitare l'sql injection non c'è un meotod generale vero? Devo per forza controllare tutte le volte i parametri al momento della formazione della query, giusto?
Stavo proprio leggendo quella di html.it !
Ma per evitare l'sql injection non c'è un meotod generale vero? Devo per forza controllare tutte le volte i parametri al momento della formazione della query, giusto?
Per pulire i dati ci sono delle funzioni generiche di php tipo mysql_escape_string, addslashes e altre che dovresti guardarti sulle reference (http://www.php.net/manual/en/funcref.php).
Per forzare il tipo di dato invece va fatto su misura, magari fai una bella classe, riutilizzabile, che ti faccia i controlli in base al tipo di dato che desideri.
Mattyfog
02-11-2010, 21:38
Capito ;)
Quindi c'è un po' da studiare!
Ma anche se non sono frequenti e magari sono tecniche molto più difficili che altre tecniche ci sono per hackerare un sito?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.