Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    118

    [PHP+MySql] Ricerca dati attraverso un form di ricerca

    Ho fatto un form per la ricerca interna ad un sito con i segueni campi:

    "titolo" di tipo varchar : "qui il visitatore può inserire per esempio [appartamento,villa ecc.]";

    "prezzo" di tipo decimale : "con menu a tendina dal quale il visitatore può scegliere il prezzo [per ora ho messo solo "meno di 150.000€" e "oltre 150.000€"]";

    "Mq (metri quadri)" di tipo int: "menu a tendina dal quale il visitatore può scegliere i Mq dell'immobile [per ora ho messo "meno di 150 Mq" e "oltre 150 Mq"]";

    allora per quanto riguarda il primo campo ovvero "titolo" scrivendo questo script mi cerca nella $tabella un immobile il cui titolo contiene una delle parole che il visitatore ha digitato nel campo di ricerca $stringa:

    $stringa="$_POST[stringa]";
    $sql="SELECT*FROM $tabella WHERE ";

    $lista_parole=explode(" ",$stringa);
    for($i=0;$i<count($lista_parole);$i++)
    {
    $str.="titolo LIKE '%$lista_parole[$i]%' OR ";
    }
    $str=substr($str,0,(strlen($str)-3));
    $sql.=$str." ORDER BY id";

    E fin qui tutto ok....il problema sorge con gli altri 2 campi ovvero "prezzo" e "Mq". Mi spiego meglio.

    Per quanto riguarda il campo prezzo, supponiamo di avere nel database un immobile di prezzo=160000€ e un altro di 5000€ (magari esistesse davvero ), se nel menu a tendina seleziono "oltre 150.000" stranamente me li visualizza entrambi mentre dovrebbe mostrarmi solo il primo. Se invece nel menu a tendina seleziono "meno di 150000€" non mi visualizza nessuno dei 2 mentre dovrebbe mostrarmi il 2°, ovvero quello di prezzo=5000€.
    Per quanto riguarda invece i Mq lo script presenta la stessa anomalia.

    Queste sono le righe di codice relative al "prezzo" e ai "Mq":

    $prez=$_POST[prez];
    if ($prez=="oltre"){
    $max="$prez > 150000";
    if ($prez > 150000)
    $sql.="prezzo LIKE '%$max%'";
    }
    elseif ($prez=="meno")
    {
    $meno="$prez < 150000";
    if ($prez > 150000)
    $sql.="prezzo LIKE '%$meno%'";
    }

    $mqu=$_POST[mquadri];
    if ($mqu=="max"){
    $max="$mqu>150";
    if ($mqu>150)
    $sql.="mq LIKE '%$max%'";
    }
    elseif ($mqu=="min")
    {
    $min="$mqu<150";
    if ($mqu<150)
    $sql.="mq LIKE '%$min%'";
    }

    Spero in un vostro aiuto.
    Grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    4
    Ciao.

    >for($i=0;$i<count($lista_parole);$i++) {
    > $str.="titolo LIKE '%$lista_parole[$i]%' OR ";
    >}
    i) ti suggerisco di usare l'istruzione foreach, è più comoda
    foreach($lista_parole as $parola)
    $str.="titolo LIKE '%$parola%' OR ";

    ii) è strano che $str.="titolo LIKE '%$lista_parole[$i]%' OR "; non ti dia errore,
    gli elementi di un array andrebbero incapsulati quando usati all'interno di stringhe. Percui:
    > $str.="titolo LIKE '{%$lista_parole[$i]}%' OR ";

    >$str=substr($str,0,(strlen($str)-3));
    più semplicemente
    $str=substr($str,0,-3);


    presuppongo che tu abbia valorizzato la select così:
    <option value="meno">meno di 150.000</option>
    <option value="oltre">oltre 150.000</option>

    usa l'indentramento quano scrivi codice, ti tornerà utile.

    >$prez=$_POST[prez];
    >if ($prez=="oltre") {
    > $max="$prez > 150000";
    > if ($prez > 150000)
    se arrivi qui vuol dire che
    $prez=="oltre"
    quindi non ha senso comparare una strinca con un intero

    > $sql.="prezzo LIKE '%$max%'";
    stai chiedendo al tu db ti selezionare le righe per cui
    il campo prezzo contiene al proprio interno la sottostringa $max
    prova con
    $sql.="prezzo > 150000 ";


    > }elseif ($prez=="meno") {
    > $meno="$prez < 150000";
    > if ($prez > 150000)
    > $sql.="prezzo LIKE '%$meno%'";
    >}
    come sopra




    >$mqu=$_POST[mquadri];
    >if ($mqu=="max"){
    >$max="$mqu>150";
    >if ($mqu>150)
    >$sql.="mq LIKE '%$max%'";
    >}
    >elseif ($mqu=="min")
    >{
    >$min="$mqu<150";
    >if ($mqu<150)
    >$sql.="mq LIKE '%$min%'";
    >}
    come sopra

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    118
    Ciao pizzico, grazie per aver risposto.
    Purtroppo in questo modo lo script non mi visualizza nulla sia se imposta "oltre" che se imposto "meno".

    Altre idee?

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    4
    mostrami come hai modificato lo script.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    118
    Ho modificato lo script in questo modo:

    $mqu=$_POST[mquadri];
    if ($mqu=="max"){
    $sql.="mq >150";
    }
    elseif ($mqu=="min")
    {
    $sql.="mq <150";
    }


    Lo stesso per il "prezzo"

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    118
    ho provato anche in questo modo ma non funge ugualmente:

    nell' HTML ho impostato 2 campi di testo nei quali il visitatore può inserire i valori del prezzo (prezzo da XXX a XXX);

    <?php
    include("connessione.php");
    $stringa=$_POST[stringa];
    if (!$stringa or $stringa==""){
    echo "<font face=\"arial\" size=\"2\">E' necessario specificare la/le parola/parole da cercare
    <a href=\"javascript:history.back()\">indietro</a></font>";
    exit();
    }
    $cn=mysql_connect($host,$uid,$pw);
    mysql_select_db($db,$cn);
    $sql="SELECT*FROM $tabella WHERE ";
    $lista_parole=explode(" ",$stringa);
    for($i=0;$i<count($lista_parole);$i++)
    {
    $str.="titolo LIKE '%$lista_parole[$i]%' OR ";
    }
    $str=substr($str,0,(strlen($str)-3));
    $sql.=$str." ORDER BY id";


    $prezzoDA = (preg_match( "/^(\d+),?(\d{1,2})?$/" , $_POST['prezzoDA'] )) ? $_POST['prezzoDA'] : 0;
    $prezzoA = (preg_match( "/^(\d+),?(\d{1,2})?$/" , $_POST['prezzoA'] )) ? $_POST['prezzoA'] : 0;
    if ($prezzoA > $prezzoDA) {
    $prezzoA = $prezzoDA;
    }
    if ($prezzoDA > 0 && $prezzoA > 0) {
    $sql .= " AND prezzo BETWEEN {$prezzoDA} AND {$prezzoA}";
    } else if ($prezzoDA > 0 && $prezzoA <= 0) {
    $sql .= " AND prezzo >= {$prezzoDA}";
    } else if ($prezzoDA <= 0 && $prezzoA > 0) {
    $sql .= " AND prezzo <= {$prezzoA}";
    }


    $mqu=$_POST[mquadri];
    if ($mqu=="max"){
    $sql.="mq >150";
    }
    elseif ($mqu=="min")
    {
    $sql.="mq <150";
    }

    $query=mysql_db_query($db,$sql);
    $num=mysql_num_rows($query);
    ?>

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    118
    nessuno sa dov'è che sbaglio?

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.