Niente, sembra che nessuno ha piu' voglia d'aiutarmi
peccato
Niente, sembra che nessuno ha piu' voglia d'aiutarmi
peccato
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.naturalmente deve essere eseguito in realtime, quindi il problema e come filtrare i tag dopo aver premuto uno dei pulsanti?
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
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:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
Tralasciando il realtime come passo il GET a questo collegamento?
questo sarebbe il codiceCodice PHP:
echo "<a href='film_tags_s_d.php?tag=$ok' target='_blank''>$ok </a> ";
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 </a> ";
}
?>
</p>
Devi passare anche l'actor id se vuoi usarlo:
posto che $actor_id contenga l'id dell'attore.Codice PHP:
echo "<a href='film_tags_s_d.php?tag=$ok&actor_id=$actor_id' target='_blank''>$ok </a> ";
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
ok, forse ho capito, domani ci lavoro e ti faccio sapere
grazie
mzanella
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
HO provato ad aggiungere all'inizio della pagina questo ulteriore codiceCodice 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 ) ) : ?>
il risultato non cambia, i tag vengono visualizzati tutti per categoria e non per categoria/attoreCodice 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);
?>
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).Rieccomi, scusate il ritardo ma gli impegni chiamano,
Stando a questo codice
la pagina film_tags_s_d.php riceve due parametri, tramite GET: actor_id e tag.Codice PHP:
echo "<a rel='nofollow' href='film_tags_s_d.php?tag=$ok&actor_id=$actor_id' target='_blank''>$ok *</a> ";
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:
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 inCodice 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)) : ?>
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:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
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
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:1) come faccio a switchare tra tag con filtro/attore a tag con filtro generale senza fare due codici?
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)) : ?>
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.2)come effettuare il conteggio dei tag?
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
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
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:1) e lo switch come lo effettuo? avevo proposto tramite un button in cui selezionandolo cambia lo stato del link
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?Codice PHP:
echo "<a rel='nofollow' href='film_tags_s_d.php?tag=$ok' target='_blank'>$ok *</a> ";
Mi sa che non ho capito prova con un esempio.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?
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
ok, chiaro per la selezione dei tag, ma per la selezione dell'attore?guarda gli screen
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?conteggio risultati per singolo tag
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:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
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:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
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
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:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
una cosa simile a questo
https://yadi.sk/d/x5b6B4pTeVJH8w
Ultima modifica di blackskyisback : 27-11-2020 alle ore 14.26.45
Sì, qualcosa del genere, con l'aggiunta della ricerca per attore.
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
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:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
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
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
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
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.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);
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:
restituisce tutti e soli i film in cui è presente l'attore con id 5.Codice:GET search.php?fq[0][0][actor_id]=5
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[1][0][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.Codice:GET search.php?fq[0][0][actor_id]=5&fq[0][1][studio]=X
Per realizzare la ricerca per attore e tag di cui abbiamo discusso, i parametri da usare sono:
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.Codice:GET search.php?fq[0][0][actor_id]=5&fq[1][0][studio]=X&fq[1][1][distributor]=X
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:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
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
Mh, dimenticavo che le versione antiche di PHP non supportavano ancora l'uso di vettori di costanti. Modifica in: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
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);Per il momento digitando gli URL direttamente nella barra del browser, simili a quelli degli esempi:non mi e' chiaro come interrogare la ricerca,
Codice:http://cinema.it/search.php?fq[0][0][studio]=X&fq[0][1][distributor]=X
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
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
cinema/members/search.php?fq[0][0][actor_id]=5&fq[1][0][studio]=XCannot 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
Schema database (semplificato, solo essenziali)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
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
Ha senso, perché actor_id è un campo usato per una JOIN. Modifica gli URL che chiami in:
Modifica inoltre questa rigaCodice: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
inCodice PHP:
$exact_match_fields = ['actor_id'];
Codice PHP:
$exact_match_fields = ['actor.actor_id'];
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.