Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    20

    mysql e php, la query non è scritta identica

    dunque ho una query piuttosto complessa che funziona molto bene se la testo direttamente in mySql, vado subito al problema, la clausola WHERE:

    la stringa nella query è

    WHERE ristoranti_ris.idzon_ris LIKE '$var1'
    AND ristoranti_ris.idamb_ris LIKE '$var2'
    AND ristoranti_ris.idtip_ris LIKE '$var3'



    in pratica nella pagina web ho un form che invia i parametri di ricerca (metodo GET, nome variabili: zon, amb, tip) con questa stringa url
    www.dominio.it/result_all.php?zon=1&amb=4&tip=2

    Cosi compilata (con tutte le variabili) la pagina da il risultato voluto.

    Il problema è quando NON si seleziona uno o più parametri, diciamo che non viene fatta la scelta della variabile "amb", la stringa risulta
    www.dominio.it/result_all.php?zon=1&amb=&tip=2

    Se compilo la query manualmente in mySql inserendo le variabili lasciandone vuota una (o anche tutte) ho il risultato voluto, quindi ho visto che il valore 'nomevariabile=' è accettato da mySql(in pratica non considera la variabile vuota, ed è esattamente quello che cerco), testando via web però non riesco ad avere risultati, ho quindi fatto un echo della query ed ho visto che la stringa 'nomevariabile=' viene trasformata in 'nomevariabile=null',
    avendo nella query un'istruzione WERE .... LIKE mi semra che vada a cercare il termine 'null' piuttosto che ignorare quella variabile.

    In pratica non so se ho scelto la strada corretta per avere delle variabili da considerare solo se compilate, (e questo è il primo problema) ma qualora sia la strada giusta, come posso non far cercare 'null' come se fosse un valore?

    Probabilmente ho fatto un po' di confusione, semmai infamatemi e ci riprovo...

  2. #2
    se vedi la stringa con scritto NULL qualcosa l'avra' messa. Da sola non ci va.

    verifica i campi in arrivo col get. Se la variabile e' vuota la rimpiazzi con '%' oppure non scrivi la condizione vuota e migliori la query.

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    20
    infatti non capisco quando viene trasformata in 'null'...

    Utilizzo un'nterfaccia della interakt per applicare certe cose php e non riesco a trovare dove diavolo fa questa sostituzione.

    i campi li ho verificati e arrivano perfetti, se è vuoto arriva vuoto, quindi è successivamente che viene interpretato come null, inoltre se anche invio una variabile zon=% diventa zon='null'

    quando dici
    oppure non scrivi la condizione vuota e migliori la query.
    cosa intendi?

  4. #4
    controllare la condizione della variabile e se vuota ometterla dal where.... basta una if.

    ma senza codice non si puo' andare oltre a dire controlla come viene formata la query.

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

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    20
    ok, ci ho provato, volevo inserire una condizione IF come da te suggerito ma purtroppo non sono riuscito a scriverla con una sintassi corretta e trovo errori parse error.
    Ti riporto tutta la query (è il risultato di una query generata con una interfaccia (query builder di interakt) e poi modificata manualmente con i suggerimenti di questo forum per ottenere la media di alcuni valori), è un po' complessa (almeno per me) ma funziona perfettamente.
    Ora manca solo di riuscire ad inserire questi IF per ogni condizione WHERE, puoi aiutarmi?


    // begin Recordset
    $KTColParam1__rs_search_f_zon = '%';
    if (isset($_GET["zon"])) {
    $KTColParam1__rs_search_f_zon = $_GET["zon"];
    }
    $KTColParam2__rs_search_f_zon = '%';
    if (isset($_GET["amb"])) {
    $KTColParam2__rs_search_f_zon = $_GET["amb"];
    }
    $KTColParam3__rs_search_f_zon = '%';
    if (isset($_GET["tip"])) {
    $KTColParam3__rs_search_f_zon = $_GET["tip"];
    }
    $query_rs_search_f_zon = sprintf("
    SELECT ristoranti_ris.id_ris, ristoranti_ris.nome_ris, ristoranti_ris.idprv_ris, ristoranti_ris.idcom_ris, ristoranti_ris.idzon_ris, ristoranti_ris.idamb_ris, ristoranti_ris.idtip_ris, tiporistorante_tip.nome_tip, province_prv.nome_prv, comuni_com.nome_com, ristoranti_ris.indirizzo_ris, ristoranti_ris.civico_ris, ristoranti_ris.foto1_ris, menu_men.idris_men, min( menu_men.prezzo_men ) AS prezzo_min, (
    AVG( pulizia_fbk ) + AVG( accoglienza_fbk ) + AVG( profess_fbk ) + AVG( attesa_fbk ) + AVG( prezzi_fbk ) + AVG( servizi_fbk ) + AVG( foto_fbk ) + AVG( pietanze_fbk ) + AVG( bevande_fbk ) + AVG( dolci_fbk ) + AVG( caffe_fbk ) + AVG( rapp_qual_prez_fbk )
    ) /12 AS media
    FROM (
    (
    (
    (
    (
    ristoranti_ris
    LEFT JOIN tiporistorante_tip ON tiporistorante_tip.id_tip = ristoranti_ris.idtip_ris
    )
    LEFT JOIN province_prv ON province_prv.id_prv = ristoranti_ris.idprv_ris
    )
    LEFT JOIN comuni_com ON comuni_com.id_com = ristoranti_ris.idcom_ris
    )
    LEFT JOIN menu_men ON menu_men.idris_men = ristoranti_ris.id_ris
    )
    LEFT JOIN feedback_fbk ON feedback_fbk.idris_fbk = ristoranti_ris.id_ris
    AND feedback_fbk.mostra_fbk =1
    )
    WHERE
    ristoranti_ris.idzon_ris LIKE '%s'
    AND ristoranti_ris.idamb_ris LIKE '%s'
    AND ristoranti_ris.idtip_ris LIKE '%s'

    AND menu_men.num_men!=0
    GROUP BY ristoranti_ris.id_ris, ristoranti_ris.nome_ris, ristoranti_ris.idprv_ris, ristoranti_ris.idcom_ris, ristoranti_ris.idzon_ris, ristoranti_ris.idamb_ris, ristoranti_ris.idtip_ris, tiporistorante_tip.nome_tip, province_prv.nome_prv, comuni_com.nome_com, ristoranti_ris.indirizzo_ris, ristoranti_ris.civico_ris, ristoranti_ris.foto1_ris, menu_men.idris_men
    ORDER BY ristoranti_ris.nome_ris ASC", GetSQLValueString($KTColParam1__rs_search_f_zon, "int"),GetSQLValueString($KTColParam2__rs_search_f _zon, "int"),GetSQLValueString($KTColParam3__rs_search_f _zon, "int"));
    $rs_search_f_zon = $rsRistoworld->SelectLimit($query_rs_search_f_zon) or die($rsRistoworld->ErrorMsg());
    $totalRows_rs_search_f_zon = $rs_search_f_zon->RecordCount();
    // end Recordset

  6. #6
    stampa la variabile che formi con sprintf.

    una osservazione potrebbe essere nell'uso dell'ISSET(). Se la variabile viene definita ma vuota ISSET() rende TRUE. Potresti usare !EMPTY() oppure verificare che non sia vuota.
    Codice PHP:
    // begin Recordset
    if (isset($_GET["zon"]) AND $_GET["zon"] != '' ) {
    $KTColParam1__rs_search_f_zon $_GET["zon"];
    } else { 
    $KTColParam1__rs_search_f_zon '%';  }

    //oppure
     
    // begin Recordset
    if (!empty($_GET["zon"]) ) {
    $KTColParam1__rs_search_f_zon $_GET["zon"];
    } else { 
    $KTColParam1__rs_search_f_zon '%';  } 
    guarda il manuale come si comporta EMPTY() potrebbe non fare al caso tuo se passi numeri. Ma se passi numeri che fa quella funzione che usi nello sprintf?

    GetSQLValueString($KTColParam1__rs_search_f_zon, "int")

    che vuol dire quel valore "int che passi? che deve essere un intero???? se si '%' non e' un intero ma un carattere stringa come d'altronde chiedi con '%s' allo sprintf. Potrebbe essere in quella funzione che viene messo il NULL che lamenti. '%' non e un numero e quindi ci infila un NULL....

    Ma e' pura presunzione (nel senso di presumere) visto che la funzione non la conosco.

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

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    20
    in effetti o passo niente o passo numeri.
    Quella funzione di cui parli la inserisce l'interfaccia quando creo la query e non so bene cosa sia, in ogni caso ho provato a cambiare 'int' con 'text' e a quel punto se passo tutte le variabili vuote estrae tutte le righe (e andrebbe benissimo), il problema è che non accetta più i numeri, ovvero smette di funzionare non appena gli faccio arrivare una o più variabili(che appunto sono numeri)...
    Purtroppo io ho dei grossi limiti e non posso fare altro che tentare di passare al forum più notizie possibili alla ricerca di una soluzione.

    ti chiedo ignorantemente: è possibile con un IF dire alla query "se c'è la variabile usala altrimenti salta questa condizione WHERE"?
    In pratica se il valore URL (GET) tip invece di essere '' (?tip=&altravariabile....) lo omettessi direttamente dal form (se non c'è una scelta non lo passo proprio) a quel punto dovremmo preoccuparci di ridurre le condizioni WHERE a quelle che realmente vengono passate...o no?
    scusami per il livello di "ignoranza"...

  8. #8
    nel tuo caso la palla al piede e' sprintf() ... proprio mi sfugge perche' usarlo per valorizzare le variabili.

    per esempio:
    Codice PHP:
    // begin Recordset
    if (isset($_GET["zon"]) AND $_GET["zon"] != '' ) {
    $KTColParam1__rs_search_f_zon $_GET["zon"];
    $valore1 GetSQLValueString($KTColParam1__rs_search_f_zon"int"
    } else { 
          
    $KTColParam1__rs_search_f_zon '%';  
          
    $valore1 GetSQLValueString($KTColParam1__rs_search_f_zon"text"


    // ripeti per gli altri due valori e poi il where:

    WHERE
    ristoranti_ris
    .idzon_ris LIKE '$valore1'
    AND ristoranti_ris.idamb_ris LIKE '$valore2'
    AND ristoranti_ris.idtip_ris LIKE '$valore3' 
    lasciando perdere lo sprintf che ti fa solo casino mentre tu il contenuto delle variabili lo hai gia' verificato con la funzione.

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

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    20
    purtroppo l'interfaccia che crea la query genera lo sprintf (sempre, qualunque query si costruisca, anche la più semplice) probabilmente è stato scelto di usare un sistema generico che valga per la maggioranza dei casi, anche se magari con funzioni talvolta inutili.
    I problemi infatti arrivano quando si inizia a modificare manualmente.
    Comunque vado ad applicare le modifiche da te suggerite, ti tengo aggiornato.
    Grazie

  10. #10
    Originariamente inviato da fastmax
    purtroppo l'interfaccia che crea la query genera lo sprintf (sempre, qualunque query si costruisca, anche la più semplice) probabilmente è stato scelto di usare un sistema generico che valga per la maggioranza dei casi, anche se magari con funzioni talvolta inutili.
    I problemi infatti arrivano quando si inizia a modificare manualmente.
    Comunque vado ad applicare le modifiche da te suggerite, ti tengo aggiornato.
    Grazie
    le modifiche che ho proposto prima sarebbero alternative all'uso di sprintf.

    il problema tuo, mi pare di capire, e' che se non ci sono valori nella variabile passata con get, dovresti mettere LIKE '%' e questo dovrebbe essere una stringa sia per la funzione di controllo sia per sprintf ('%s').

    Se invece hai valori questo valore e' un numero che deve essere passato alla funzione con 'int' e prelevato da sprintf con '%d'

    Quindi la if deve tenere in considerazione sia la composizione della variabile sia il formato da passare allo sprintf nel where.

    ecco perche' suggerivo di eliminare sprintf().

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