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

    ricerca nel database 2/2

    Buona domenica a tutti!

    Oggi mi trovo a lavorare su un motore di ricerca per un db in mysql. Ho una tabella con 6 colonne e un form con 6 campi di testo.Se l'utente digita un autore nel campo autore la ricerca darà come risultato la lista dei libri con quell'autore. Se uno cerca l'autore e il prezzo in euro dovrà trovargli solo i libri con quell'autore e quel prezzo. Spero di essermi spiagato bene .

    Ho provato a buttare giù uno script ma non funziona:

    <html>
    <body>
    <form name="form" action="searche.php" method="post">
    Argomento:<input type="text" name="argomento" size="22"/>

    Autore:<input type="text" name="autore" size="22"/>

    Editore:<input type="text" name="editore" size="22"/>

    Luogo/anno:<input type="text" name="luogo" size="22"/>

    Legatura:<input type="text" name="legatura" size="22"/>

    Euro:<input type="text" name="euro" size="22"/>


    <input type="submit" name="Submit" value="Cerca"/><input type="reset" name="reset" value="Formatta campi"/>
    </form>


    <?php

    $argomento=$_POST['argomento'] ;
    $autore=$_POST['autore'] ;
    $editore=$_POST['editore'] ;
    $luogo=$_POST['luogo'] ;
    $legatura=$_POST['legatura'] ;
    $luogo=$_POST['euro'] ;

    if($argomento==true){$arg="argomento=$argomento AND ";}
    else {$arg="";}

    if($autore==true){$au="autore=$autore AND ";}
    else {$au="";}

    if($editore==true){$ed="editore=$editore AND ";}
    else {$ed="";}

    if($luogo==true){$lu="luogo=$luogo AND ";}
    else {$lu="";}

    if($legatura==true){$leg="legatura=$legatura AND ";}
    else {$leg="";}

    if($euro==true){$eu="euro=$euro";}
    else {$eu="";}


    $cerca= $arg.$au.$ed.$lu.$leg.$eu;

    $db = mysql_connect("friend","root","pinoto") or die ("Impossibile connettersi al Database");

    mysql_select_db("libri") or die("Impossibile selezionare il Database");

    $sql = mysql_query("SELECT * FROM dati WHERE ($cerca)",$db);

    while($eccolo = mysql_fetch_array($sql))
    {echo "Autore:".$eccolo['autore']."
    Argomento:".$eccolo['argomento']."
    Editore:".$eccolo['editore']."
    Legatura:".$eccolo['legatura']."
    Luogo/anno:".$eccolo['luogo']."
    Euro:".$eccolo['euro']."
    ";
    }


    ?>

    </body>
    </html>

    L'alternativa è uno switch o un if ma il prblema è che su 6 campi sono 64 possibilità diverse e fare 64 if o 64 condizioni switch tempo rallenti lo script.Forse si può trovare un modo con un ciclo ma non mi viene in mente nulla.Qualcuno ha idee?
    Ringrazio in anticipo e buona domenica a tutti!

  2. #2
    ho fatto qualche passo avanti...

    <html>
    <body>
    <form name="form" action="searchf.php" method="post">
    Argomento:<input type="text" name="argomento" size="22"/>

    Autore:<input type="text" name="autore" size="22"/>

    Editore:<input type="text" name="editore" size="22"/>

    Luogo/anno:<input type="text" name="luogo" size="22"/>

    Legatura:<input type="text" name="legatura" size="22"/>

    Euro:<input type="text" name="euro" size="22"/>


    <input type="submit" name="Submit" value="Cerca"/><input type="reset" name="reset" value="Formatta campi"/>
    </form>


    <?php

    $argomento=$_POST['argomento'] ;
    $autore=$_POST['autore'] ;
    $editore=$_POST['editore'] ;
    $luogo=$_POST['luogo'] ;
    $legatura=$_POST['legatura'] ;
    $euro=$_POST['euro'] ;

    if($argomento==true){$arg="argomento=$argomento";}
    else {$arg="";}

    if($autore==true){ $au=" AND autore=$autore";}
    else {$au="";}

    if($editore==true){$ed=" AND editore=$editore";}
    else {$ed="";}

    if($luogo==true){$lu=" AND luogo=$luogo";}
    else {$lu="";}

    if($legatura==true){$leg=" AND legatura=$legatura";}
    else {$leg="";}

    if($euro==true){$eu=" AND euro=$euro";}
    else {$eu="";}


    $cerca= "($arg.$au.$ed.$lu.$leg.$eu)";

    $db = mysql_connect("friend","root","pinoto") or die ("Impossibile connettersi al Database");

    mysql_select_db("libri") or die("Impossibile selezionare il Database");

    $sql = mysql_query("SELECT * FROM dati WHERE '$cerca'",$db);

    while($eccolo = mysql_fetch_row($sql))

    {echo "Autore:".$eccolo[1]."
    Argomento:".$eccolo[2]."
    Editore:".$eccolo[3]."
    Legatura:".$eccolo[4]."
    Luogo/anno:".$eccolo[5]."
    Euro:".$eccolo[6]."
    ";
    }


    ?>

    </body>
    </html>

    Così non mi da errori ma non mi da neanche l'output...ho notato che se nella query scrivo $cerca mi da errore ma con '$cerca' non mi da errore ed in entrambi casi echo non printa nulla a monitor...continuo a provare se qualcuno ha suggerimenti sono ben accetti

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    codice:
    <?php
      // Creazione dinamica della clausola WHERE
    $whereclause = "";
    if ($_GET['inforequest']=="true") {
      foreach($_POST as $campo => $valore) {
        if ($valore != "") {
    	  $whereclause .= $campo." = '".$valore."' AND ";
    	}
      }
      if (strlen($whereclause) >= 4) { //almeno un "AND " è stato scritto.
        $whereclause = substr($whereclause, 0, strlen($whereclause)-4);
        echo("Clausola WHERE: ".$whereclause);
      }
    }
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>Esempio per HTML.IT</title>
    </head>
    
    <body>
    <form name="form1" method="post" action="queryfields.php?inforequest=true">
      <h2>Ricerca nel database:</h2>
      
    
    Autore:
        <input name="autore" type="text" />
        
    
        Titolo :
          <input name="titolo" type="text" />
        
    
        Editore:
        <input name="editore" type="text" />
        
    
      Anno:
      <input name="anno" type="text" />
      
    
      Prezzo: 
      <input name="prezzo" type="text" />
      <input type="submit" value="Submit">
    </p>
    </form>
    </body>
    </html>
    in $whereclause ti trovi solo la possibile clausola WHERE... butta via tutto l'output che ho messo io (solo a scopo dimostrativo) e costruisci la tua query... qualcosa del genere

    codice:
    $sql = "SELECT * FROM dati WHERE $whereclause";
    PS: in fase di debug conviene sempre fare gli echo di tutte le variabili che generi/utilizzi per verificare esattamente che cosa si sta "trasmettendo" realmente
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  4. #4
    wow...è un ottima idea ho qualche dubbio sul funzionamento del terzo if ma prima provo a metterlo giù semmai ti chiedo dopo, è davvero una buona idea grazie!

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    il terzo if... intendi dire quello
    codice:
    if (strlen($whereclause) >= 4) {
    in verità è un in più che ho lasciato dal debug. Puoi anche far eseguire sempre e comunque la substring (questo perché se trova una condizione da aggiungere alla clausola WHERE, verrà aggiunto
    codice:
    campo = 'valore' AND
    e quindi all'ultima clausola aggiunta ci sarà un "AND " finale di troppo. Prendendone la sottostringa fino al 4°ultimo carattere elimini l'AND di troppo.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    ok credo di aver capito...lo script ho provato e funziona

    posto quello definitivo

    <?php
    // Creazione dinamica della clausola WHERE
    $whereclause = "";
    if ($_GET['inforequest']=="true") {
    foreach($_POST as $campo => $valore) {
    if ($valore != "") {
    $whereclause .= $campo." = '".$valore."' AND ";
    }
    }
    if (strlen($whereclause) >= 4) { //almeno un "AND " è stato scritto.
    $whereclause = substr($whereclause, 0, strlen($whereclause)-4);
    $db = mysql_connect("friend","root","pinoto") or die ("Impossibile connettersi al Database");

    mysql_select_db("libri") or die("Impossibile selezionare il Database");

    $sql = mysql_query("SELECT * FROM dati WHERE $whereclause",$db);

    echo"<table><tr><td>Autore</td><td>Argomento</td><td>Editore</td><td>Legatura</td><td>Luogo/anno</td><td>Euro</td>";

    while($eccolo = mysql_fetch_array($sql))

    {echo "<tr><td>".$eccolo['autore']."</td><td>".$eccolo['argomento']."</td><td>".$eccolo['editore']."</td><td>".$eccolo['legatura']."</td><td>".$eccolo['luogo']."</td><td>".$eccolo['euro']."</td><td></tr>";

    }

    echo "</table>";
    }
    }
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    </head>

    <body>
    <form name="form1" method="post" action="searchh.php?inforequest=true">
    <h2>Ricerca nel database:</h2>


    Autore:
    <input name="autore" type="text" />


    Titolo :
    <input name="titolo" type="text" />


    Editore:
    <input name="editore" type="text" />


    Luogo/Anno:
    <input name="luogo" type="text" />


    Argomento:
    <input name="argomento" type="text" />


    Legatura:
    <input name="legatura" type="text" />


    Prezzo:
    <input name="euro" type="text" />
    <input type="submit" value="Submit">
    </p>
    </form>
    </body>
    </html>

    Ho solo un dubbio, ho visto che nel tuo esempio ci sono 4 campi nel mio 6, devo cambiare

    if (strlen($whereclause) >= 4) con if (strlen($whereclause) >= 6) ?

    Con 6 campi dovrebbero esserci al massimo 5 AND. E' solo un dubbio per essere certo di aver capito come funziona.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    No, non devi cambiare niente.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  8. #8
    Ok capito tutto.Grazie mille per l'aiuto!

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.