Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Problema form php

  1. #1

    Problema form php

    Ciao ragazzi, spero che qualcuno di voi possa darmi una mano!

    Allora, ho un'agenzia immobiliare e volevo provare a costruire un piccolo motore di ricerca di modo che l'utente che seleziona i vari campi del form, trovi gli immobili che corrispondano al profilo ricercato.

    Ho già creato il db e la tabella con gli immobili sullo spazio web mysql fornito dal mio provider, ho già creato il form e il programma. Il problema è questo: quando l'utente seleziona tutti i campi, il programma restituisce gli immobili cercati. Quando si omette anche un campo solo, ecco che non trova niente .

    Chiedo il vostro aiuto per sapere se qualcuno sa come risolvere questo problema... vi posto il codice del form ed il codice del programma php. Dovrei operare con almeno 10 campi, ma per semplicità li ho ridotti a due:

    - FORM -

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">

    <head>
    <meta http-equiv="Content-Language" content="it" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Ricerca immobile</title>
    </head>

    <body>

    <form method="post" action="search.php">
    Tipologia: <select name="Tipologia">
    <option selected="selected" value="">-- Qualsiasi --</option>
    <option>Appartamento</option>
    <option>Semi indipendente</option>
    </select>

    Zona:
    <select name="Zona">
    <option selected="selected" value="">-- Qualsiasi --</option>
    <option>Cinquale</option>
    <option>Vittoria Apuana</option>
    </select>

    <input name="Submit1" type="submit" value="Ricerca immobili" />
    <input name="Reset1" type="reset" value="Cancella tutto" /></form>

    </body>

    </html>
    -----------------------------
    - PROGRAMMA SEARCH -

    <?php

    $db_username = 'XxX';
    $db_password = 'XxX';
    $db_host = 'XxX';

    $link = @mysql_connect("$db_host", "$db_username", "$db_password") or die ("Errore di connessione: " . mysql_error());
    $dbw = mysql_select_db("XxX") or die ("Errore di selezione database: " . mysql_error());

    $tipologia = $_POST['Tipologia'];
    $zona = $_POST['Zona'];
    $strsql = mysql_query("
    SELECT rif, descrizione FROM dbimmobili WHERE
    tipologia='$tipologia'
    AND zona='$zona'
    ");

    echo "
    <table border>
    <tr><th colspan='3'>Immobili trovati:</tr>
    <tr><th>RIF<th>Descrizione<th></tr>
    ";
    while ($riga = mysql_fetch_array($strsql)){
    echo "<tr><td>$riga[0]<td>$riga[1]<td>$riga[2]";

    }
    echo "</table>";

    mysql_close($link);

    ?>

    Io credo che basta inserire un IF $tipologia ='' allora $tipologia = [tutti i valori contenuti nel campo del form 'Tipologia'], però nn ho idea se è giusto e come impostarlo... spero che qualcuno abbia le idee più chiare di me !! Grazie in anticipo a tutti .

  2. #2
    Nessuno nessuno??

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    21

    magari...

    ciao, non sono un grande esperto ma credo che il problema sia che nella query che hai compilato tutti i campi sono contemplati con l'operatore "AND"
    WHERE
    tipologia='$tipologia'
    AND zona='$zona'
    in questo la query restituirà i valori che soddisfano le condizioni di uguaglianza e quindi tutti i record all'interno del DB per cui tipologia e zona (insieme!) siano vuoti, che è diverso da interrogare il DB trascurandoi i due campi.
    La soluzione sarebbe di creare la query dinamcamente secondo i campi selezionati.
    _libero_arbitrio_

  4. #4
    Ciao Ma_Dom, intanto grazie per la risposta.

    Il punto è che quelle devono essere due variabili verificate contemporaneamente, su questo non posso farci niente.

    Il problema è come dire al programma che quando, ad esempio, tipologia è vuota (empty($tipologia)) allora il campo tipologia non deve essere preso in considerazione e guardare gli altri campi...

    Non è che avete qualche idea??

  5. #5
    Utente bannato
    Registrato dal
    Apr 2009
    Messaggi
    530
    Si può ricomporre la string di una query in base a delle variabili:

    $piece="SHOW";
    $query=mysql_query("" . $piece . " TABLES");

    ti dovrebbe funzionare quanto la:

    $query=mysql_query("SHOW TABLES");

    (magari fai un test analogo sulla query del tuo esempio che hai già il file bell'e pronto, non si sa mai qualche versione differente di PHP ma sul mio Server non ho incontrato problemi in tal senso).
    Assunto questo, possiamo introdurre un if-statement che fa esistere la clausola WHERE solo se il valore ritornato da $_POST['Tipologia']; non è vuoto:


    if($_POST['Tipologia'] == ""){
    $tipologia = "";
    } else {
    $tipo = $_POST['Tipologia'];
    $tipologia = " WHERE tipologia='" . $tipo . "'";
    };
    $strsql = mysql_query("
    SELECT rif, descrizione FROM dbimmobili" . $tipologia . "
    ");


    mi limito ad un solo campo, se lasci l' option "-- Qualsiasi --" ti dovrebbe restituire tutte le righe; devo scappare; dopo ricontrollo, potrei aver lasciato qualche minimo errore ma sullo schema non ci sono dubbi.
    Non si può fare invece, restituisce ERROR una query lasciando in bianco la clausola:

    $strsql = mysql_query("SELECT rif, descrizione FROM dbimmobili WHERE");

    per questo ho portato tutto il WHERE a far parte dell' if.

  6. #6
    Ciao Enzaccio,

    mi hai fatto fare un grosso passo in avanti, sei un grande! Ho impostato il tuo schema sia per tipologia che per zona ed effettivamente se lascio vuoti entrambe mi trova tutti gli immobili presenti nel db, se lascio vuota zona mi trova tutti quelli corrispondenti a tipologia e viceversa. Cosa che prima il programma si guardava bene dal fare!

    Adesso però se metto, ad esempio, tipologia = appartamento e zona = cinquale, quindi una ricerca con tutti i campi selezionati, mi restituisce questo errore:

    Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /home/mhd-01/SITO/htdocs/search.php on line 31

    Ti posto il codice qui sotto con la linea 31 dell'errore in grassetto, non penso sia un errore irreparabile:

    <?php
    ...

    $link = @mysql_connect("$db_host", "$db_username", "$db_password") or die ("Errore di connessione: " . mysql_error());
    $dbw = mysql_select_db("XxX") or die ("Errore di selezione database: " . mysql_error());

    $query = mysql_query("SHOW TABLES");
    if($_POST['Tipologia'] == '') {
    $tipologia = '';
    } else {
    $tipologia1 = $_POST['Tipologia'];
    $tipologia = " WHERE tipologia = '" . $tipologia1 . "'";
    };

    if($_POST['Zona'] == '') {
    $zona = '';
    } else {
    $zona1 = $_POST['Zona'];
    $zona = " WHERE zona = '" . $zona1 . "'";
    };

    $strsql = mysql_query("
    SELECT rif, descrizione FROM dbimmobili" . $tipologia . "" . $zona . "
    ");

    echo "<p align = 'left'><font face='Arial' size='3'>Immobili trovati:
    ---------</p></font>";

    while ($riga = mysql_fetch_row($strsql)){
    echo "<font face='Arial' size='2' color='#0000FF'>$riga[0]</font>

    $riga[1]

    <font face='Arial' size='3'>---------</font>
    ";
    }

    mysql_close($link);

    ?>

  7. #7
    Utente bannato
    Registrato dal
    Apr 2009
    Messaggi
    530
    Originariamente inviato da Sebastian84 Adesso però se metto, ad esempio, tipologia = appartamento e zona = cinquale, quindi una ricerca con tutti i campi selezionati, mi restituisce questo errore:
    ../..

    ... non penso sia un errore irreparabile:
    No, tranquillo era previsto; stamane avevo davvero poco tempo e poi è meglio che tu ora abbia verificato che fin qui ci siamo.
    &#200; perché così il risultato della ricomposizione è una query con due WHERE:

    $strsql = mysql_query("SELECT rif, descrizione FROM dbimmobili WHERE tipologia='appartamento' WHERE zona='cinquale'");

    mentre dobbiamo averlo solo per il primo, e poi AND per i successivi.

    Eh già, ma come facciamo a sapere quale sarà il primo select non-generico, e se poi l' utente uno ne salta e uno ne sceglie ... non so mica se si potrà fare.


    Vabbé via, voglio essere magnanimo, fammi sapere se funziona; ho portato in alto le variabili che raccolgono i Valori dal POST:

    Codice PHP:
    $tipologia1 $_POST['Tipologia'];
    $zona1 $_POST['Zona'];

        if(
    $tipologia1 == '') {
           
    $tipologia '';
    } else {
           
    $tipologia " WHERE tipologia = '" $tipologia1 "'";
    };

        if(
    $zona1 == '') {
           
    $zona '';
    } else {
           if(
    $tipologia == '') {$clausola="WHERE";} else {$clausola="AND";};
           
    $zona " " $clausola " zona = '" $zona1 "'";
    };

    $strsql mysql_query("
    SELECT rif, descrizione FROM dbimmobili" 
    $tipologia "" $zona "
    "
    ); 

    Negli if-step dopo il primo, inserirai un ulteriore if-statement che verifica se i precedenti hanno lasciato qualcosa ...
    Per il terzo sarà:

    if($tipologia == '' && $zona == '') {$clausola="WHERE";} else {$clausola="AND";};

  8. #8
    Enzaccio sei un fenomeno... funziona alla grande! Fossi in te lo brevetterei, per un programma del genere mi hanno chiesto più di 1000 euro...

    Grazie ancora!!

  9. #9
    Utente bannato
    Registrato dal
    Apr 2009
    Messaggi
    530
    Gli esosi che fanno scappare la gente, alla fine danneggiano, fanno cadere opportunità di lavoro anche per noialtri, perché tante cosette che le persone possono avere in mente di fare sul pc o per il loro spazio web, vengono lasciate cadere.

    Trovando Account, Database e pagina/e già impostati, avrei potuto chiederti --non più-- di 200 Euro, prendendo anche visione di tutto l' insieme, facendo la parte PHP di sana pianta, fornendo delucidazioni su quant' altro.

    Frequento questo Forum saltuariamente, e quindi mi ha fatto piacere esserci ri-capitato giusto in questi giorni.
    Condividere informazioni/materiali/competenze senza scopo di lucro e senza troppi altri intoppi (di copyright), è quello che realmente ha permesso al web di sviluppare rapidamente; e fornire poi altri momenti/occasioni di ritorni economici.


    Giacché l' ho sottomano ...
    Se le variabili provenienti dal $_POST si esauriscono nell' ambito preso in considerazione (cioè non servono da altre parti nella pagina) dovrebbe potersi sintetizzare li tutto in questo:

    Codice PHP:
    $tipologia $_POST['Tipologia'];
    $zona $_POST['Zona'];
    $superficie $_POST['Superficie'];

        if(
    $tipologia != '') {
           
    $tipologia " WHERE tipologia = '" $tipologia "'";
    };

        if(
    $zona != '') {
           if(
    $tipologia == '') {$clausola="WHERE";} else {$clausola="AND";};
           
    $zona " " $clausola " zona = '" $zona "'";
    };

        if(
    $superficie != '') {
           if(
    $tipologia == '' && $zona == '') {$clausola="WHERE";} else {$clausola="AND";};
           
    $superficie " " $clausola " superficie = '" $superficie "'";
    };

    $strsql mysql_query("
    SELECT rif, descrizione FROM dbimmobili" 
    $tipologia "" $zona "" $superficie "
    "
    ); 
    Sempreché mantieni vuoto il Valore di default per l' opzione generica value="">-- Qualsiasi --
    se invece facciamo value="empty" già non è più compatibile.

    Originariamente inviato da Sebastian84
    <option>Cinquale</option>
    <option>Vittoria Apuana</option>
    Potremmo essere contigui, io sono in zona La Spezia.

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.