Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    dati di un form che non passano

    Salve, seguendo la guida di html.it sto cercando di costruire un motore di ricerca per il mio sito. Seguendo passo passo la guida però non riesco a farlo funzionare! Quello che ho creato sono 2 pagine: 1 col form e 1 con i risultati. Credo che il problema sia che la variabile "chiave" non passi ma non so come fare.

    Pagina search.php

    <?php
    //Finalmente in questa lezione sfruttiamo fino in fondo le potenzialità del database. Inseriremo un motore di ricerca che, in base alle parole
    // chiave inserite dall'utente, cercherà gli articoli che le contengono. Iniziamo come sempre craendo la pagina search.php con l'intestazione:

    include("top_foot.inc.php");
    include("config.inc.php");
    top();

    // Quindi dovremo creare un form che contenga un campo di testo per immettere le parole da cercare:
    ?>

    <form method=post action=result.php><input type=text name=chiave><input type=submit value=cerca>
    </form>

    <?
    //e infine chiudiamo la pagina:
    foot();
    ?>

    Pagina result.php

    <?php

    // A questo punto possiamo venire alla pagina result.php che avrà il compito di elaborare la stringa inserita dall'utente:

    include("top_foot.inc.php");
    include("config.inc.php");
    top();

    $db = mysql_connect($db_host, $db_user, $db_password);
    if ($db == FALSE)
    die ("Errore nella connessione. Verificare i parametri nel file config.inc.php");

    mysql_select_db($db_name, $db)
    or die ("Errore nella selezione del database. Verificare i parametri nel file config.inc.php");

    // Per prima cosa dovremo suddividere la stringa nelle chiavi da ricercare. Noi supporremo che le diverse chiavi siano suddivise da virgole.
    // Quindi le inseriremo in un array di nome $keys:


    $keys = explode (",", $chiave);

    // Tramite questa operazione abbiamo spezzato la stringa $chiave in corrispondenza di ogni virgola e inserito i frammenti
    // all'interno dell'array $keys.
    // A questo punto possiamo creare la query. In questo caso non possiamo utilizzare una semplice uguaglianza, ma dobbiamo specificare che
    // le celle devono solo contenere le parole. Vedremo quindi un nuovo metodo:

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

    // Prima di tutto abbiamo definito $query una stringa vuota. In seguito attraverso la seconda e la terza riga abbiamo indicato che vogliamo
    // manovrare un solo elemento dell'array alla volta. Avremmo potuto usare foreach e semplificare il codice, ma questa funzione esiste solo
    // a partire dalla versione 4 di Php.
    // Ogni elemento dell'array sarà quindi disponibile uno alla volta con il nome $parola. Da questa eliminiamo gli spazi a sinistra e a destra
    // tramite trim e, se la parola non è vuota, creiamo la query.
    // Tutto quello che vedete tra le virgolette, verrà aggiunto in fondo alla query già esistente.
    // Prendiamo per il momento in considerazione il caso in cui l'utente abbia immesso due sole parole chiave e vediamo quali sono le operazioni
    // che vengono compiute passo passo. Consideriamo per esempio che le parole inserite siano "articolo" e "freephp":
    // - Prima di tutto viene definita la query vuota: $query = "";
    // - Con le prime due righe si ottiene la prima parola ("articolo") all'interno di $parola
    // - Eliminiamo gli spazi alle estremità di "articolo" che in questo caso resta tale e quale
    // - Verifichiamo che $parola non sia vuota.
    // - Modifichiamo la stringa $query che diventerà "titolo LIKE '%articolo%' OR testo LIKE '%articolo%' OR autore LIKE '%articolo%' OR "
    // - Passiamo alla parola successiva, quindi $parola assume il valore "freephp".
    // - Eliminiamo gli spazi e verichiamo che non sia vuota
    // - Aggiungiamo la stringa in fondo alla query che diventa: "titolo LIKE '%articolo%' OR testo LIKE '%articolo%' OR autore LIKE '%articolo%'
    // OR titolo LIKE '%freephp%' OR testo LIKE '%freephp%' OR autore LIKE '%freephp%' OR "
    // - Le parole chiave sono finite, ma la stringa finisce ancora con un OR. Per annullare il suo effetto aggiungiamo in fondo uno 0. Avremmo
    // potuto eliminare l'OR, ma avremmo dovuto fare una serie di verifiche. Risulta invece molto più semplice e immediato usare questa scorciatoia
    // per "neutralizzare" il suo effetto senza eliminarlo.

    // Fatto tutto questo possiamo inserire la prima parte della stringa:

    $query = "SELECT id, titolo, data FROM news WHERE " . $query;

    // Quindi la stringa diventerà:
    // "SELECT id, titolo, data FROM news WHERE titolo LIKE '%articolo%' OR ... OR autore LIKE '%freephp%' OR 0"
    // Come vedete LIKE ha sostituito l'operatore di uguaglianza che abbiamo usato in tutte le altre query. Prendiamo in considerazione un singolo
    // blocco LIKE: titolo LIKE '%articolo%'
    // LIKE indica che titolo deve contenere articolo e non che deve essere uguale a titolo.
    // % all'inizio indica che prima di "articolo" possono comparire altri caratteri. Quindi "articolo" non deve necesariamente trovarsi
    // all'inizio della cella. Stessa cosa indica il simbolo % alla fine. Quindi inserendo questi due simboli abbiamo indicato di verificare
    // se la cella titolo contiene la parola "articolo" in una qualunque posizione: all'inizio, al centro o alla fine.

    // Una volta definita la query possiamo inviarla a MySQL ed elencare i risultati:

    $result = mysql_query($query, $db);
    while ($row = mysql_fetch_array($result)){
    echo "<a href=\"view.php?id=$row[id]\">" . date("j/n/y", $row[data]) . " - $row[titolo]</a>
    ";
    }

    // Infine, come sempre, chiudiamo la pagina:

    foot()

    ?>

    Mi sapete aiutare?

  2. #2
    Utente di HTML.it L'avatar di Tokai
    Registrato dal
    Aug 2004
    Messaggi
    77
    Non c'è il passaggio della variabile 'chiave', prova ad aggiungere:

    $chiave=$_POST['chiave'];

    prima di :

    $keys = explode (",", $chiave);


  3. #3
    Sì, me n'ero accorta 5 minuti dopo! Tante grazie lo stesso!

  4. #4
    anch'io uso lo stesso motore di ricerca, ma con questo ho un problema:
    ho modificato i seguenti parametri nella query:
    $query .="nome LIKE '%$parola%' OR cognome LIKE '%$parola%' OR nascita LIKE '%$parola%' OR ";
    in questo modo:
    $query .="nome LIKE '%$parola%' AND cognome LIKE '%$parola%' AND nascita LIKE '%$parola%' OR ";

    praticamente voglio una ricerca a campi obbilgatori, se lo faccio con il nome e cognome e lascio l'OR sulla data di nascita il tutto funziona, ma mi trova tutti i recordo che corrispondono alla stessa data di nascita, se metto AND anche sul parametro nascita non mi trova più niente, secondo voi come mai?
    Premetto che scrivo i dati giusti, e sono sicuro che i record ci siano.
    Ho assolutamente bisogno che questo motore di ricerca mi estragga SOLO i record che soddisfano tutte e tre le condizioni stabilite.

    A proposito, a cosa serve l'OR finale??
    Non l'ho proprio capito.
    grazie a tutti per la pazienza.
    Fare....o NON fare...non c'è tentare!
    YODA

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.