Pagina 2 di 3 PrimoPrimo 123 UltimoUltimo
Visualizzazione risultati 31 fino 60 di 81
Like Tree4Likes

Discussione: Codice per Tag

  1. #31
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Niente, sembra che nessuno ha piu' voglia d'aiutarmi

    peccato

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

    Predefinito

    Mi ero perso la risposta
    naturalmente deve essere eseguito in realtime, quindi il problema e come filtrare i tag dopo aver premuto uno dei pulsanti?
    per questo devi cambiare paradigma e passare ad AJAX. Anziché avere una pagina PHP che carica e legge i risultati lato server, puoi usare una pagina HTML con un template JavaScript. I dati vengono ottenuti effettuando chiamate AJAX ad una seconda pagina PHP che, in base alla richiesta ricevuta, costruisce una query opportunamente e restituisce i risultati in qualche formato come JSON o XML. La pagina HTML che ha effettuato la richiesta, quindi, mostra dinamicamente i dati tramite codice JavaScript. Può essere fatto tutto a mano, ma per la parte del template potresti usare librerie come Handlebars o Mustaches. Per le chiamate AJAX jQuery è il punto di riferimento.

    I suggerimenti che do più spesso:


  3. #33
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Mi ero perso la risposta

    per questo devi cambiare paradigma e passare ad AJAX. Anziché avere una pagina PHP che carica e legge i risultati lato server, puoi usare una pagina HTML con un template JavaScript. I dati vengono ottenuti effettuando chiamate AJAX ad una seconda pagina PHP che, in base alla richiesta ricevuta, costruisce una query opportunamente e restituisce i risultati in qualche formato come JSON o XML. La pagina HTML che ha effettuato la richiesta, quindi, mostra dinamicamente i dati tramite codice JavaScript. Può essere fatto tutto a mano, ma per la parte del template potresti usare librerie come Handlebars o Mustaches. Per le chiamate AJAX jQuery è il punto di riferimento.
    a farlo, il problema che non riesco

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

    Predefinito

    Un sistema asincrono è più complesso, ma ha il vantaggio di essere modulare e quindi paradossalmente più semplice da testare.
    Puoi sviluppare la pagina PHP che elabora le richieste separatamente, per esempio, e preoccuparti della resa grafica solo in un secondo momento.

    Oppure puoi rinunciare al "real time" e usare le classiche pagine PHP. In quel caso cliccando sui link per "filtrare" si invieranno dei dati (GET) ad una pagina che interrogherà il database di conseguenza e mostrerà il risultati, il tutto analogo a quanto già stai facendo.

    I suggerimenti che do più spesso:


  5. #35
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Tralasciando il realtime come passo il GET a questo collegamento?

    Codice PHP:
    echo "<a href='film_tags_s_d.php?tag=$ok' target='_blank''>$ok &nbsp;</a> ";
    questo sarebbe il codice

    Codice PHP:

    <?php
    require_once("connetti.php");

    $actor_id = $_GET['id'];

    $query = "SELECT
    studio, distributor
    FROM film_actor
    INNER JOIN film ON film_actor.film_id = film.film_id
    INNER JOIN actor ON film_actor.actor_id = actor.actor_id
    WHERE film_actor.actor_id =
    $actor_id
    "
    ;
    $arr = array();
    $result = mysql_query( $query );
    if (!
    $result)
    die(
    "mySQL error: ". mysql_error());
    while(
    $row = mysql_fetch_object( $result ) ) : ?>


    <?php

    $risultato
    = explode(" , ", $row->distributor);
    foreach (
    $risultato as $res) {
    array_push($arr, $res);
    }

    $risultato = explode(" , ", $row->studio);
    foreach (
    $risultato as $res) {
    array_push($arr, $res);
    }



    ?>
    <?
    endwhile; ?>
    <?php
    // poi fuori dal while fai cosi:
    natcasesort($arr); // Sort array items in PHP so that it is not case sensitive to letters, https://www.php.net/manual/en/function.natcasesort.php
    foreach (array_unique($arr) as $ok){


    echo
    "<a href='film_tags_s_d.php?tag=$ok' target='_blank''>$ok &nbsp;</a> ";



    }
    ?>

    </p>

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

    Predefinito

    Devi passare anche l'actor id se vuoi usarlo:
    Codice PHP:
    echo "<a href='film_tags_s_d.php?tag=$ok&actor_id=$actor_id' target='_blank''>$ok &nbsp;</a> ";
    posto che $actor_id contenga l'id dell'attore.
    blackskyisback likes this.

    I suggerimenti che do più spesso:


  7. #37
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    ok, forse ho capito, domani ci lavoro e ti faccio sapere

    grazie
    mzanella

  8. #38
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Devi passare anche l'actor id se vuoi usarlo:
    Codice PHP:
    echo "<a rel='nofollow' href='film_tags_s_d.php?tag=$ok&actor_id=$actor_id' target='_blank''>$ok *</a> ";
    posto che $actor_id contenga l'id dell'attore.

    Rieccomi, scusate il ritardo ma gli impegni chiamano,

    ho inserito il codice sopra nella pagina principale, ma ovviamente non funziona

    http://forum.it.altervista.org/php-m...ml#post1463153


    nella pagina che punta film_tags_s_d.php non viene filtrato il tag per attore

    questo e' il codice di film_tags_s_d.php

    Codice PHP:
    <?php

    require_once("connetti.php");


    $ok = $_GET["tag"];


    $query = "
    SELECT *
    FROM film_actor
    INNER JOIN film ON film_actor.film_id = film.film_id
    INNER JOIN actor ON film_actor.actor_id = actor.actor_id
    WHERE studio LIKE '%
    $ok%' OR distributor LIKE '%$ok'
    GROUP BY movie_title
    "
    ;


    $result = mysql_query( $query );

    if (!
    $result)
    die(
    "mySQL error: ". mysql_error());
    while(
    $row = mysql_fetch_object( $result ) ) : ?>
    HO provato ad aggiungere all'inizio della pagina questo ulteriore codice

    Codice PHP:
    <?php

    require_once("connetti.php");

    $actor_id = $_GET["id"];
    $query = mysql_query ("SELECT * FROM actor WHERE actor_id=". $actor_id, $db);

    $row = mysql_fetch_array ($query);

    ?>
    il risultato non cambia, i tag vengono visualizzati tutti per categoria e non per categoria/attore

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

    Predefinito

    Rieccomi, scusate il ritardo ma gli impegni chiamano,
    Nessun problema, ci mancherebbe purtroppo nel frattempo ho dimenticato un po' delle cose dette nei messaggi precedenti, quindi rifacciamo il punto della situazione. C'è una pagina film_tags_s_d.php che dovrebbe filtrare sia per attore che per tag, quindi restituire solo risultati che riguardano un certo attore e, contemporaneamente, abbiano uno o più "tag" (che devono essere cercati nelle colonne studio e distributor).

    Stando a questo codice
    Codice PHP:
    echo "<a rel='nofollow' href='film_tags_s_d.php?tag=$ok&actor_id=$actor_id' target='_blank''>$ok *</a> ";
    la pagina film_tags_s_d.php riceve due parametri, tramite GET: actor_id e tag.

    Se è tutto ok sin qui, il problema è la query. Quella che hai riportato non utilizza l'informazione sull'actor_id, quindi è come se non gliela passassi. A occhio dovrebbe essere riscritta in:
    Codice PHP:
    require_once "connetti.php";

    $ok = $_GET["tag"];
    $actor_id = $_GET["actor_id"];

    $query = "
    SELECT *
    FROM film_actor
    INNER JOIN film ON film_actor.film_id = film.film_id
    INNER JOIN actor ON film_actor.actor_id = actor.actor_id
    WHERE (studio LIKE '%
    $ok%' OR distributor LIKE '%$ok%') AND actor.actor_id = '$actor_id'
    GROUP BY movie_title
    "
    ;

    $result = mysql_query( $query );
    if (!
    $result)
    die(
    "mySQL error: ". mysql_error());

    while (
    $row = mysql_fetch_object($result)) : ?>
    In realtà credo si possa migliorare ulteriormente. Al momento la query considera il prodotto cartesiano film_actor × film × actor, ma poi filtra sugli attori che hanno un certo id. Probabilmente si può evitare almeno il prodotto con actor, ma senza conoscere lo schema del database non ne ho la certezza. Nel caso abbia intuito correttamente, il codice della query si può semplificare in
    Codice PHP:
    $query = "
    SELECT *
    FROM film_actor
    INNER JOIN film ON film_actor.film_id = film.film_id
    WHERE (studio LIKE '%
    $ok%' OR distributor LIKE '%$ok%') AND film_actor.actor_id = '$actor_id'
    GROUP BY movie_title
    "
    ;

    I suggerimenti che do più spesso:


  10. #40
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Smile

    Ciao mzanella,

    perfetto, funziona adesso (con la prima query)

    GRAZIE TANTO

    ci sarebbe altro,

    1) come faccio a switchare tra tag con filtro/attore a tag con filtro generale senza fare due codici?

    esempio:

    da cosi: http://.../film_tags_s_d.php?tag=Universal&actor_id=54

    a cosi: http://..../film_tags_s_d.php?tag=Universal


    2)come effettuare il conteggio dei tag?

    esempio: Universal sono 2, vorrei visualizzare Universal(2)




    Codice aggiornato della prima pagina

    Codice PHP:
    <?php
    require_once("connetti.php");

    $actor_id = $_GET['id'];

    $query = "SELECT
    studio, distributor
    FROM film_actor
    INNER JOIN film ON film_actor.film_id = film.film_id
    INNER JOIN actor ON film_actor.actor_id = actor.actor_id
    WHERE film_actor.actor_id =
    $actor_id
    "
    ;
    $arr = array();
    $result = mysql_query( $query );
    if (!
    $result)
    die(
    "mySQL error: ". mysql_error());
    while(
    $row = mysql_fetch_object( $result ) ) : ?>


    <?php

    $risultato
    = explode(" , ", $row->distributor);
    foreach (
    $risultato as $res) {
    array_push($arr, $res);
    }

    $risultato = explode(" , ", $row->studio);
    foreach (
    $risultato as $res) {
    array_push($arr, $res);
    }



    ?>
    <?
    endwhile; ?>
    <?php
    // poi fuori dal while fai cosi:
    natcasesort($arr); // Sort array items in PHP so that it is not case sensitive to letters, https://www.php.net/manual/en/function.natcasesort.php
    foreach (array_unique($arr) as $ok){


    echo
    "<a rel='nofollow' href='film_tags_s_d.php?tag=$ok&actor_id=$actor_id' target='_blank''>$ok *</a> ";



    }
    ?>
    Ultima modifica di blackskyisback : 26-11-2020 alle ore 20.33.50

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

    Predefinito

    1) come faccio a switchare tra tag con filtro/attore a tag con filtro generale senza fare due codici?
    Si può provare ad accorpare tutto in un'unica pagina, in questo caso la query dovrà essere costruita in un modo piuttosto che in un altro a seconda che il parametro actor_id sia stato passato o meno:
    Codice PHP:
    require_once "connetti.php";

    $ok = $_GET["tag"];
    $actor_id = null;
    if (isset(
    $_GET['actor_id'])) {
    $actor_id = $_GET['actor_id'];
    }

    $query = "
    SELECT *
    FROM film_actor
    INNER JOIN film ON film_actor.film_id = film.film_id
    INNER JOIN actor ON film_actor.actor_id = actor.actor_id
    WHERE (studio LIKE '%
    $ok%' OR distributor LIKE '%$ok%')
    "
    ;

    if (!
    is_null($actor_id)) {
    $query .= " AND actor.actor_id = '$actor_id'";
    }
    $query .= " GROUP BY movie_title";

    $result = mysql_query( $query );
    if (!
    $result)
    die(
    "mySQL error: ". mysql_error());

    while (
    $row = mysql_fetch_object($result)) : ?>
    2)come effettuare il conteggio dei tag?
    Intendi contare il numero di risultati che contengono il tag "universal" tra quelli mostrati nella ricerca? Se è così il numero è uguale alla quantità di risultati, poiché la ricerca filtra proprio sul tag.

    I suggerimenti che do più spesso:


  12. #42
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Buongiorno mzanella,

    1) e lo switch come lo effettuo? avevo proposto tramite un button in cui selezionandolo cambia lo stato del link
    il problema che non so' come impostarlo


    2)a come ho capito il conteggio verrebbe effettuato totale, 10 tag e il risultato sarebbe 10,
    non c'e' un modo per conteggiare i tag singoli?
    esempio

    Tag 1 (10)
    Tag 2 (3)
    Tag 3 (6)
    ecc...


    Grazie ancora del tuo prezioso aiuto

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

    Predefinito

    1) e lo switch come lo effettuo? avevo proposto tramite un button in cui selezionandolo cambia lo stato del link
    Passare dalla pagina col filtro sull'attore a quella senza il filtro è semplice, basta mostrare un link che punti allo stesso URL, ma senza l'informazione sull'actor_id:
    Codice PHP:
    echo "<a rel='nofollow' href='film_tags_s_d.php?tag=$ok' target='_blank'>$ok *</a> ";
    Per l'operazione inversa serve invece aggiungere l'informazione. Non ricordo come avevi pensato di recuperare l'informazione sull'actor_id: una select box? Un elenco di link cliccabili?

    2)a come ho capito il conteggio verrebbe effettuato totale, 10 tag e il risultato sarebbe 10,
    non c'e' un modo per conteggiare i tag singoli?
    Mi sa che non ho capito prova con un esempio.

    I suggerimenti che do più spesso:


  14. #44
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    guarda gli screen


    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Passare dalla pagina col filtro sull'attore a quella senza il filtro è semplice, basta mostrare un link che punti allo stesso URL, ma senza l'informazione sull'actor_id:
    Codice PHP:
    echo "<a rel='nofollow' href='film_tags_s_d.php?tag=$ok' target='_blank'>$ok *</a> ";
    Per l'operazione inversa serve invece aggiungere l'informazione. Non ricordo come avevi pensato di recuperare l'informazione sull'actor_id: una select box? Un elenco di link cliccabili?


    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Mi sa che non ho capito prova con un esempio.

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

    Predefinito

    guarda gli screen
    ok, chiaro per la selezione dei tag, ma per la selezione dell'attore?

    conteggio risultati per singolo tag
    quindi si tratta di effettuare una ricerca/filtro, calcolare l'unione degli insiemi di tag associati a ciascun risultato e, per ciascun tag nell'insieme risultante, contare in quanti film (tra quelli mostrati nei risultati) è presente. Corretto?
    Se è così puoi scorrere il vettore dei risultati e contare quanto spesso ogni tag si presenta. Non ricordo in che formato si presenta il vettore, quindi al momento non saprei dare indicazioni sul codice.
    In teoria esisterebbe un'alternativa usando una query, ma siccome lo schema del tuo database non è in forma normale non è percorribile.

    I suggerimenti che do più spesso:


  16. #46
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    ok, chiaro per la selezione dei tag, ma per la selezione dell'attore?

    in base al pulsante premuto cambierebbero anche i link nei tag

    penso




    se tu hai un'idea migliore e ben accetta

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

    Predefinito

    Trovare idee è facile, il difficile è identificare quelle che risolvono il problema apportando il minor numero di cambiamenti possible

    In questo momento ciò che non mi è ancora chiaro è come si sceglie l'attore su cui filtrare. Nello screenshot compare, nell'URL in rosso "actor_id=54": da dove viene questo 54? È stato selezionato in qualche modo? È già presente nella pagina perché ricevuto come parametro dall'esterno? Se sì, come e perché (per esempio quella potrebbe essere la pagina dedicata a un attore, ma in questo caso perché filtrare ulteriormente sull'attore?)?

    I suggerimenti che do più spesso:


  18. #48
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    la pagina principale si chiama Cinema.php, e dell'attore, in questa stessa pagina vengono visualizzati anche la lista dei suoi film, l'id viene prelevato tramite una query simile che ho postato

    poi nella lista dei film cliccando su un titolo si va' a un'altra pagina con i dettagli del film





    perche' il filtro sui tag?

    esempio 1:

    voglio vedere tutti i film della Universal (su tutto il database, che ancora sono pochi)

    esempio 2:

    voglio vedere tutti i film della Universal in cui ha recitato quell'attore (in questo caso Linda Blair)

    in questo caso l'id dell'attore e' necessario

    ed ecco il motivo dello switch

    spero di essere stato chiaro stavolta

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

    Predefinito

    Chiarissimo
    Mh, hai valutato l'idea di rendere la pagina film_tags_s_d.php uno strumento di ricerca indipendente?
    Così facendo potresti mantenere la funzionalità attuale (i.e. ricerca per tag + attore dalla pagina dell'attore) e aggiungerne altre senza preoccuparti troppo di come passare le informazioni da una pagina all'altra.
    Andrebbe aggiunto un "pannello di ricerca" tramite cui inserire o selezionare i criteri di ricerca, tra cui i tag e gli id degli attori.

    I suggerimenti che do più spesso:


  20. #50
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Chiarissimo
    Mh, hai valutato l'idea di rendere la pagina film_tags_s_d.php uno strumento di ricerca indipendente?
    Così facendo potresti mantenere la funzionalità attuale (i.e. ricerca per tag + attore dalla pagina dell'attore) e aggiungerne altre senza preoccuparti troppo di come passare le informazioni da una pagina all'altra.
    Andrebbe aggiunto un "pannello di ricerca" tramite cui inserire o selezionare i criteri di ricerca, tra cui i tag e gli id degli attori.

    una cosa simile a questo

    https://yadi.sk/d/x5b6B4pTeVJH8w
    Ultima modifica di blackskyisback : 27-11-2020 alle ore 14.26.45

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

    Predefinito

    Sì, qualcosa del genere, con l'aggiunta della ricerca per attore.

    I suggerimenti che do più spesso:


  22. #52
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Sì, qualcosa del genere, con l'aggiunta della ricerca per attore.
    Ciao mzanella,
    news?

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

    Predefinito

    In realtà aspettavo te
    Nel senso: quindi ti va bene procedere per questa strada, creare quindi una pagina separata per la ricerca?
    Se sì, hai già una rappresentazione grafica del pannello di ricerca definitivo?
    In ogni caso, quali campi prevedi sia possibile coinvolgere nella ricerca? Sicuramente i tag (studio e distributor) e l'id dell'attore, immagino anche il titolo dei film (altro?).
    Già che ci siamo: vorresti realizzare già il meccanismo asincrono tramite AJAX, o mantenere l'impostazione "classica" col ricaricamento della pagina?

    I suggerimenti che do più spesso:


  24. #54
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    In realtà aspettavo te
    Nel senso: quindi ti va bene procedere per questa strada, creare quindi una pagina separata per la ricerca?
    Se sì, hai già una rappresentazione grafica del pannello di ricerca definitivo?
    In ogni caso, quali campi prevedi sia possibile coinvolgere nella ricerca? Sicuramente i tag (studio e distributor) e l'id dell'attore, immagino anche il titolo dei film (altro?).
    Già che ci siamo: vorresti realizzare già il meccanismo asincrono tramite AJAX, o mantenere l'impostazione "classica" col ricaricamento della pagina?
    e io aspettavo te, no problem.

    Va bene la pagina separata,
    i campi (iniziamo con questi)

    studio,
    distributor
    actor_id

    una volta capito il codice penso che riusciro' anche io ad aggiungere altri campi (o no?)

    AJAX penso meglio, la seconda opzione richiede il refresh della pagina

    grazie ancora
    Ultima modifica di blackskyisback : 29-11-2020 alle ore 22.25.47

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

    Predefinito

    Ok, ci do un'occhiata nel pomeriggio
    Purtroppo... oggi è lunedì.

    Citazione Originalmente inviato da blackskyisback Visualizza messaggio
    e io aspettavo te, no problem.

    I suggerimenti che do più spesso:


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

    Predefinito

    Ecco una prima stesura del sistema di ricerca. Probabilmente contiene qualche errore perché, non avendo a disposizione il database, non è stato testato. Inoltre la versione di PHP che usi è così datata che non sono nemmeno certo supporti la sintassi abbreviata per i vettori. Comunque:

    search.php
    Codice PHP:
    <?php
    require_once 'connetti.php';

    ////////////////////////////////////////////////////////////////////////
    // Configuration section
    define('SEARCHABLE_FIELDS', ['movie_title']);
    define('EXACT_MATCH_FIELDS', ['actor_id']);


    ////////////////////////////////////////////////////////////////////////
    // Support functions
    function format_clause($field, $value) {
    return
    in_array($field, EXACT_MATCH_FIELDS)
    ?
    $field . ' = ' . $value
    : $field . ' LIKE "%' . $value . '%"';
    }

    function
    format_result($row) {
    $result = $row;
    $result['distributor'] = array_filter(array_map('trim', explode(',', $result['distributor'])));
    $result['studio'] = array_filter(array_map('trim', explode(',', $result['studio'])));
    }


    ////////////////////////////////////////////////////////////////////////
    // Reads parameters
    $query = isset($_REQUEST['q']) ? $_REQUEST['q'] : null;
    $filters = isset($_REQUEST['fq']) && is_array($_REQUEST['fq']) ? $_REQUEST['fq'] : [];


    ////////////////////////////////////////////////////////////////////////
    // Builds query clauses in Conjunctive Normal Form (CNF)
    $clauses = [];

    if (!
    is_null($query)) {
    foreach (
    SEARCHABLE_FIELDS as $field) {
    $clauses[] = format_clause($field, $query);
    }
    }

    foreach (
    $filters as $disjunction) {
    $disjunctive_clause = [];
    foreach (
    $disjunction as $component) {
    foreach (
    $component as $field => $value) {
    $disjunctive_clause[] = format_clause($field, $value);
    }
    }
    $clauses[] = '(' . implode(' OR ', $disjunctive_clause) . ')';
    }


    ////////////////////////////////////////////////////////////////////////
    // Builds query
    $query = 'SELECT * '
    . 'FROM film_actor INNER JOIN film ON film_actor.film_id = film.film_id '
    . 'INNER JOIN actor ON film_actor.actor_id = actor.actor_id ';
    if (!empty(
    $clauses)) {
    $query .= 'WHERE ' . implode(' AND ', $clauses) . ' ';
    }
    $query .= 'GROUP BY movie_title';


    ////////////////////////////////////////////////////////////////////////
    // Runs query
    $start_time = microtime(true);
    $results = [];
    $result = mysql_query($query);
    if (
    $result === false) {
    die(
    'Cannot execute query "' . $query . '": ' . mysql_error());
    }
    while (
    $row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    $results[] = format_result($row);
    }
    $end_time = microtime(false);


    ////////////////////////////////////////////////////////////////////////
    // Outputs results
    $data = [
    'header' => [
    'q' => $query,
    'fq' => $filters,
    'result_count' => count($results),
    'time' => ($end_time - $start_time) * 1e3
    ],
    'results' => $results
    ];
    header('Content-Type: application/json');
    echo
    json_encode($data);
    Per utilizzarlo puoi effettuare richieste HTTP GET (tramite AJAX) a search.php. Ti verrà in ogni caso restituito un documento JSON contenente un header con alcune informazioni (ricerca eseguita, numero di risultati, tempo impiegato) e l'elenco dei risultati vero e proprio.
    Se non passi alcun parametro tramite GET, tutti i film verranno restituiti.
    Se passi un parametro q di tipo stringa verranno restituiti solo i film il cui titolo contiene il parametro passato. Al momento la ricerca avviene solo nel titolo, puoi aggiungere altri campi modificando il vettore SEARCHABLE_FIELDS.
    Il parametro fq serve invece per applicare filtri ed è strutturato come un vettore di vettori di dizionari per supportare filtri in forma normale congiuntiva (Conjunctive Normal Form, CNF), che è completa rispetto all'algebra booleana (quindi questo di permette di utilizzare qualsiasi combinazione di filtri senza modificare il codice). È più semplice con un esempio:
    Codice:
    GET search.php?fq[0][0][actor_id]=5
    restituisce tutti e soli i film in cui è presente l'attore con id 5.
    Codice:
    GET search.php?fq[0][0][actor_id]=5&fq[1][0][studio]=X
    restituisce tutti e soli i film in cui è presente l'attore con id 5 e contemporaneamente lo studio è "X". La congiunzione si ha quanto il primo indice di vettore è diverso.
    Codice:
    GET search.php?fq[0][0][actor_id]=5&fq[0][1][studio]=X
    restituisce tutti e soli i film in cui è presente l'attore con id oppure lo studio è X. La disgiunzione si ha quando il primo indice di vettore è uguale.

    Per realizzare la ricerca per attore e tag di cui abbiamo discusso, i parametri da usare sono:
    Codice:
    GET search.php?fq[0][0][actor_id]=5&fq[1][0][studio]=X&fq[1][1][distributor]=X
    nota che il primo indice è 0 per actor_id, mentre è 1 per sudio, distributor: vuol dire che solo questi ultimi saranno "uniti" in forma disgiuntiva.

    Infine, su alcuni campi è necessaria una corrispondenza esatta (esempio: actor_id = 5), mentre su altri vengono cercati prefissi (esempio: studio LIKE "%X%"): puoi decidere su quali campi avere corrispondenza esatta modificando il vettore EXACT_MATCH_FIELDS, tutti gli altri campi verranno cercati con LIKE.

    Intanto prova questo come base. Per le interrogazioni puoi digitare direttamente l'URL nel browser e leggere il JSON risultante (o usare strumenti come PostMan).
    Se funziona si può pensare all'interfaccia grafica, oppure ad altre funzionalità come paginazione o ordinamento dei risultati.

    I suggerimenti che do più spesso:


  27. #57
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    WOW e meno male era lunedi

    non mi e' chiaro come interrogare la ricerca,

    ho creato il file search.php che adesso e' locato a questo indirizzo

    cinema/members/search.php

    ho lanciato e mi esce questo


    Warning: Constants may only evaluate to scalar values in E:\OpenServer\domains\cinema\members\search.php on line 6

    Warning: Constants may only evaluate to scalar values in E:\OpenServer\domains\cinema\members\search.php on line 7

    Warning: Cannot modify header information - headers already sent by (output started at E:\OpenServer\domains\cinema\members\search.php:1) in E:\OpenServer\domains\cinema\members\search.php on line 88
    {"header":{"q":"SELECT * FROM film_actor INNER JOIN film ON film_actor.film_id = film.film_id INNER JOIN actor ON film_actor.actor_id = actor.actor_id GROUP BY movie_title","fq":[],"result_count":742,"time":-1606742545862.1},"results":[null,null,null,null,nul........................... ......(QUI CONTINUA IL NULL)

    grazie

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

    Predefinito

    Warning: Constants may only evaluate to scalar values in E:\OpenServer\domains\cinema\members\search.php on line 6

    Warning: Constants may only evaluate to scalar values in E:\OpenServer\domains\cinema\members\search.php on line 7
    Mh, dimenticavo che le versione antiche di PHP non supportavano ancora l'uso di vettori di costanti. Modifica in:

    Codice PHP:
    <?php
    require_once 'connetti.php';

    ////////////////////////////////////////////////////////////////////////
    // Configuration section
    $searchable_fields = ['movie_title'];
    $exact_match_fields = ['actor_id'];


    ////////////////////////////////////////////////////////////////////////
    // Support functions
    function format_clause($field, $value) {
    global
    $exact_match_fields;
    return
    in_array($field, $exact_match_fields)
    ?
    $field . ' = ' . $value
    : $field . ' LIKE "%' . $value . '%"';
    }

    function
    format_result($row) {
    $result = $row;
    $result['distributor'] = array_filter(array_map('trim', explode(',', $result['distributor'])));
    $result['studio'] = array_filter(array_map('trim', explode(',', $result['studio'])));
    return
    $result;
    }


    ////////////////////////////////////////////////////////////////////////
    // Reads parameters
    $keyword = isset($_REQUEST['q']) ? $_REQUEST['q'] : null;
    $filters = isset($_REQUEST['fq']) && is_array($_REQUEST['fq']) ? $_REQUEST['fq'] : [];


    ////////////////////////////////////////////////////////////////////////
    // Builds query clauses in Conjunctive Normal Form (CNF)
    $clauses = [];

    if (!
    is_null($keyword)) {
    foreach (
    $searchable_fields as $field) {
    $clauses[] = format_clause($field, $keyword);
    }
    }

    foreach (
    $filters as $disjunction) {
    $disjunctive_clause = [];
    foreach (
    $disjunction as $component) {
    foreach (
    $component as $field => $value) {
    $disjunctive_clause[] = format_clause($field, $value);
    }
    }
    $clauses[] = '(' . implode(' OR ', $disjunctive_clause) . ')';
    }


    ////////////////////////////////////////////////////////////////////////
    // Builds query
    $query = 'SELECT * '
    . 'FROM film_actor INNER JOIN film ON film_actor.film_id = film.film_id '
    . 'INNER JOIN actor ON film_actor.actor_id = actor.actor_id ';
    if (!empty(
    $clauses)) {
    $query .= 'WHERE ' . implode(' AND ', $clauses) . ' ';
    }
    $query .= 'GROUP BY movie_title';


    ////////////////////////////////////////////////////////////////////////
    // Runs query
    $start_time = microtime(true);
    $results = [];
    $result = mysql_query($query);
    if (
    $result === false) {
    die(
    'Cannot execute query "' . $query . '": ' . mysql_error());
    }
    while (
    $row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    $results[] = format_result($row);
    }
    $end_time = microtime(false);


    ////////////////////////////////////////////////////////////////////////
    // Outputs results
    $data = [
    'header' => [
    'q' => $keyword,
    'fq' => $filters,
    'result_count' => count($results),
    'time' => ($end_time - $start_time) * 1e3
    ],
    'results' => $results
    ];
    header('Content-Type: application/json');
    echo
    json_encode($data);
    non mi e' chiaro come interrogare la ricerca,
    Per il momento digitando gli URL direttamente nella barra del browser, simili a quelli degli esempi:
    Codice:
    http://cinema.it/search.php?fq[0][0][studio]=X&fq[0][1][distributor]=X

    I suggerimenti che do più spesso:


  29. #59
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    ok, allora prima avevo capito bene inserendo il codice nella barra url, pensavo di avere sbagliato

    dunque, e' sparito l'errore nelle 2 linee ma...


    cinema/members/search.php?fq[0][0][actor_id]=5

    Cannot execute query "SELECT * FROM film_actor INNER JOIN film ON film_actor.film_id = film.film_id INNER JOIN actor ON film_actor.actor_id = actor.actor_id WHERE (actor_id = 5) GROUP BY movie_title": Column 'actor_id' in where clause is ambiguous
    cinema/members/search.php?fq[0][0][actor_id]=5&fq[1][0][studio]=X

    Cannot execute query "SELECT * FROM film_actor INNER JOIN film ON film_actor.film_id = film.film_id INNER JOIN actor ON film_actor.actor_id = actor.actor_id WHERE (actor_id = 5) AND (studio LIKE "%X%") GROUP BY movie_title": Column 'actor_id' in where clause is ambiguous
    Schema database (semplificato, solo essenziali)

    Tabella actor

    actor_id
    nome


    Tabella film

    film_id
    movie_title
    studio
    distributor


    Tabella film_actor

    questa e' in relazione con film e actor

    actor_id
    film_id
    credited
    genre
    Ultima modifica di blackskyisback : 30-11-2020 alle ore 16.12.46

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

    Predefinito

    Ha senso, perché actor_id è un campo usato per una JOIN. Modifica gli URL che chiami in:
    Codice:
    cinema/members/search.php?fq[0][0][actor.actor_id]=5
    cinema/members/search.php?fq[0][0][actor.actor_id]=5&fq[1][0][studio]=X
    Modifica inoltre questa riga
    Codice PHP:
    $exact_match_fields = ['actor_id'];
    in
    Codice PHP:
    $exact_match_fields = ['actor.actor_id'];

    I suggerimenti che do più spesso:


Pagina 2 di 3 PrimoPrimo 123 UltimoUltimo

Tags for this Thread

Regole di scrittura

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