Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [PHP MYSQL] motore per news

    scusate, avrei un problema
    ho implementato il motore di ricerca per le NEWS che si trova sul tutorial del sito adattandolo per il mio Database di gestione Anatomia Patologica, funziona, ma si riesce solo a fare la ricerca con il parametro OR, non con quello AND, mi spiego meglio
    la query è fatta così:

    $chiave=$_POST['chiave'];
    $keys = explode (" ", $chiave);

    $query = "";
    reset ($keys);
    while (list(,$parola) = each ($keys))
    { $parola = trim($parola);
    if ($parola != "")
    $query .= "nome LIKE '%$parola%' OR cognome LIKE '%$parola%' OR nascita LIKE '%$parola%' OR ";
    }
    $query .= "0";

    $query = "SELECT * FROM cartellini WHERE " . $query;

    $result = mysql_query($query, $db);
    while ($row = mysql_fetch_array($result)){

    echo "<TR><td width=80>".$row['archivio']."</td><td width=120>[b]".$row['cognome']."</td><td width=60>[b]".$row['nome']."</td><td width=60>".$row['nascita']."</td><td width=60>".$row['datacampione']."</td><td width=80>".$row['reparto']."</td><td width=80>".$row['materiale']."</td><td width=80>".$row['tipo']."</td></tr>";
    echo "<tr><td colspan=2></td><td colspan=6>".$row['referto']."</td>";
    }

    come vedete è praticamente uguale a quella del motore di ricerca per news sul tutorial,
    io ho modificato la query in questo modo:

    $query .= "nome LIKE '%$parola%' AND cognome LIKE '%$parola%' AND nascita LIKE '%$parola%' OR ";

    con il parametro OR mi trova tutti i record, anche quelli che non mi servono, con tutti i parametri AND non mi trova più niente, ma io sono sicuro chge esistono almeno tre record di un nominativo che risponda ai tre parametri che io gli passo, questi record appaiono solo se si usa OR e fin qui tutto bene, il problema è che assieme ci sono tutti gli altri record che hanno a che fare con gli stessi parametri, tutti quelli che hanno lo stesso cognome, tutti quelli che hanno lo stesso nome, tutti quelli nati nella stessa data, un marasma, visto che ho a che fare con più di 65.000 record.
    La cosa strana è che se metto AND sul cognome, in questo modo:

    $query .= "nome LIKE '%$parola%' AND cognome LIKE '%$parola%' OR nascita LIKE '%$parola%' OR ";

    la cosa funziona, è già un passo avanti per restringere il campo, ma mi trova anche tutti gli altri nati alla stessa data di nascita, ma se metto AND anche nel terzo criterio:

    $query .= "nome LIKE '%$parola%' AND cognome LIKE '%$parola%' AND nascita = '%$parola%' OR ";

    non mi trova più niente!!

    secondo voi come mai?
    Ci sto sbattendo la testa, considerando che il database serve per gestire una piccola Anatomia Patologica del mio ospedale, vi lascio immaginare l'importanza, l'utente deve fare una ricerca con una ragionevole sicurezza di avere tutto lo storico di un paziente, senza altri record, si tenga presente che non è possibile aggiungere il codice fiscale per motivi operativi di reparto.

    Ringrazio calorosamente chiunque possa aiutarmi.
    Fare....o NON fare...non c'è tentare!
    YODA

  2. #2
    non ho guardato attentissimamente il tuo post... ma mi è balzato all'occhio l'OR finale della query... non credo che debba esserci!

  3. #3
    cercare $parola in nome e cognome è sensato....ma cercarlo anche in data non so che senso abbia.....

    se io cerco "Pippo" non mi sembra abbia senso cercarlo anche in un campo di tipo data......

    ciao

  4. #4
    Il campo OR finale serve ad annullare l'effetto della query(!!) credo di aver capito così, vi invito ad andare sulla GUIDA PRATICA PHP MYSQL, ho preso il motore di ricerca da quella guida, se notate dopo viene aggiunto il costrutto:

    $query .="0";

    Non so, io ho provato ad eliminare l'ultima parte ma non ho avuto successo.

    Comunque non capisco perchè non si possa fare una ricerca sul campo 'nascita', che è in formato testo e non data (forse dovevo dirlo subito scusate), ed è scritto così:

    23/11/1965 (...o simili)

    o qualcosa del genere, quello che volete dirmi è che il motore di ricerca è incompatibile magari con le Backslash?

    Per favore, aiutatemi!
    Fare....o NON fare...non c'è tentare!
    YODA

  5. #5
    Un'altra cosa, scusate

    è stato preparato un piccolo FORM con un campo nel quale io inserisco le tre parole per ricercare i record che voglio, nome, cognome, data di nascita, ci pensa poi il costrutto PHP a separarle (EXPLODE) e metterle in un ARRAY in modo che possano poi essere usate nella QUERY, c'è tutto nella GUIDA, non mi sono inventato praticamente niente.
    Tra l'altro ho notato che è un motore di ricerca molto usato dai neofiti di questo FORUM, mi chiedo se qualcun altro si è trovato nei miei stessi problemi.

    Grazie a tutti, rimango in attesa di risposta
    Fare....o NON fare...non c'è tentare!
    YODA

  6. #6
    per cercare nel campo data perchè non utilizzi la clausola between?
    Sono d'accordo con spyre, non ha molto senso fare una ricerca delle date con like.
    Se ti serve che la data sia esattamente uan data specifica puoi usare l' =,
    se ti serve un intervallo usa la clausola between!

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    8
    beh...cosi a colpo d'occhio... mi pare di capire... che stai cercando su ogni campo la stessa parola... AND stessa parola AND stessaparola... ovvio che non trova niente...
    con l OR è sensato... perche cerca su tutti i campi la stessa parola... e ti fa vedere le entry che ha trovato...

    poi un'altra cosa non sensata è questa nascita = '%$parola%' ...
    l'operatore % in SQL se non sbaglio va usato solo con il LIKE... cosi stai cercando qualcosa che inizia per percento e finisce per percento...
    non vorrei aver sparato troppe cavolate pero ad occhio e a reminescenze è cosi

    Enrico
    www.bugone.com

  8. #8
    negativo, ragazzi, non sto cercando una sola parola,
    il codice PHP mette i dati che scrivo nella casella del FORM, in un ARRAY, per intenderci:
    io scrivo

    GUIDO ROSSI 12/12/1978

    il codice estrapola (con la funzione EXPLODE) in un ARRAY, poi le assegna ad ogni clausola AND o OR, e fino al nome e cognome funziona tutto benissimo, mi trova tutti i GUIDO ROSSI del database, ma se metto AND sulla data di nascita non mi trova più niente
    Ed è impossibile, perchè io spono sicuro che GUIDO ROSSI nato il 12/12/1978 sia inserito 3 volte nel database, se infatti uso la clausola OR invece che AND, mi trova i tre GUIDO ROSSI nati nel 12/12/1978 ma mi trova anche gli altri sette o otto che sono nati il 12/12/1978!
    Ed è proprio quello che voglio evitare.
    A mio parere il problema è sul campo data di nascita, che è in formato testo e NON data, ma non posso modificarlo, forse il vero problema sono le Backslashes, voi che ne dite?
    Ma non è strano che con OR funzioni il tutto e con AND no?
    Hoi provato anche a togliere il simbolo "%", che dice al codice che prima o dopo la parola potrebbero esserci altri caratteri, ho provato a togliere LIKE e mettere "=", che dice al codice di cercare quella precisa parola, ma non ho ottenuto nessun risultato.

    per favore, datemi una mano!!
    Fare....o NON fare...non c'è tentare!
    YODA

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    8
    contattami in privato che ti do la mia mail e mi mandi tutto

  10. #10
    Ho letto un po' più attentamente il codice. Le cose che non mi tornano (o meglio che IMHO andrebbero fatte diversamente) sono:

    $chiave=$_POST['chiave'];
    $keys = explode (" ", $chiave);
    Non è più semplice recuperare direttamente i tre valori del form?
    $nome = $_POST[nome];
    $cognome = $_POST[cognome];
    $data = $_POST[data];

    Perchè utilizzi una sola variabile per tre campi distinti del form?

    $query = "";
    reset ($keys);
    while (list(,$parola) = each ($keys))
    { $parola = trim($parola);
    if ($parola != "")
    $query .= "nome LIKE '%$parola%' OR cognome LIKE '%$parola%' OR nascita LIKE '%$parola%' OR ";
    }
    $query .= "0";
    In pratica stai facendo un ciclo while che ad ogni iterazione di riaccoda la stringa "nome like...bal bla bla"
    Non mi sembra che sia molto sensato: secondo me ti basta una sola query fatta così:
    Codice PHP:
    $query "select *
                  from cartellini
                  where nome LIKE '%
    $nome%' OR
                           cognome LIKE '%
    $cognome%' OR
                           data between tuo_intervallo_che_ti_devi_calcolare_come_vuoi
    "
    $result mysql_query($query); 
    Comunque se l'applicazione è davvero critica e deve essere usata in un ospedale (!) ti consiglierei di farla fare a un esperto...

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.