Visualizzazione risultati 1 fino 14 di 14

Discussione: Funzione ricerca clienti

  1. #1
    Guest

    Question Funzione ricerca clienti

    Buondì avrei bisogno di comprendere il funzionamento necessario per scambiare dati tra un form web e il mio database.
    Sostanzialmente il webform dovrebbe prevedere una serie di campi che quando viene inserito il nome dell'azienda, viene tirato fuori tutto il resto dell'anagrafica nei campi del webform.

    Quindi facendo riferimento al nome della società, viene estrapolato tutto il resto dal database.

    Mi potete gentilmente indicare il principio di funzionamento con qualche esempio ?

    Vi ringrazio in anticipo,
    buona giornata.

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Se ho capito correttamente, il caso d'uso è:
    1. inserire il nome di un'azienda in un campo di un form
    2. (all'accedere di un evento) effettuare una ricerca nella base di dati per recuperare i dati associati al nome dell'azienda
    3. mostrare i dati estratti nel form stesso


    La prima osservazione riguarda la ricerca: il nome dell'azienda è unico (o chiave primaria) nella base di dati? In caso negativo, va gestita la possibilità che esistano più righe corrispondenti al criterio di ricerca.
    In ogni caso, se questa ricerca "in lettura" è un'operazione frequente potrebbe essere utile rendere il campo "nome azienda" nella base di dati indicizzato.

    Naturalmente va gestito anche il caso in cui non ci siano corrispondenze tra il nome digitato e la base di dati.

    L'"aggiornamento" del form con i dati letti può avvenire in maniera asincrona (leggasi "tramite AJAX") o sincrona.
    Nel secondo caso (più semplice), il form di ricerca invia la propria richiesta ad una pagina (verosimilmente la pagina stessa) che la elabora e, in caso di corrispondenza, ri-genera il form con le informazioni lette.
    Nel primo caso, la ricerca avviene in maniera asincrona tramite AJAX, AJAJ o simili. Questo richiede l'interazione tra JavaScript e PHP e -preferibilmente- l'utilizzo di librerie come jQuery. Un approccio ragionevole in questo caso consiste nell'effettuare la chiamata AJAX ed impostare una funzione di callback che popoli i campi del form non appena viene ricevuta una risposta.

    Infine, la fase di ricerca: hai il nome di un'azienda come parametro, ed il risultato atteso è l'insieme delle informazioni su quella azienda (o niente se non è presente nella base di dati).
    A seconda di cosa stai usando per gestire la base di dati (qualunque cosa compresa tra "query fatte a mano" e "data mapper design pattern + business logic") il procedimento può differire. Se siamo nel caso "query fatte a mano", la ricerca è una semplice selezione.

    Detto così è tutto (volutamente) molto generico, se hai dubbi in uno qualunque dei passi chiedi .

  3. #3
    Guest

    Predefinito

    Buongiorno mzanella,
    ti ringrazio innanzitutto per la spiegazione fornitami, anche se in virtù della mia ignoranza in materia, riesco a estrapolarne ben poco.

    Praticamente la logica è la seguente :

    Modulo inserimento nome cliente -> Ricerca corrispondenze in DB ( con o senza riscontri ) -> Estrapolazione del record ( unico ordinato per ID crescente ) -> Compilazione dei vari form con i dati estrapolati -> Eventuale modifica dei valori con salvataggio nel DB delle modifiche.

    Ti sarei grato se mi potresti inoltrare il codice standard per le singole funzioni, poi ovviamente alla rottura di scatole per la customizzazione, ci penso ovviamente io.

    Grazie mille della sisponibilità,
    sei un grande :D

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Chiaro .
    Dunque, tanto per fissare le idee supponiamo che nella base di dati ci sia una tabella azienda così strutturata:
    Codice:
    id INT PRIMARY KEY,
    name VARCHAR(128) UNIQUE INDEX NOT NULL,
    phone VARCHAR(16),
    email VARCHAR(16),
    url VARCHAR(256)
    update.php
    Codice PHP:
    <?php
    ////////////////////////////////////////////////////////////////////////
    // Definizioni per accedere alla base di dati (si assume mysqli)
    // Post-condizione: $mysqli è una connessione attiva alla base di dati
    require 'database.php';

    $azienda = null;

    ////////////////////////////////////////////////////////////////////////
    // Ricerca un'azienda
    // Post-condizione: $azienda è un vettore associativo con i dati
    // dell'azienda, oppure è null
    if (isset($_POST['name']) && !isset($_POST['id'])) {
    $name = $_POST['name'];

    $stm = $mysqli->prepare("SELECT * FROM azienda WHERE lower(name) = ?");
    if (
    $stm === false) {
    echo
    "ERROR: " . $mysqli->error;
    }

    if (!
    $stm->bind_param("s", $name)) {
    echo
    "ERROR: " . $stm->error;
    }

    if (!
    $stmt->execute()) {
    echo
    "ERROR: " . $stm->error;
    }

    $result = $stm->get_result();
    if (
    $result->num_rows == 0) {
    echo
    "ERROR: nessuna azienda trovata";
    $azienda = null;
    } else {
    $azienda = $result->fetch_assoc();
    }
    }


    ////////////////////////////////////////////////////////////////////////
    // Aggiornamento di un'azienda
    // Post-condizione: $azienda è un vettore associativo contenente i dati
    // aggiornati dell'azienda
    if (isset($_POST['id'], $_POST['name'], $_POST['phone'], $_POST['email'], $_POST['url'])) {
    $id = $_POST['id'];
    $name = $_POST['name'];
    $phone = $_POST['phone'];
    $email = $_POST['email'];
    $url = $_POST['url'];

    $stm = $mysqli->prepare("UPDATE azienda SET name = ?, phone = ?, email = ?, url = ? WHERE id = ?");
    if (
    $stm === false) {
    echo
    "ERROR: " . $mysqli->error;
    }

    if (!
    stm->bind_param("ssssi", $name, $phone, $email, $url, $id)) {
    echo
    "ERROR: " . $stm->error;
    }

    if (!
    $stmt->execute()) {
    echo
    "ERROR: " . $stm->error;
    }

    $azienda = array(
    'id' => $id,
    'name' => $name,
    'phone' => $phone,
    'email' => $email,
    'url' => $url
    );
    }
    ?>

    <DOCTYPE HTML>
    <html>
    ...
    <form method="POST" action="update.php">
    <input type="text" name="name" placeholder="Nome dell'azienda..." />

    <!-- Ricerca di un'azienda -->
    <?php if (is_null($azienda)): ?>
    <input type="submit" value="Cerca">

    <!-- Modifica di un'azienda -->
    <?php else: ?>
    <input type="hidden" name="id" value="<?= $azienda['id'] ?>" />
    <input type="text" name="phone" value="<?= $azienda['phone'] ?>" />
    <input type="text" name="email" value="<?= $azienda['email'] ?>" />
    <input type="text" name="url" value="<?= $azienda['url'] ?>" />
    <input type="submit" value="Modifica">
    <?php endif; ?>
    </form>
    ...
    </html>
    Si suppone che in database.php tu definisca il modo di manipolare la base di dati, ad esempio MySQLi.

    Il successivo blocco PHP cerca un'azienda, dato il nome (solo a condizione che il nome da cercare sia l'unico parametro passato tramite POST). Se la trova, ne memorizza i dati come vettore associativo in $azienda , altrimenti $azienda è impostato a null.

    Nel blocco successivo viene eseguito l'aggiornamento (solo a condizione che tutti i dati necessari siano stati forniti come parametri POST). A seguito dell'aggiornamento, $azienda contiene i dati aggiornati dell'azienda.

    Nota: i due blocchi sono eseguiti in maniera esclusiva: o uno, o l'altro. In ogni caso, alla fine $azienda contiene i dati aggiornati dell'azienda in questione, oppure null se nessuna azienda è stata ancora selezionata.

    Nel blocco HTML, il campo name viene usato per specificare il nome dell'azienda (sia per la ricerca che per l'aggiornamento).
    Dopodiché, se nessuna azienda è stata selezionata ($azienda è null) viene mostrato il pulsante di ricerca.
    Altrimenti, vengono mostrati gli altri campi (modificabili) che contengono i dati correnti relativi all'azienda.

    Questo probabilmente è il metodo più naive. Si può solo migliorare.

    PS: Non ho modo di testare il codice. Potrebbero esserci errori di sintassi qua e là.

  5. #5
    Guest

    Predefinito

    Ciao mzanella !

    Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /membri/formau/test/anagrafica.php on line 55

    Dov'è l'errore ?

  6. #6
    L'avatar di chack1172
    chack1172 non è connesso Neofita
    Data registrazione
    27-02-2015
    Messaggi
    29

    Predefinito

    formau c'era un piccolo errore nel file update.php

    Sostituisci il file con questo:

    Codice PHP:
    <?php
    ////////////////////////////////////////////////////////////////////////
    // Definizioni per accedere alla base di dati (si assume mysqli)
    // Post-condizione: $mysqli è una connessione attiva alla base di dati
    require 'database.php';

    $azienda = null;

    ////////////////////////////////////////////////////////////////////////
    // Ricerca un'azienda
    // Post-condizione: $azienda è un vettore associativo con i dati
    // dell'azienda, oppure è null
    if (isset($_POST['name']) && !isset($_POST['id'])) {
    $name = $_POST['name'];

    $stm = $mysqli->prepare("SELECT * FROM azienda WHERE lower(name) = ?");
    if (
    $stm === false) {
    echo
    "ERROR: " . $mysqli->error;
    }

    if (!
    $stm->bind_param("s", $name)) {
    echo
    "ERROR: " . $stm->error;
    }

    if (!
    $stmt->execute()) {
    echo
    "ERROR: " . $stm->error;
    }

    $result = $stm->get_result();
    if (
    $result->num_rows == 0) {
    echo
    "ERROR: nessuna azienda trovata";
    $azienda = null;
    } else {
    $azienda = $result->fetch_assoc();
    }
    }


    ////////////////////////////////////////////////////////////////////////
    // Aggiornamento di un'azienda
    // Post-condizione: $azienda è un vettore associativo contenente i dati
    // aggiornati dell'azienda
    if (isset($_POST['id'], $_POST['name'], $_POST['phone'], $_POST['email'], $_POST['url'])) {
    $id = $_POST['id'];
    $name = $_POST['name'];
    $phone = $_POST['phone'];
    $email = $_POST['email'];
    $url = $_POST['url'];

    $stm = $mysqli->prepare("UPDATE azienda SET name = ?, phone = ?, email = ?, url = ? WHERE id = ?");
    if (
    $stm === false) {
    echo
    "ERROR: " . $mysqli->error;
    }

    if (!
    $stm->bind_param("ssssi", $name, $phone, $email, $url, $id)) {
    echo
    "ERROR: " . $stm->error;
    }

    if (!
    $stmt->execute()) {
    echo
    "ERROR: " . $stm->error;
    }

    $azienda = array(
    'id' => $id,
    'name' => $name,
    'phone' => $phone,
    'email' => $email,
    'url' => $url
    );
    }
    ?>

    <DOCTYPE HTML>
    <html>
    ...
    <form method="POST" action="update.php">
    <input type="text" name="name" placeholder="Nome dell'azienda..." />

    <!-- Ricerca di un'azienda -->
    <?php if (is_null($azienda)): ?>
    <input type="submit" value="Cerca">

    <!-- Modifica di un'azienda -->
    <?php else: ?>
    <input type="hidden" name="id" value="<?= $azienda['id'] ?>" />
    <input type="text" name="phone" value="<?= $azienda['phone'] ?>" />
    <input type="text" name="email" value="<?= $azienda['email'] ?>" />
    <input type="text" name="url" value="<?= $azienda['url'] ?>" />
    <input type="submit" value="Modifica">
    <?php endif; ?>
    </form>
    ...
    </html>

  7. #7
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Come sottolineato da chack1172, per la precisione mancava il $ prima del nome di una variabile .

  8. #8
    Guest

    Predefinito

    Buongiorno,
    perdonate la domanda probabilmente stupida, tutto il codice di update.php deve essere contenuto in un unico file update.php, giusto ?

    Perchè mi viene restituito :

    Fatal error: Call to a member function prepare() on a non-object in /membri/formau/test/anagrafica.php on line 16

  9. #9
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    perdonate la domanda probabilmente stupida, tutto il codice di update.php deve essere contenuto in un unico file update.php, giusto ?
    La risposta breve è .
    Quella lunga è non necessariamente, puoi dividere il codice in tutti i file che desideri, fintanto che li includi nel modo corretto. Ma per questo esempio direi che non è necessario.

    Fatal error: Call to a member function prepare() on a non-object in /membri/formau/test/anagrafica.php on line 16
    $mysqli non è inizializzato. Crea una connessione al database, od includi uno script che lo faccia.

  10. #10
    Guest

    Predefinito

    Salve Signori,
    vi aggiorno al riguardo:

    Form principale :

    Codice:
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="generator" content="AlterVista - Editor HTML"/>
      <title>Anagrafica Clienti</title>
    </head>
    <body>
    <form method="POST" action="ricerca.php">
    <table align="center">
    	<tr><td>Anagrafica</td></tr>
        
        <tr><td><input type="text" name="azienda" placeholder="Azienda" /></td></tr> 
        <tr><td><input type="text" name="indirizzo" placeholder="Indirizzo" /></td></tr>
        <tr><td><input type="text" name="citta" placeholder="Città" /></td></tr>
        <tr><td><input type="text" name="cap" placeholder="CAP" /></td></tr>
        
        <tr><td>Contatti</td></tr>
        
        <tr><td><input type="text" name="tel" placeholder="Telefono" /></td></tr>
        <tr><td><input type="text" name="cell" placeholder="Cellulare" /></td></tr>
        <tr><td><input type="text" name="email" placeholder="Email" /></td></tr>
        <tr><td><input type="text" name="altro" placeholder="Altro recapito" /></td></tr>
        
        <tr><td>Situazione generica</td></tr>
        
        <tr><td><input type="text" name="teleformau" placeholder="Tipo Abbonamento" /></td></tr>
        <tr><td><input type="text" name="corsi" placeholder="Carriera Corsi" /></td></tr>
        <tr><td><input type="text" name="assistenze aperte" placeholder="Si / No" /></td></tr>
        <tr><td><input type="text" name="crediti" placeholder="Crediti" /></td></tr>
        <tr><td><input type="submit"></td></tr>
        </table>
        </form>  
    </body>
    
    </html>
    Il quale genera una serie di placeholder per recuperare i dati necessari, il form si presenta così :



    Avrei bisogno del code php che all'inserimento del nome dell'azienda, mi vada ad estrarre dal database, tutti i dati sopra citati in merito all'utente in questione.

    Ho messo a punto questo codice, ma non mi restituisce il risultato, come mai ?

    Codice:
    <?php
    require 'database.php';
    
    $azienda = $_POST['azienda'];
    print "$azienda";
    
    $connessione = mysql_connect($host,$user,$password) or die ("Non riesco a connettermi con il Server $host");
    $database = mysql_select_db($database, $connessione) or die ("Non riesco a selezionare il db $database in locale");
    $selezionedati = "SELECT * FROM wp_teleformau WHERE azienda = '$azienda'";
    $query = mysql_query($selezionedati) or die(mysql_error());
    	$array = mysql_fetch_array($query);
    	echo $array['azienda'];
    	/*while($array = mysql_fetch_array($query))
    	{
    		echo $array['campo1'];
        }
    	*/
    ?>
    Mi potete dare una mano gentilmente ?

    Grazie mille Signori !
    Ultima modifica di formau : 21-06-2016 alle ore 18.35.10

  11. #11
    Guest

    Predefinito

    BUONDI' !
    Preciso che ho risolto con l'estrapolazione dei dati, ora volevo cortesemente sapere come riempire i form precedentemente mostrati con i dati estratti dal database.

  12. #12
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Una volta che hai recuperato i dati, puoi semplicemente stamparli all'interno dell'attributo value dell'input. Ad esempio, se in $nomehai il nome dell'azienda:
    Codice PHP:
    ...
    <input type="text" name="azienda" placeholder="Azienda" value="<?= $nome ?>" />
    ...

  13. #13
    Guest

    Predefinito

    Buongiorno Sig.ri,
    Grazie in gran parte al vostro aiuto, sono riuscito a mettere su una funzione di ricerca clienti nel mio database, tuttavia avrei bisogno solo di un aiutino in merito.

    Capita a volte che per lo stesso nome parziale vi siano corrispondenze di più clienti, dovrei gestire questo episodio in modo che all'inserimento del nome del cliente, la barra di testo mi inizia ad estrarre tutti i clienti inizianti per le lettere che ho digitato.

    In poche parole:

    Digito nel Texbox le lettere " Ro " e la textbox dovrebbe generarmi un elenco dei clienti che iniziano per
    " Ro " come per esempio 1)Rossi 2)Roffoli 3)Roberto ecc.. ovviamente i campi devono essere cliccabili per effettuare la selezione.

    Grazie mille della collaborazione :)
    Ultima modifica di formau : 27-06-2016 alle ore 09.01.29

  14. #14
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Per modificare dinamicamente ed interattivamente il contenuto della pagina (in questo caso mostrando un elenco in base al nome parziale inserito) hai bisogno di JavaScript.
    Inoltre, siccome ciò che intendi mostrare dipende dal contenuto della base di dati, hai bisogno di AJAX.

    L'idea è di avere una chiamata AJAX che, ogni volta in cui il nome parziale è aggiornato (= ogni volta che viene premuto un tasto), interroga la base di dati estraendo i dati dei clienti interessati (in questo caso secondo il criterio dell'inizio del nome).
    Purtroppo, così facendo, la base di dati viene "disturbata" ogni qualvolta l'utente preme un tasto nella barra del nome, il che non è molto efficiente. Ma non ci sono alternative.

    Una finta alternativa è avere una richiesta AJAX che ottenga, quando la pagina viene caricata i nomi di tutti i clienti una sola volta e, ogni qualvolta viene premuto un tasto, controlli la "lista" ottenuta cercando una corrispondenza. L'inefficienza viene spostata dal server al client. Il problema principale è che quest'approccio non è sensibile alla concorrenza: se un amministratore inserisce, modifica o cancella un nome, tutti gli altri che avevano già la pagina aperta non saranno notificati del cambiamento e continueranno ad usare la lista vecchia.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •