Visualizzazione risultati 1 fino 13 di 13
Like Tree1Likes
  • 1 Post By mzanella

Discussione: query di select

  1. #1
    fabiovergotti non è connesso Utente
    Data registrazione
    18-02-2013
    Messaggi
    249

    Predefinito query di select

    Salve a tutti,
    Volevo chiedere un chiarimento ed una spiegazione

    io ho una pagina con un form con 15 campi, ma di questi 15 solo alcuni vengono compilati (è una ricerca per utente di conseguenza nella pagina troveremo tutte le colonne del database ma in realtà solo una o due vengono usate per una selezione)

    io volevo creare una query di select che relevi quali cambi sono pieni e quali vuoti e di conseguenza applichi la voce WHERE xxx='".$yyy."' solo dove il vaolere $_GET['yyy'] esiste

    come posso fare?

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Nella sua forma più semplice, costruendo la query osservando quali sono i campi validi (definiti, non nulli, non vuoti, col tipo corretto, ed eventualmente altri criteri che riterrai opportuni) del vettore $_GET ed i relativi valori:
    Codice PHP:
    $clauses = array();
    foreach(
    $_GET as $field => $value) {
    if (!empty(
    $value)) {
    $clauses[] = "$field = $value";
    }
    }


    $query = "SELECT * FROM my_table";
    if (!empty(
    $clauses)) {
    $query .= "WHERE " . implode(" AND ", $clauses);
    }
    Questa è la versione base, per darti l'idea. Per essere considerata almeno accettabile va raffinata, ad esempio controllando che i $field siano effettivamente nomi di campi, convalidando i valori $value (se sono stringhe usando real_escape_string e simili, ecc) e se poi intendi usare prepared statements (cosa da me personalmente caldeggiata), occorre apportare qualche modifica minimale.

    Ultima osservazione: nel codice proposto si assume che i criteri di ricerca siano fissati e di uguaglianza.
    Se sono almeno fissati, è abbastanza semplice esprimere la nuova clausola in funzione del campo: per quei campi in cui il criterio è di uguaglianza, si genera una stringa "$field = $value", se sono di disuguaglianza "$field <= $value" e così via.
    Se i criteri non sono fissati (ovvero: se è l'utente a scegliere una ricerca per uguaglianza, disuguaglianza, ecc.) la questione è un po' più articolata, bisogna leggere da $_GET, per ogni clausola, anche il criterio da utilizzare.

  3. #3
    fabiovergotti non è connesso Utente
    Data registrazione
    18-02-2013
    Messaggi
    249

    Predefinito

    provo subito
    grazie mille

  4. #4
    fabiovergotti non è connesso Utente
    Data registrazione
    18-02-2013
    Messaggi
    249

    Predefinito

    ok funziona però non riesco a farlo interagire con lo script sucessivo che mi estrapola i valori dal database
    ovvero:

    Codice PHP:
    if (!$result || !mysql_num_rows($result)) {
    // header('Location: login.php');


    }
    while (
    $row = mysql_fetch_array($result)) {

    // Your code here
    $nome=mysql_result($result,0,'nome');
    $cognome=mysql_result($result,0,'cognome');
    $email=mysql_result($result,0,'email');
    $n_telefono=mysql_result($result,0,'n_telefono');
    $password=mysql_result($result,0,'password');
    $tipo=mysql_result($result,0,'tipo');

    }

  5. #5
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Dovresti usare mysqli o PDO al posto di mysql, quest'ultimo è deprecato.

    Il problema qual'è esattamente? Errori durante l'esecuzione? Oppure il risultato ottenuto non corrisponde a quello atteso?
    Una volta lanciata la query, il modo in cui questa è costruita non influenza il modo in cui recuperi i dati. Se non l'hai già fatto, controlla che la query venga costruita nel modo corretto, perlomeno osservandone alcuni esempi.
    Se durante l'esecuzione della query ci sono errori, stampali anziché effettuare un re-indirizzamento, in modo da sapere cosa è successo.

    Ad ogni modo, dato che stai usando fetch_array, probabilmente ti risulterà più comodo leggere i dati in questo modo:
    Codice PHP:
    $nome = $row['nome'];
    $cognome = $row['cognome'];
    $email = $row['email'];
    $n_telefono = $row['n_telefono'];
    $password = $row['password'];
    $tipo = $row['tipo'];

  6. #6
    fabiovergotti non è connesso Utente
    Data registrazione
    18-02-2013
    Messaggi
    249

    Predefinito

    l'errore generato è il seguente:
    Codice PHP:
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /web/htdocs/www.easycomunicazione.it/home/crm/cerca_utente.php on line 292
    la riga 292 corrisponde a:
    Codice PHP:
    while ($row = mysql_fetch_array($result)) {

    L'intero codice lo ho adattato così:
    Codice PHP:
    $clauses = array();
    foreach(
    $_GET as $field => $value) {
    if (!empty(
    $value)) {
    $clauses[] = "$field = $value";
    }
    }


    $query = "SELECT * FROM CRM_clienti";
    if (!empty(
    $clauses)) {
    $query .= "WHERE " . implode(" AND ", $clauses);
    }





    $result = mysql_query("'".$query."'");


    if (!
    $result || !mysql_num_rows($result)) {
    // header('Location: login.php');


    }
    while (
    $row = mysql_fetch_array($result)) {

    // Your code here
    $nome=mysql_result($result,0,'nome');
    $cognome=mysql_result($result,0,'cognome');
    $email=mysql_result($result,0,'email');
    $n_telefono=mysql_result($result,0,'n_telefono');
    $password=mysql_result($result,0,'password');
    $tipo=mysql_result($result,0,'tipo');

    }
    funziona correttamente ed i dati vengono estrapolati dal db in maniera corretta ma viene stampato a video anche quell'errore
    Ultima modifica di fabiovergotti : 28-07-2016 alle ore 11.37.18

  7. #7
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Direi che se viene stampato un errore forse non funziona poi tanto correttamente...!

    L'errore è causato dal fatto che $result = false, ovvero la $query ha fallito nell'estrarre i dati dalla base di dati. Dovresti stampare il valore restituito da mysql_error() dopo la query per avere qualche indicazione sul problema (credo che anche stampare la query possa essere d'aiuto).

    Inoltre:
    $result = mysql_query("'".$query."'");
    query è già una stringa, non va racchiusa tra apici:
    Codice PHP:
    $result = mysql_query($query);

  8. #8
    fabiovergotti non è connesso Utente
    Data registrazione
    18-02-2013
    Messaggi
    249

    Predefinito

    eseguendo una echo di mysql_error(); mi esce questo:
    Codice:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= dfgh' at line 1
    tuttavia tale dicitura non è presente nella mia pagina 0.o

    altra cosa strana se tento di fare una echo di $result mi da un output vuoto
    Ultima modifica di fabiovergotti : 28-07-2016 alle ore 11.55.49

  9. #9
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    tuttavia tale dicitura non è presente nella mia pagina 0.o
    Ciò che è stato stampato è un pezzo della query. Questo suggerisce che la query non è stata costruita correttamente: dovresti stamparla dopo mysql_error() per capire meglio cos'è successo.

    altra cosa strana se tento di fare una echo di $result mi da un output vuoto
    Il che non è affatto strano, dato che l'interrogazione è fallita e quindi $result vale false, e stampare un valore booleano produce la stringa vuota. Se vuoi usare questo tipo di ispezione, usa var_dump($result):
    Codice PHP:
    echo "<pre>"; var_dump($result); echo "</pre>";
    .

  10. #10
    fabiovergotti non è connesso Utente
    Data registrazione
    18-02-2013
    Messaggi
    249

    Predefinito

    usato il var_dump effettivamente restituisce: bool(false)

  11. #11
    fabiovergotti non è connesso Utente
    Data registrazione
    18-02-2013
    Messaggi
    249

    Predefinito

    ok ho risolto
    c'era un errore nella quary che mi mandasti tu all'inizio

    Codice PHP:
    $clauses = array();
    foreach(
    $_GET as $field => $value) {
    if (!empty(
    $value)) {
    $clauses[] = "$field = '".$value."'";
    }
    }
    invece di

    Codice PHP:
    $clauses = array();
    foreach(
    $_GET as $field => $value) {
    if (!empty(
    $value)) {
    $clauses[] = "$field = $value";
    }
    }

    Grazie mille dell'aiuto

  12. #12
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito




    L'errore sta nel non aver convalidato i dati come suggerito: trattandosi di stringhe occorre proteggere i caratteri speciali (real_escape_string) e racchiuderle tra apici (o usare prepared statement).

    Aggiungendo sempre gli apici hai il problema opposto: i valori numerici verranno sempre convertiti in stringhe e MySQL dovrà provare a riconvertirli.
    Ultima modifica di mzanella : 28-07-2016 alle ore 12.25.25
    karl94 likes this.

  13. #13
    fabiovergotti non è connesso Utente
    Data registrazione
    18-02-2013
    Messaggi
    249

    Predefinito

    ok grazie mille risolto

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •