Pagina 1 di 2 12 UltimoUltimo
Visualizzazione risultati 1 fino 30 di 34
Like Tree16Likes

Discussione: Informazione per uno script in PHP

  1. #1
    Guest

    Predefinito Informazione per uno script in PHP

    Ciao!

    Devo creare uno script in php e mysql che mi mostri sezione, categoria e articoli.
    Mi spiego meglio, ammettiamo che ho un database con 3 tabelle: sezione, categoria, articoli.

    in ogni di queste tabelle ci sono id, nome e id_parente tranne per la tabella sezione.

    esempio:

    Tabella sezione:
    id | nome
    1 | pippo

    Tabella categoria:
    id | nome | id_parente
    1 | pluto | 1 < Questo 1 sta per la tabella sezione

    Tabella articoli:
    id | nome | id_parente
    1 | ciao | 1 < Questo 1 sta per la tabella categoria

    Ora vorrei avere questo risultato ad esempio:

    pippo
    pluto
    ciao

    Devo usare più di un ciclo per fare questo?
    Come potrei fare? Ho provato a sperimentare ma ho avuto solo che errori,
    non so bene come funzionano i cicli e come poter fare una cosa del genere
    grazie in anticipo

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

    Predefinito

    Puoi usare delle JOIN:
    Codice:
    SELECT * FROM (articoli JOIN categoria ON articoli.id_partente = categoria.id) JOIN sezione ON categoria.id_parente = sezione.id WHERE articoli.nome = "ciao";
    PS: Il nome id_parente è un po' fuorviante, probabilmente è una traslitterazione di parent_id, che significa "id del genitore".
    PPS: Considera che questa risposta è stata scritta alle 00:43 di sabato sera, non stupirti se l'interrogazione non funziona al primo colpo !
    knightrider3000 likes this.

  3. #3
    Guest

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Puoi usare delle JOIN:
    Codice:
    SELECT * FROM (articoli JOIN categoria ON articoli.id_partente = categoria.id) JOIN sezione ON categoria.id_parente = sezione.id WHERE articoli.nome = "ciao";
    PS: Il nome id_parente è un po' fuorviante, probabilmente è una traslitterazione di parent_id, che significa "id del genitore".
    PPS: Considera che questa risposta è stata scritta alle 00:43 di sabato sera, non stupirti se l'interrogazione non funziona al primo colpo !
    Innanzitutto grazie della risposta! Ma con questo metodo non c'è bisogno di cicli?

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

    Predefinito

    Se ho inteso correttamente la richiesta no, non servono cicli.

    Se tu volessi invece ottenere lo stesso tipo di informazione per ogni prodotto, dovresti rimuovere la clausola WHERE, ed usare un ciclo per memorizzare i risultati, ad esempio, in un vettore.
    knightrider3000 likes this.

  5. #5
    Guest

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Se ho inteso correttamente la richiesta no, non servono cicli.

    Se tu volessi invece ottenere lo stesso tipo di informazione per ogni prodotto, dovresti rimuovere la clausola WHERE, ed usare un ciclo per memorizzare i risultati, ad esempio, in un vettore.
    Ho provato il codice e mi sono accorto di essermi spiegato male.
    Intendevo che voglio una pagina come questa:

    Tabella regioni:
    id | regione
    1 | Sardegna
    2 | Sicilia

    Tabella provincie:
    id | nome | id_regione
    1 | Cagliari | 1
    2 | Oristano | 1
    3 | Sassari | 1
    4 | Catania | 2

    Tabella paesi:
    id | nome | id_provincia
    1 | Assemini | 1
    2 | Capoterra | 1
    3 | Acireale | 4

    E vorrei che mi stampasse una pagina html
    del genere

    Sardegna

    Cagliari

    Assemini
    Capoterra

    Oristano

    Sassari

    Sicilia

    Catania
    Acireale

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

    Predefinito

    Chiaro, in questo caso la strategia più semplice è recuperare i dati relativi alle regioni, iterare su ciascuna di essere per recuperare i dati relative alle province, ed iterare nuovamente sulle province per leggere i dati relativi ai paesi:
    Codice PHP:
    function recupera_paesi($link, $id_provincia) {
    $query = "SELECT * FROM paesi WHERE id_provincia=" . $id_provincia;
    $result = mysqli_query($link, $query) or die(mysqli_error($link));
    $paesi = mysqli_fetch_all($result, MYSQLI_ASSOC);
    mysqli_free_result($result);
    return
    $paesi;
    }

    function
    recupera_provincie($link, $id_regione) {
    $query = "SELECT * FROM provincie WHERE id_regione=" . $id_regione;
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi ai paesi in ciascuna provincia
    $provincie = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $provincie[$row['nome']] = recupera_paesi($link, $row['id']);
    }
    mysqli_free_result($result);

    return
    $provincie;
    }

    function
    recupera_regioni($link) {
    $query = "SELECT * FROM regioni";
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi alle provincie in ciascuna regione
    $regioni = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $regioni[$row['nome']] = recupera_provincie($link, $row['id']);
    }
    mysqli_free_result($result);

    return
    $regioni;
    }

    ...
    $regioni = recupera_regioni($link);
    Il risultato sarà un vettore associato nella forma:
    Codice:
    $regioni = [
        'Sardegna' => [
            'Cagliari' => [
                ['id' => 1, 'nome' => 'Assemini', 'id_provincia' => 1],
                ['id' => 2, 'nome' => 'Capoterra', 'id_provincia' => 1]
            ],
            'Oristano' => [],
            'Sassari' => []
        ],
        'Sicilia' => [
            'Catania' => [
                ['id' => 3, 'nome' => 'Acireale', 'id_provincia' => 4]
            ]
        ]
    ]
    che potrai stampare facilmente nel formato che preferisci:
    Codice PHP:
    foreach ($regioni as $regione => $provincie) {
    echo
    "Regione: " . $regione . "<br>";
    foreach (
    $provincie as $provincia => $paesi) {
    echo
    "Provincia: " . $provincia . "<br>";
    foreach (
    $paesi as $paese) {
    echo
    $paese['nome'] . " (id: " . $paese['id'] . ")<br>";
    }
    echo
    "<br>";
    }
    echo
    "<br>";
    }
    Controlla che non ci siano errori di sintassi, qualcuno può sempre scappare, ma il succo è quello.
    knightrider3000 likes this.

  7. #7
    Guest

    Predefinito

    Ho provato il tuo codice unendo i due codici php che hai postato:

    Codice PHP:
    <?php

    mysql_connect
    ('localhost', 'root', '');
    mysql_select_db ('prova');

    function
    recupera_paesi($link, $id_provincia) {
    $query = "SELECT * FROM paesi WHERE id_provincia=" . $id_provincia;
    $result = mysqli_query($link, $query) or die(mysqli_error($link));
    $paesi = mysqli_fetch_all($result, MYSQLI_ASSOC);
    mysqli_free_result($result);
    return
    $paesi;
    }

    function
    recupera_provincie($link, $id_regione) {
    $query = "SELECT * FROM provincie WHERE id_regione=" . $id_regione;
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi ai paesi in ciascuna provincia
    $provincie = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $provincie[$row['nome']] = recupera_paesi($link, $row['id']);
    }
    mysqli_free_result($result);

    return
    $provincie;
    }

    function
    recupera_regioni($link) {
    $query = "SELECT * FROM regioni";
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi alle provincie in ciascuna regione
    $regioni = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $regioni[$row['nome']] = recupera_provincie($link, $row['id']);
    }
    mysqli_free_result($result);

    return
    $regioni;
    }

    ...
    $regioni = recupera_regioni($link);

    foreach (
    $regioni as $regione => $provincie) {
    echo
    "Regione: " . $regione . "<br>";
    foreach (
    $provincie as $provincia => $paesi) {
    echo
    "Provincia: " . $provincia . "<br>";
    foreach (
    $paesi as $paese) {
    echo
    $paese['nome'] . " (id: " . $paese['id'] . ")<br>";
    }
    echo
    "<br>";
    }
    echo
    "<br>";
    }
    Ma ricevo il seguente errore: Parse error: syntax error, unexpected '...' (T_ELLIPSIS) in /membri/knightrider3000/index.php on line 42

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

    Predefinito

    Eh sì, alla linea 42 ci sono tre puntini di sospensione "..." che stavano ad indicare "qui metti pure eventuale altro codice che ti serve per la tua pagina" , sottointeso che vanno tolti.

    Altra cosa, il codice che ti ho mostrato usa mysqli per interrogare la base di dati, dunque devi usare sempre mysqli per connetterti, non mysql, che è deprecato e verrà eliminato dalle prossime versioni di PHP.
    knightrider3000 likes this.

  9. #9
    Guest

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Eh sì, alla linea 42 ci sono tre puntini di sospensione "..." che stavano ad indicare "qui metti pure eventuale altro codice che ti serve per la tua pagina" , sottointeso che vanno tolti.

    Altra cosa, il codice che ti ho mostrato usa mysqli per interrogare la base di dati, dunque devi usare sempre mysqli per connetterti, non mysql, che è deprecato e verrà eliminato dalle prossime versioni di PHP.
    Ecco il nuovo codice

    Codice PHP:
    <?php

    mysqli_connect
    ('localhost', 'knightrider3000', '');
    mysqli_select_db ('my_knightrider3000');

    function
    recupera_paesi($link, $id_provincia) {
    $query = "SELECT * FROM paesi WHERE id_provincia=" . $id_provincia;
    $result = mysqli_query($link, $query) or die(mysqli_error($link));
    $paesi = mysqli_fetch_all($result, MYSQLI_ASSOC);
    mysqli_free_result($result);
    return
    $paesi;
    }

    function
    recupera_provincie($link, $id_regione) {
    $query = "SELECT * FROM provincie WHERE id_regione=" . $id_regione;
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi ai paesi in ciascuna provincia
    $provincie = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $provincie[$row['nome']] = recupera_paesi($link, $row['id']);
    }
    mysqli_free_result($result);

    return
    $provincie;
    }

    function
    recupera_regioni($link) {
    $query = "SELECT * FROM regioni";
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi alle provincie in ciascuna regione
    $regioni = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $regioni[$row['nome']] = recupera_provincie($link, $row['id']);
    }
    mysqli_free_result($result);

    return
    $regioni;
    }

    $regioni = recupera_regioni($link);

    foreach (
    $regioni as $regione => $provincie) {
    echo
    "Regione: " . $regione . "<br>";
    foreach (
    $provincie as $provincia => $paesi) {
    echo
    "Provincia: " . $provincia . "<br>";
    foreach (
    $paesi as $paese) {
    echo
    $paese['nome'] . " (id: " . $paese['id'] . ")<br>";
    }
    echo
    "<br>";
    }
    echo
    "<br>";
    }
    Ora da altervista vedo una pagina completamente bianca, è possibile che dipenda da MySQL? Avevo la versione 5.1 su altervista e ho appena chiesto l'aggiornamento alla 5.6

    Per provare, sono andato in locale con XAMPP e messo lo stesso codice che ho messo su Altervista, ma in questo caso non stampa una pagina bianca ma da i seguenti errori:

    Warning: mysqli_select_db() expects exactly 2 parameters, 1 given in C:\xampp2\htdocs\lol\funzione.php on line 4

    Notice: Undefined variable: link in C:\xampp2\htdocs\lol\funzione.php on line 42

    Warning: mysqli_query() expects parameter 1 to be mysqli, null given in C:\xampp2\htdocs\lol\funzione.php on line 30

    Warning: mysqli_error() expects parameter 1 to be mysqli, null given in C:\xampp2\htdocs\lol\funzione.php on line 30
    Ultima modifica di knightrider3000 : 11-06-2017 alle ore 16.17.12

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

    Predefinito

    Può darsi che ci siano degli errori nel codice, non ho avuto modo di provarlo.
    Inserisci
    Codice PHP:
    error_reporting(E_ALL);
    in cima al codice (serve per mostrare tutti gli errori), e
    Codice PHP:
    var_dump($regioni);
    in fondo, ad esempio dopo il foreach.
    knightrider3000 likes this.

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

    Predefinito

    Ho letto ora l'aggiornamento, devi modificare leggermente il codice per la connessione alla base di dati.
    Modifica questo:
    Codice PHP:
    mysqli_connect ('localhost', 'knightrider3000', '');
    mysqli_select_db ('my_knightrider3000');
    in
    Codice PHP:
    $link = mysqli_connect ('localhost', 'knightrider3000', '', 'my_knightrider3000');
    if (!
    $link) {
    echo
    $mysqli_connect_error();
    }
    Segui comunque il consiglio relativo ad error_reporting(E_ALL) che male non fa.
    knightrider3000 likes this.

  12. #12
    Guest

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Ho letto ora l'aggiornamento, devi modificare leggermente il codice per la connessione alla base di dati.
    Modifica questo:
    Codice PHP:
    mysqli_connect ('localhost', 'knightrider3000', '');
    mysqli_select_db ('my_knightrider3000');
    in
    Codice PHP:
    $link = mysqli_connect ('localhost', 'knightrider3000', '', 'my_knightrider3000');
    if (!
    $link) {
    echo
    $mysqli_connect_error();
    }
    Segui comunque il consiglio relativo ad error_reporting(E_ALL) che male non fa.
    Grazie del consiglio! Ho modificato il codice e ora mi stampa:

    Regione:
    Provincia: Catania
    Acireale (id: 3)

    Come mai su regione non stampa Sicilia?

    Poi per vedere gli altri dati, tipo Sardegna, Cagliari, Assemini devo utilizzare un while, giusto?

    -- Aggiornamento --

    Ho capito l'errore, su regione al posto di nome la riga si chiamava regione, ho modificato e ora vedo correttamente questo risultato:

    Regione: Sardegna
    Provincia: Cagliari
    Assemini (id: 1)
    Capoterra (id: 2)

    Provincia: Oristano

    Provincia: Sassari


    Regione: Sicilia
    Provincia: Catania
    Acireale (id: 3)
    Ultima modifica di knightrider3000 : 11-06-2017 alle ore 16.44.10

  13. #13
    Guest

    Predefinito

    @mzanella

    In una parte del codice ho bisogno di fare un ciclo dove cicla 5 volte lo stesso risultato,
    ho provato:

    Codice PHP:
    <?php
    $i
    = 0;

    while (
    $i < 5) {
    $query = "SELECT * FROM paesi";
    $risultati = mysql_query($query);
    $paese = mysqli_result($risultati, $i, "paese");
    echo
    $paese;
    }
    ?>
    Con mysqli non riesco a farlo funzionare, con mysql riuscivo, come posso adattarlo? Grazie
    Ultima modifica di knightrider3000 : 12-06-2017 alle ore 04.38.48

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

    Predefinito

    Troppi errori !

    Nel while che hai usato hai dimenticato l'incremento della variabile, quindi il ciclo non termina mai. Normalmente, se il numero di ripetizioni è fissato a priori, è più pratico usare un ciclo for:
    Codice PHP:
    for ($i = 0; $i < 5; ++$i)
    In questo caso però c'è un'altra considerazione da fare: cosa succede se ci sono meno di 5 paesi nel record set risultante? La cosa più conveniente è indicare nel testo dell'interrogazione di selezionale al massimo 5 risultati, e poi recuperare quelli così ottenuti:
    Codice:
    SELECT * FROM paesi LIMIT 5;
    Stai usando mysqli, non mysql, quindi l'interrogazione deve essere:
    Codice PHP:
    $risultati = mysqli_query($link, $query);
    dove $link è il risultato di un mysqli_connect.

    mysql_result non è una funzione, probabilmente intendevi mysqli_fetch_assoc:
    Codice PHP:
    $paese = mysqli_fetch_result($risultati);
    Il paese ottenuto in questo modo comunque è un vettore associativo, non puoi stamparlo con echo. Se hai bisogno di un attributo specifico usane l'indice: echo $paese['nome'];, se invece ti serve solo una stampa di prova usa var_dump($paese);.

    Ho supposto che per "stesso risultato" intendessi dire che vuoi selezionare, ad esempio, 5 paesi dalla relativa tabella e stamparli. Non devi rieseguire la query 5 volte, eseguila una volta sola e recupera i primi 5 risultati:
    Codice PHP:
    $query = "SELECT * FROM paesi LIMIT 5";
    $risultati = mysqli_query($link, $query) or die(mysqli_error($link));

    while (
    $paese = mysqli_fetch_assoc($risultati)) {
    var_dump($paese);
    }
    knightrider3000 likes this.

  15. #15
    Guest

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Troppi errori !

    Nel while che hai usato hai dimenticato l'incremento della variabile, quindi il ciclo non termina mai. Normalmente, se il numero di ripetizioni è fissato a priori, è più pratico usare un ciclo for:
    Codice PHP:
    for ($i = 0; $i < 5; ++$i)
    In questo caso però c'è un'altra considerazione da fare: cosa succede se ci sono meno di 5 paesi nel record set risultante? La cosa più conveniente è indicare nel testo dell'interrogazione di selezionale al massimo 5 risultati, e poi recuperare quelli così ottenuti:
    Codice:
    SELECT * FROM paesi LIMIT 5;
    Stai usando mysqli, non mysql, quindi l'interrogazione deve essere:
    Codice PHP:
    $risultati = mysqli_query($link, $query);
    dove $link è il risultato di un mysqli_connect.

    mysql_result non è una funzione, probabilmente intendevi mysqli_fetch_assoc:
    Codice PHP:
    $paese = mysqli_fetch_result($risultati);
    Il paese ottenuto in questo modo comunque è un vettore associativo, non puoi stamparlo con echo. Se hai bisogno di un attributo specifico usane l'indice: echo $paese['nome'];, se invece ti serve solo una stampa di prova usa var_dump($paese);.

    Ho supposto che per "stesso risultato" intendessi dire che vuoi selezionare, ad esempio, 5 paesi dalla relativa tabella e stamparli. Non devi rieseguire la query 5 volte, eseguila una volta sola e recupera i primi 5 risultati:
    Codice PHP:
    $query = "SELECT * FROM paesi LIMIT 5";
    $risultati = mysqli_query($link, $query) or die(mysqli_error($link));

    while (
    $paese = mysqli_fetch_assoc($risultati)) {
    var_dump($paese);
    }
    Grazie!! Ora ho un ultimissimo problema, tutti i valori estratti che contengono le lettere accentate si vedono male.. c'è qualche modo per sistemare? grazie

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

    Predefinito

    Occorre intervenire sull'encoding di base di dati e pagine. L'ideale è usare UTF-8 per entrambe.

    Per la base di dati puoi effettuare la modifica tramite PHP myAdmin (eventualmente potresti dover reinserire i record contenenti lettere accentate), per le pagine HTML e PHP basta usare l'apposito tag all'interno dello head:
    Codice HTML:
    <meta charset="UTF-8">
    knightrider3000 likes this.

  17. #17
    Guest

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Chiaro, in questo caso la strategia più semplice è recuperare i dati relativi alle regioni, iterare su ciascuna di essere per recuperare i dati relative alle province, ed iterare nuovamente sulle province per leggere i dati relativi ai paesi:
    Codice PHP:
    function recupera_paesi($link, $id_provincia) {
    $query = "SELECT * FROM paesi WHERE id_provincia=" . $id_provincia;
    $result = mysqli_query($link, $query) or die(mysqli_error($link));
    $paesi = mysqli_fetch_all($result, MYSQLI_ASSOC);
    mysqli_free_result($result);
    return
    $paesi;
    }

    function
    recupera_provincie($link, $id_regione) {
    $query = "SELECT * FROM provincie WHERE id_regione=" . $id_regione;
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi ai paesi in ciascuna provincia
    $provincie = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $provincie[$row['nome']] = recupera_paesi($link, $row['id']);
    }
    mysqli_free_result($result);

    return
    $provincie;
    }

    function
    recupera_regioni($link) {
    $query = "SELECT * FROM regioni";
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi alle provincie in ciascuna regione
    $regioni = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $regioni[$row['nome']] = recupera_provincie($link, $row['id']);
    }
    mysqli_free_result($result);

    return
    $regioni;
    }

    ...
    $regioni = recupera_regioni($link);
    Il risultato sarà un vettore associato nella forma:
    Codice:
    $regioni = [
        'Sardegna' => [
            'Cagliari' => [
                ['id' => 1, 'nome' => 'Assemini', 'id_provincia' => 1],
                ['id' => 2, 'nome' => 'Capoterra', 'id_provincia' => 1]
            ],
            'Oristano' => [],
            'Sassari' => []
        ],
        'Sicilia' => [
            'Catania' => [
                ['id' => 3, 'nome' => 'Acireale', 'id_provincia' => 4]
            ]
        ]
    ]
    che potrai stampare facilmente nel formato che preferisci:
    Codice PHP:
    foreach ($regioni as $regione => $provincie) {
    echo
    "Regione: " . $regione . "<br>";
    foreach (
    $provincie as $provincia => $paesi) {
    echo
    "Provincia: " . $provincia . "<br>";
    foreach (
    $paesi as $paese) {
    echo
    $paese['nome'] . " (id: " . $paese['id'] . ")<br>";
    }
    echo
    "<br>";
    }
    echo
    "<br>";
    }
    Controlla che non ci siano errori di sintassi, qualcuno può sempre scappare, ma il succo è quello.
    A riguardo questo codice, se io volessi stampare gli id delle provincie, come faccio?

  18. #18
    Guest

    Predefinito

    Ho provato a scrivere sotto:

    Codice PHP:
    $provincie[$row['id']] = recupera_paesi($link, $row['id']);
    ma non funziona:/

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

    Predefinito

    Bisogna apportare qualche modifica:
    Codice PHP:
    function recupera_provincie($link, $id_regione) {
    $query = "SELECT * FROM provincie WHERE id_regione=" . $id_regione;
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi ai paesi in ciascuna provincia
    $provincie = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $provincia = $row;
    $provincia['paesi'] = recupera_paesi($link, $row['id']);
    $provincie[] = $provincia;
    }
    mysqli_free_result($result);

    return
    $provincie;
    }
    e poi, nella stampa:
    Codice PHP:
    foreach ($regioni as $regione => $provincie) {
    echo
    "Regione: " . $regione . "<br>";
    foreach (
    $provincie as $provincia) {
    echo
    "Provincia: " . $provincia['nome'] . " (id: " . $provincia['id'] . ")<br>";
    foreach (
    $provincia['paesi'] as $paese) {
    echo
    $paese['nome'] . " (id: " . $paese['id'] . ")<br>";
    }
    echo
    "<br>";
    }
    echo
    "<br>";
    }
    Occhio sempre agli errori di sintassi e simili, possono sempre sfuggire.
    knightrider3000 likes this.

  20. #20
    Guest

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Bisogna apportare qualche modifica:
    Codice PHP:
    function recupera_provincie($link, $id_regione) {
    $query = "SELECT * FROM provincie WHERE id_regione=" . $id_regione;
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi ai paesi in ciascuna provincia
    $provincie = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $provincia = $row;
    $provincia['paesi'] = recupera_paesi($link, $row['id']);
    $provincie[] = $provincia;
    }
    mysqli_free_result($result);

    return
    $provincie;
    }
    e poi, nella stampa:
    Codice PHP:
    foreach ($regioni as $regione => $provincie) {
    echo
    "Regione: " . $regione . "<br>";
    foreach (
    $provincie as $provincia) {
    echo
    "Provincia: " . $provincia['nome'] . " (id: " . $provincia['id'] . ")<br>";
    foreach (
    $provincia['paesi'] as $paese) {
    echo
    $paese['nome'] . " (id: " . $paese['id'] . ")<br>";
    }
    echo
    "<br>";
    }
    echo
    "<br>";
    }
    Occhio sempre agli errori di sintassi e simili, possono sempre sfuggire.
    Provato il codice. Tutto perfetto, grazie.
    Però, visto che i risultati dei paesi sono tanti, stavo pensando che se i paesi sono più di 15
    automaticamente esce un testo sotto i primi 15: Visualizza tutti con il collegamento alla pagina paesi.php.
    Ho provato ad utilizzare mysqli_num_rows mettendolo nella funzione recupera_paesi dello script sufficiente,
    il problema è che restituisce sempre un valore nullo, ho scritto:
    Codice PHP:
    $cont = mysqli_num_rows($results);
    Oltre a questo non sono riuscito a scrivere il testo se supera i 15,
    mi da sempre errori, devo usare un diverso ciclo?

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

    Predefinito

    il problema è che restituisce sempre un valore nullo, ho scritto:
    Codice PHP:
    $cont = mysqli_num_rows($results);
    La variabile si chiama $result, non $results, ecco perché restituisce null.
    In ogni caso, anche inserendola all'interno della funzione, cosa dovrebbe succedere?

    Se vuoi limitare i risultati a 15, è molto più semplice usare LIMIT nel testo della query:
    Codice PHP:
    $query = "SELECT * FROM paesi WHERE id_provincia=" . $id_provincia ." LIMIT 15";
    Alternativamente, puoi usare un for anziché un foreach nella stampa dei paesi, in modo da mostrare solo i primi 15 risultati.
    knightrider3000 likes this.

  22. #22
    Guest

    Predefinito

    Ho corretto results in result e ho provato a stampare una riga fuori dalla funzione dove dovrebbe dire il numero delle righe presenti..
    Il risultato è lo stesso, da sempre errore di Undefined variable count nella riga 17..

    Codice:

    Codice PHP:
    <?php

    $link
    = mysqli_connect ('localhost', 'root', '', 'prova');
    if(!
    $link){
    echo
    $mysqli_connect_error();
    }
    mysqli_set_charset($link, "utf8");

    function
    recupera_paesi($link, $id_provincia) {
    $query = "SELECT * FROM paesi WHERE id_provincia=" . $id_provincia ." LIMIT 2 ";
    $result = mysqli_query($link, $query) or die(mysqli_error($link));
    $paesi = mysqli_fetch_all($result, MYSQLI_ASSOC);
    $cont = mysqli_num_rows($result);
    mysqli_free_result($result);
    return
    $paesi;
    }
    echo
    $cont;

    function
    recupera_provincie($link, $id_regione) {
    $query = "SELECT * FROM provincie WHERE id_regione=" . $id_regione;
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi ai paesi in ciascuna provincia
    $provincie = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $provincie[$row['nome']] = recupera_paesi($link, $row['id']);
    }
    mysqli_free_result($result);

    return
    $provincie;
    }

    function
    recupera_regioni($link) {
    $query = "SELECT * FROM regioni";
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi alle provincie in ciascuna regione
    $regioni = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $regioni[$row['regione']] = recupera_provincie($link, $row['id']);
    }
    mysqli_free_result($result);

    return
    $regioni;
    }

    $regioni = recupera_regioni($link);

    ?><i><?php
    foreach ($regioni as $regione => $provincie) {
    echo
    "<h1><center>Regione: " . $regione . "</center></h1><br>";
    foreach (
    $provincie as $provincia => $paesi) {

    echo
    "<h2><center>Provincia: " . $provincia . "</center></h2><br>";
    }
    foreach (
    $paesi as $paese) {
    echo
    "<h3><center>Paese: " . $paese['nome'] . "</center></h3><br>";
    }
    echo
    "<br>";
    }
    echo
    "<br>";

    ?>
    Ultima modifica di knightrider3000 : 15-06-2017 alle ore 11.43.23

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

    Predefinito

    Non puoi referenziare una variabile dall'esterno del blocco in cui è dichiarata!
    Ciò che è definito dentro una funzione, resta dentro alla funzione.

    Se vuoi sapere quanti paesi sono contenuti in una certa provincia, ti basta contare gli elementi nel vettore:
    Codice PHP:
    echo count($regioni['Sicilia']['Palermo']);
    oppure, se chiamato durante la stampa:
    Codice PHP:
    echo count($paesi);
    knightrider3000 likes this.

  24. #24
    Guest

    Predefinito

    Ho provato ora in locale, tutto bene nel primo caso, ma se metto la modifica al foreach per stampare anche l'id della provincia (che mi serve per il collegamento della pagina con GET mi da il seguente errore.

    Codice:
    Warning: Invalid argument supplied for foreach() in C:\xampp2\htdocs\sistema0\index.php on line 56
    Nel mentre il testo di <a href si vede correttamente e stampa anche il numero.
    Codice:

    Codice PHP:
    <?php

    $link
    = mysqli_connect ('localhost', 'root', '', 'prova');
    if(!
    $link){
    echo
    $mysqli_connect_error();
    }
    mysqli_set_charset($link, "utf8");


    function
    recupera_paesi($link, $id_provincia) {
    $query = "SELECT * FROM paesi WHERE id_provincia=" . $id_provincia ." LIMIT 2 ";
    $result = mysqli_query($link, $query) or die(mysqli_error($link));
    $paesi = mysqli_fetch_all($result, MYSQLI_ASSOC);
    mysqli_free_result($result);
    return
    $paesi;
    }


    function
    recupera_provincie($link, $id_regione) {
    $query = "SELECT * FROM provincie WHERE id_regione=" . $id_regione;
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi ai paesi in ciascuna provincia
    $provincie = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $provincia = $row;
    $provincia['paesi'] = recupera_paesi($link, $row['id']);
    $provincie[] = $provincia;
    }
    mysqli_free_result($result);

    return
    $provincie;
    }

    function
    recupera_regioni($link) {
    $query = "SELECT * FROM regioni";
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi alle provincie in ciascuna regione
    $regioni = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $regioni[$row['regione']] = recupera_provincie($link, $row['id']);
    }
    mysqli_free_result($result);

    return
    $regioni;
    }

    $regioni = recupera_regioni($link);

    ?><i><?php
    foreach ($regioni as $regione => $provincie) {
    echo
    "Regione: " . $regione . "<br>";
    foreach (
    $provincie as $provincia => $paesi) {
    echo
    "Provincia: " . $provincia['nome'] . " (id: " . $provincia['id'] . ")<br>";
    foreach (
    $provincia['paesi'] as $paese) {
    echo
    $paese['nome'] . " (id: " . $paese['id'] . ")<br>";
    }
    echo
    "<br>"; ?>
    <a href="paesi.php?regione=<?php echo $provincia['id'] ?>">Vedi tutti i <?php echo count($paesi) ?> paesi di questa provincia.</a>
    <?php
    }
    echo
    "<br>";
    }
    Ultima modifica di knightrider3000 : 15-06-2017 alle ore 12.28.55

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

    Predefinito

    Codice PHP:
    foreach ($provincie as $provincia => $paesi) {
    va modificato in:
    Codice PHP:
    foreach ($provincie as $provincia) {
    knightrider3000 likes this.

  26. #26
    Guest

    Predefinito

    Avevo provato, ma facendo cosi restituisce questo errore:

    Codice:
    Notice: Undefined variable: paesi in C:\xampp2\htdocs\sistema0\index.php on line 60
    0 di questa provincia.
    Ultima modifica di knightrider3000 : 16-06-2017 alle ore 10.36.29

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

    Predefinito

    Mostra il codice completo aggiornato.
    knightrider3000 likes this.

  28. #28
    Guest

    Predefinito

    Codice PHP:
    <?php

    $link
    = mysqli_connect ('localhost', 'root', '', 'prova');
    if(!
    $link){
    echo
    $mysqli_connect_error();
    }
    mysqli_set_charset($link, "utf8");


    function
    recupera_paesi($link, $id_provincia) {
    $query = "SELECT * FROM paesi WHERE id_provincia=" . $id_provincia ." LIMIT 2 ";
    $result = mysqli_query($link, $query) or die(mysqli_error($link));
    $paesi = mysqli_fetch_all($result, MYSQLI_ASSOC);
    mysqli_free_result($result);
    return
    $paesi;
    }


    function
    recupera_provincie($link, $id_regione) {
    $query = "SELECT * FROM provincie WHERE id_regione=" . $id_regione;
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi ai paesi in ciascuna provincia
    $provincie = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $provincia = $row;
    $provincia['paesi'] = recupera_paesi($link, $row['id']);
    $provincie[] = $provincia;
    }
    mysqli_free_result($result);

    return
    $provincie;
    }

    function
    recupera_regioni($link) {
    $query = "SELECT * FROM regioni";
    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    // Recupera i dati relativi alle provincie in ciascuna regione
    $regioni = array();
    while (
    $row = mysqli_fetch_assoc($result)) {
    $regioni[$row['regione']] = recupera_provincie($link, $row['id']);
    }
    mysqli_free_result($result);

    return
    $regioni;
    }

    $regioni = recupera_regioni($link);

    ?><i><?php
    foreach ($regioni as $regione => $provincie) {
    echo
    "Regione: " . $regione . "<br>";
    foreach (
    $provincie as $provincia) {
    echo
    "Provincia: " . $provincia['nome'] . " (id: " . $provincia['id'] . ")<br>";
    foreach (
    $provincia['paesi'] as $paese) {
    echo
    $paese['nome'] . " (id: " . $paese['id'] . ")<br>";
    }
    echo
    "<br>"; ?>
    <a href="paesi.php?regione=<?php echo $provincia['id'] ?>">Vedi tutti i <?php echo count($paesi) ?> di questa provincia.</a>
    <?php
    }
    echo
    "<br>";
    }

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

    Predefinito

    Ok, in questa situazione suggerirei di lasciare che recupera_paesi recuperi tutti i paesi senza limitazioni, e che sia la stampa a video a decidere la quantità massima da mostrare (in questo esempio 5):
    Codice PHP:
    function recupera_paesi($link, $id_provincia) {
    $query = "SELECT * FROM paesi WHERE id_provincia=" . $id_provincia;
    $result = mysqli_query($link, $query) or die(mysqli_error($link));
    $paesi = mysqli_fetch_all($result, MYSQLI_ASSOC);
    mysqli_free_result($result);
    return $paesi;
    }

    // Le altre funzioni non sono modificate

    $regioni = recupera_regioni($link);

    foreach ($regioni as $regione => $provincie) {
    echo "Regione: " . $regione . "<br>";
    foreach ($provincie as $provincia) {
    echo "Provincia: " . $provincia['nome'] . " (id: " . $provincia['id'] . ")<br>";

    $paesi = $provincia['paesi'];
    $num_paesi = count($paesi);
    for ($i = 0; $i < min(5, $num_paesi); ++$i) {
    $paese = $paesi[$i];
    echo $paese['nome'] . " (id: " . $paese['id'] . ")<br>";
    }
    echo "<br>"; ?>
    <a href="paesi.php?regione=<?php echo $provincia['id'] ?>">Vedi tutti i <?php echo $num_paesi; ?> di questa provincia.</a>
    <?php
    }
    echo
    "<br>";
    }
    Per ogni provincia viene letto il vettore dei paesi in essa contenuta ($paesi), ne vengono contati gli elementi ($num_paesi), ne vengono mostrati i primi 5 (o tutti, se ci sono meno di 5 paesi) ed infine viene mostrato un collegamento ad una pagina che mostrerà tutti i paesi, indicandone anche il numero.

    Non ho avuto modo di provarlo, quindi può darsi che qualche errore di sintassi sia sfuggito.
    knightrider3000 likes this.

  30. #30
    Guest

    Predefinito

    Ho provato, purtroppo funziona anche se è meno di cinque.

Pagina 1 di 2 12 UltimoUltimo

Regole di scrittura

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