Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420

    Verifica presenza campi in DB

    Ciao a tutti;
    quando devo verificare l'esistenza su un DB di dati inseriti dall'utente (ad esempio user e password), è più conveniente tirare giù tutta la tabella e poi ciclare tramite php, o fare una query specifica cercando direttamente i dati inseriti dall'utente?
    I risultati mi sembrano equivalenti, ma in termini di prestazioni quale metodo è più efficiente?

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,448
    E' ovviamente meglio specificare i dati direttamente nella query, il risultato è lo stesso, ma le risorse impiegate sono molte meno.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Ciao, si in effetti è più logico, soprattutto immaginando tabelle molto grandi...

    Una volta effettuato il confronto in questo modo, sto cercando di verificare eventuali corrispondenze, ma ricevo un errore che non riesco ad interpretare bene:

    Codice PHP:
    $link mysql_connect("$db_host","$db_user","$db_password") or die("....");
    $db mysql_select_db("SVILUPPO") or die("....");

    $query "SELECT * FROM utenti WHERE login = '".$login."' AND password = '".$password."'";
    $risultato mysql_query("$query",$link) or die("....");

    if (
    mysql_affected_rows($risultato) > 0)  {
        echo 
    "Login effettuato";
        
    /* redirect a pagina protetta*/
    }else{
        echo 
    "User o password errati";

    Sono a livello molto didattico come vedi e ci sono un paio di cose che non mi quadrano...
    i miei dubbi sono questi:
    - Le prime due righe, sono ottimizzabili? In particolare la seconda, quella in cui seleziono il database, è normale che la variabile $db non venga più utilizzata da nessuna parte?
    - E' corretto utilizzare la funzione mysql_affected_rows per fare la verifica dell'esistenza di user e password? L'errore che ottengo è:

    "mysql_affected_rows():supplied resource is not a valid MySQL-Link resource"

    e mi da sempre "User o password errati" ma credo sia solo perchè non riesce a verificare quella condizione e quindi di default entra nel ramo else....

  4. #4
    L'errore dipende dal fatto che la query non va a buon fine. Stampa la query prima di eseguirla.
    Per verificare se vi sono risultati utilizza mysql_num_rows()
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Si in effetti a quanto pare quella funzione è valida solo per righe "modificate"; con quella che mi hai indicato funziona correttamente...

    Il resto del codice è corretto secondo te o manca ancora qualcosa?

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    In fase di registrazione ho inserito un controllo per verificare se ad esempio user ed email siano già presenti nel db:

    Codice PHP:
    $query1 ="SELECT login,email FROM utenti";
    $rs=mysql_query("$query1",$link) or die("query1 errata");

    while (
    $riga=mysql_fetch_array($rs))   {
       if (
    $riga[0] == $login)   {
          echo 
    "Nome utente già in uso";
       }elseif (
    $riga[1] == $email)  {
          echo 
    "email già registrata";
       }else{
          
    $newpassword sha1($password);
          
    $query2 "INSERT INTO utenti(login,password,email) VALUES('$login','$password','$email')";
          
    mysql_query("$query2",$link) or die("query2 errata");
          echo 
    "registrazione effettuata";
       }

    Il ciclo non funziona correttamente...
    Se utilizzo il primo user presente nel db (solo il primo), come output ottengo:

    Nome utente già in usoQuery2 errata

    Con qualunque altro user presente nel db invece ottengo solo il messaggio "Query2 errata" e me lo da perchè nel db il campo è settato come "unique" ma in pratica non mi fa i controlli dei primi 2 if.... il ciclo sembra ciclare solo una volta... :-s

  7. #7
    Mi sa che hai le idee un po' confuse! Che senso ha selezionare TUTTI i record di una tabella per poi scorrerli per verificare la presenza o meno di un particolare dato?!?!
    Devi eseguire una query in cui nella clausola WHERE metti come condizione l'username e l'email in OR e poi verificare se è stato trovato qualche record. In caso positivo l'username o l'email sono già esistenti in caso contrario no!
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  8. #8
    Utente di HTML.it L'avatar di Ranma2
    Registrato dal
    Mar 2003
    Messaggi
    2,647
    mysql_query e tutta l'estensione verrà deprecata è deprecata dalla versione 5.5.0. Visto che sei evidentemente agli inizi evita di usarla e passa a MySQLi o a PDO


    Occorrerebbe mettere un bel messaggione in testa a questo forum

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Originariamente inviato da satifal
    Mi sa che hai le idee un po' confuse! Che senso ha selezionare TUTTI i record di una tabella per poi scorrerli per verificare la presenza o meno di un particolare dato?!?!
    Devi eseguire una query in cui nella clausola WHERE metti come condizione l'username e l'email in OR e poi verificare se è stato trovato qualche record. In caso positivo l'username o l'email sono già esistenti in caso contrario no!

    Si in effetti ho rifatto lo stesso errore di inizio pagina
    Grazie

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Originariamente inviato da Ranma2
    mysql_query e tutta l'estensione verrà deprecata è deprecata dalla versione 5.5.0. Visto che sei evidentemente agli inizi evita di usarla e passa a MySQLi o a PDO

    Occorrerebbe mettere un bel messaggione in testa a questo forum
    Ciao!
    Non faccio in tempo ad imparare una cosa che viene deprecata!!
    Mi sto documentando su PDO e scopiazzando e leggendo un po' in giro, sto provando a riscrivere il codice utilizzando questa tecnica...
    Il mio scopo didattico è quello di creare un semplice sistema di registrazione/login php/MySQL:

    Codice PHP:
    $db_host "localhost";
    $db_user "root";
    $db_psw "123456";
    $db_name "SVILUPPO";

    $col "mysql:host=$db_host; dbname=$db_name";

    try {
        
    $db = new PDO($col "$db_user""$db_psw");
    }

    catch(
    PDOException $e) {                 
        echo 
    'Attenzione errore: '.$e->getMessage();

    Fin qui sembra funzionare;
    il primo dubbio che mi viene è che se elimino il blocco "catch" mi viene segnalato un errore di sintassi; è perchè ho sbagliato qualcosa o perchè è obbligatorio?


    Codice PHP:
    $sql $db->prepare('SELECT nome, cognome FROM anagrafica');
    $sql->execute(); 
    $res $sql->fetchAll(); 
    A questo punto la variabile $res dovrebbe contenere l'array di risultati, giusto? Da questo punto in poi potrei riprendere le tecniche che già conosco, ad esempio sostituendolo con:

    Codice PHP:
    while ($res $sql->fetchAll()) {
       
    istruzione
       istruzione
       istruzione

    Te lo chiedo perchè con le prime prove effettuate ho avuto dei risultati contrastanti, quindi se c'è un errore di fondo, meglio saperlo prima!
    Inoltre, ho letto che per l'esecuzione delle query è preferibile utilizzare il metodo "prepare" appunto, invece del semplice "query" perchè mette al riparo anche dall'SQL-Injection... ma in che modo?
    Il problema, l'avrai capito, è che non so programmare ad oggetti :-s quindi se per gestire la connessione tramite PDO mi bastano queste e poche altre istruzioni magari riesco a gestire, se invece questa è solo la punta dell'iceberg e c'è tanta roba ancora, mi sa che mi tocca ripiegare su mysqli....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.