Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Errore query

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,317

    Errore query

    Così la query funziona perfettamente. Se i dati sono sbagliati ( Id e PassHash ) non estrae nulla. ( mysql_num_rows non glielo permette )
    Codice PHP:
    Select u.* , g.* , v.* 
        
    From users As 
        Inner Join groups 
    As g On g.group_id u.user_group 
        
    Left Join validations As v On v.validate_uid u.user_id 
    Where u.user_id = %And u.user_pass '%s' Limit 1
    Mentre se sostituisco modifico la query nel seguente modo, se i dati sono sbagliati, mysql_num_rows non effettua il controllo correttamente e mi estrae una array "vuota".
    Codice PHP:
    Select u.* , g.* , v.* , Countmp.mp_read ) As tot_pm 
        From users 
    As 
        Inner Join groups 
    As g On g.group_id u.user_group 
        
    Left Join validations As v On v.validate_uid u.user_id 
        
    Left Join messages As mp On mp.mp_read And mp.mp_receiver_id u.user_id 
    Where u.user_id = %And u.user_pass '%s' Limit 1
    Perchè? Grazie.

  2. #2
    A parte il fatto che assegni alla funzione mysql_num_rows() abilita' che non sono sue (mysql_num_rows non glielo permette, mysql_num_rows non effettua il controllo correttamente) perche' questa funzione citata si limita solo a dare il conteggio delle righe del result set, per fare un'azione di raggruppamento (count, max, min etc.) devi raggruppare per qualcosa, cioe' usare il GROUP BY ma, in questo caso, le altre informazioni estratte sarebbero solo indicative di cosa rappresenta il count. In altre parole avresti solo una riga per ogni raggruppamento e non l'elenco completo.

    Fai due query. Con una conti e con l'altra estrai gli altri dati.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,317
    grazie per la risposta, solo che non capisco perchè risulti che la riga estrattia sia 1a dato che ( prendendo come esempio la 2° query ) i dati che inserisco per il login sono palesemente errati e di conseguenza non rispettano questa parte "Where u.user_id = %d And u.user_pass = '%s'".

    Preferirei poi non effettuare una ulteriore query, ma fare tutto con questa... è possibile? Grazie

  4. #4
    Originariamente inviato da zacca94
    grazie per la risposta, solo che non capisco perchè risulti che la riga estrattia sia 1a dato che ( prendendo come esempio la 2° query ) i dati che inserisco per il login sono palesemente errati e di conseguenza non rispettano questa parte "Where u.user_id = %d And u.user_pass = '%s'".
    di questa parte qualcosa mi sfugge ed il resto non lo capisco. Le informazioni che fornisci sono frammentarie e incomplete.

    Preferirei poi non effettuare una ulteriore query, ma fare tutto con questa... è possibile? Grazie
    Se lo scopo e' di conoscere il numero delle righe presenti per ogni condizione e la lista dei record e meglio se fai due query.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,317
    Non posso che ringraziarti ulteriormente per il tempo che mi dedichi.
    Effettivamente sono stato molto confusionario...

    Inserisco più informazioni riguardanti il mio sistema, e riformulo la domanda.

    - Clicca qui per la lista di tabelle e colonne utilizzate.

    Quindi, spiego con precisione cosa voglio fare con la seconda query:
    Codice PHP:
    Select u.* , g.* , v.* , Countmessages.mp_read ) As tot_pm
    /* Seleziona tutti i dati dell'utente, del gruppo a cui appartiene, i dati convalidazione, e conta il totale dei pm NON letti */

        
    From users As u
        
    /* Estrae i dati dell'utente */

        
    Inner Join groups As g On g.group_id u.user_group )
        
    /* Estrai il gruppo a cui appartiene l'utente, utilizzo una INNER, dato che, voglio che non estragga nulla se il gruppo non esiste */

        
    Left Join validations As v On v.validate_uid u.user_id )
        
    /* Estrae i dati di convalidazione, in genere la riga non esiste più nella tabella "validations" dopo la convalidazione, quindi utilizzo una LEFT */

        
    Left Join mp As messages On messages.mp_read And messages.mp_receiver_id u.user_id )
        
    /* Questa LEFT la utilizzo per CONTARE solo i pm che appartengono all'utente in questione e che hanno il valore nel campo mp_read uguale a 0 ( ovvero i pm che non sono stati letti ) */

    Where u.user_id = %And u.user_pass '%s' Limit 1;
    /* Infine con questa riga voglio che la query in generale venga eseguita SOLO se l'user_id e la user_pass dell'utente sono corretti */ 
    Invece WHERE non adempie alla sua funzione ( ovviamente so di essere io che sbaglia, però non capisco PERCHE' ), dato che se io eseguo questo codice, mysql_num_rows mi estrae una riga ( con elementi totalmente vuoti ), anche se l'id e la password non corrispondono a nessun utente nel database:
    Codice PHP:
            // Dati immaginari
            
    $c_Userid       9999// Questo id non è presente nel database
            
    $c_Password "password_errata"// Questa PWD è totalmente errata, non essendo neppure md5

        
    $query db_query"Select u.* , g.* , v.* , Count( mp.mp_read ) As tot_pm 
                                From nukebb_users As u 
                                Inner Join nukebb_groups As g On ( g.group_id = u.user_group ) 
                                Left Join nukebb_validations As v On ( v.validate_uid = u.user_id ) 
                                Left Join nukebb_mp As mp On ( mp.pm_read = 0 And mp.mp_receiver_id = u.user_id ) 
                            Where u.user_id = %d And u.user_password = '%s' Limit 1;" 
    , array( $c_Userid$c_Password ) , __FILE__ __LINE__ );

        
    // Verifica se i dati dei cookie sono validi
        
    if ( mysql_num_rows$query ) == )
        {
            
    $userSession fetch_array$query );
            
            
    // Se l'utente deve ancora essere convalidato non viene presa in considerazione la sua sessione
            
    if ( $userSession["validate_uid"] != "" )
            {
                unset( 
    $userSession );
            }
        }

            
    // Stampo i dati ottenuti in output:
            
    print_r$userSession ); 
    Ottengo il seguente output:
    codice:
    Array
    (
        [user_id] => 
        [user_nick] => 
        [user_pass] => 
        [user_email] => 
        [user_group] => 
        [group_id] => 
        [group_name] => 
        [group_desc] => 
        [group_image] => 
        [group_color] => 
        [validate_uid] => 
        [validate_key] => 
        [validate_day] => 
        [tot_pm] => 0
    )
    Preciso che se tolgo questa parte dalla query: , Count( mp.mp_read ) As tot_pm dalla query lasciando la LEFT, la query torna a funzionarmi bene, e il controllo tramite mysql_num_rows avviene correttamente.

    Quindi cosa sbaglio?

  6. #6
    non e' che hai migliorato la comprensione.

    La sintassi che utilizzi e' destinata ad uno sprintf() tu la dai in pasto a db_query() Cos'e' db_query? Cosa contiene questa funzione? e poi fetch_array ???

    Stai utilizzando probabilmente delle funzioni utente di cui non si conosce la struttura. Aggiungi la stampa degli errori.

    Count e' un aggregatore e quindi rende sempre una riga del result set, con valore 0 nel tuo caso. Ovviamente il result set contiene anche le altre colonne richieste (nel tuo caso vuote). Quindi significa che non ha trovato record che rispondono al where richiesto.

    Morale della favola. Fai due query. con una aggreghi il conteggio (count) e se il conteggio e' 1 o > 1 (dipende da cio' che devi fare) allora farai l'estrazione dei dati.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,317
    Scusa ma se sono un pò cocciuto. Ma preferirei capire bene per non eseguire più errori in futuro:
    Count e' un aggregatore e quindi rende sempre una riga del result set, con valore 0 nel tuo caso. Ovviamente il result set contiene anche le altre colonne richieste (nel tuo caso vuote). Quindi significa che non ha trovato record che rispondono al where richiesto.
    Quindi di conseguenza mi stai dicendo che basta un valore qualsiasi nelle righe estratte e mysql_num_rows sarà uguale a 1?

    E dato che 0 è comunque un valore... per questo stesso motivo se tolgo SOLO "count ( ... ) as ..." funziona tutto bene?

    Ho capito bene?

    Ma se il where non viene soddisfatto teoricamente non dovrebbe far "saltare" tutta la query?

    Grazie ancora.

  8. #8

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.