PHP Database Problema d'estrazione dati da database

Daniele internauta

Utente Bronze
7 Ottobre 2018
25
5
4
32
BuonPomeriggio !
Ho un problema di logica al quale non ne vengo a capo da 3 gg.
Ho un database sqlite3
con 4 tabelle relazionate
Codice:
TABELLA "Cliente":

"Id": campo intero auto-incrementante e chiave primaria
"richiedente": campo di testo per indicare il richiedente
"indirizzo_lavori": campo di testo per indicare l'indirizzo dei lavori
TABELLA "schede":

"id": campo intero auto-incrementante e chiave primaria
"cliente_id": campo intero per collegare la scheda al cliente corrispondente (chiave esterna)
"data_richiesta": campo di testo per indicare la data di richiesta
"data_esecuzione": campo di testo per indicare la data di esecuzione
"totale": campo numerico per indicare il totale
Vincolo di chiave esterna: il campo "cliente_id" fa riferimento alla colonna "id" della tabella "Cliente"
TABELLA "interventi":

"id": campo intero auto-incrementante e chiave primaria
"scheda_id": campo intero per collegare l'intervento alla scheda corrispondente (chiave esterna)
"intervento": campo di testo per indicare l'intervento
"costo_intervento": campo numerico per indicare il costo dell'intervento
Vincolo di chiave esterna: il campo "scheda_id" fa riferimento alla colonna "id" della tabella "schede"
TABELLA "materiali":

"id": campo intero auto-incrementante e chiave primaria
"intervento_id": campo intero per collegare il materiale all'intervento corrispondente (chiave esterna)
"materiale_impiegato": campo di testo per indicare il materiale impiegato
"costo_materiale": campo numerico per indicare il costo del materiale
Vincolo di chiave esterna: il campo "intervento_id" fa riferimento alla colonna "id" della tabella "interventi"

che estraggo in php con dei cicli annidati
Codice:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        table {
            width: 793.7008874px;
        }

        td {
            border: 1px solid black;
            padding: 10px;
        }
    </style>
<?php
$database = 'LavoriDB.db';

if (!file_exists($database)) {

    $db = new SQLite3($database);

    $db->exec('CREATE TABLE IF NOT EXISTS "Cliente" (
        "Id" INTEGER PRIMARY KEY AUTOINCREMENT,
        "richiedente" TEXT,
        "indirizzo_lavori" TEXT
    )');
    $db->exec('CREATE TABLE IF NOT EXISTS "schede" (
        "id" INTEGER PRIMARY KEY AUTOINCREMENT,
        "cliente_id" INTEGER,
        "data_richiesta" TEXT,
        "data_esecuzione" TEXT,
        "totale" REAL,
        FOREIGN KEY(cliente_id) REFERENCES Cliente(id)
    )');
    $db->exec('CREATE TABLE IF NOT EXISTS "interventi" (
        "id" INTEGER PRIMARY KEY AUTOINCREMENT,
        "scheda_id" INTEGER,
        "intervento" TEXT,
        "costo_intervento" REAL,
        FOREIGN KEY(scheda_id) REFERENCES schede(id)
    )');
    $db->exec('CREATE TABLE IF NOT EXISTS "materiali" (
        "id" INTEGER PRIMARY KEY AUTOINCREMENT,
        "intervento_id" INTEGER,
        "materiale_impiegato" TEXT,
        "costo_materiale" REAL,
        FOREIGN KEY(intervento_id) REFERENCES interventi(id)
    )');
    $db->close();
}

echo "php";
$db = new SQLite3($database);

if (file_exists($database)) {
    $query = "SELECT * FROM Cliente";
    $result = $db->query($query);

    while ($cliente = $result->fetchArray(SQLITE3_ASSOC)) {
        echo '<table>
            <tr>
                <td colspan="1">'.$cliente['richiedente'].'</td>
                <td colspan="2">'.$cliente['indirizzo_lavori'].'</td>
                <td colspan="1">Intestazione </td>
            </tr>
            <tr>
                <td colspan="2">Interventi</td>
                <td colspan="2">Materiali</td>
            </tr>';

        $query_schede = "SELECT * FROM schede WHERE cliente_id = " . $cliente['Id'];
        $result_schede = $db->query($query_schede);

        while ($scheda = $result_schede->fetchArray(SQLITE3_ASSOC)) {
            $data_richiesta = $scheda['data_richiesta'];
            $data_esecuzione = $scheda['data_esecuzione'];
            $totale = $scheda['totale'];

            $query_interventi = "SELECT * FROM interventi WHERE scheda_id = " . $scheda['id'];
            $result_interventi = $db->query($query_interventi);

            while ($intervento = $result_interventi->fetchArray(SQLITE3_ASSOC)) {
                echo "<tr>
                    <td colspan='2'>".$intervento['intervento']."</td>";

                $query_materiali = "SELECT * FROM materiali WHERE intervento_id = " . $intervento['id'];
                $result_materiali = $db->query($query_materiali);

                while ($materiale = $result_materiali->fetchArray(SQLITE3_ASSOC)) {
                    $materiale_imp = $materiale["materiale_impiegato"];
                    $costo_materiale = $materiale["costo_materiale"];
                    echo "<td colspan='2'>Materiale: ".$materiale_imp."</td></tr>";
                }
                echo "";
            }
        }
    }
}
?>
</head>
<body>
    <h1>Tabella di esempio</h1>
    <table>
        <tr>
            <td colspan="1">Cliente </td>
            <td colspan="2">indirizzo lavori </td>
            <td colspan="1">Intestazione </td>
        </tr>
        <tr>
            <td colspan="2">Interventi</td>
            <td colspan="2">Materiale</td>
        </tr>

        <tr>
            <td colspan="2">$intervento['intervento']</td>
            <td colspan="2">$materiale["materiale_impiegato"]</td>
        </tr>
    <tr>
            <td colspan="1">Prima colonna</td>
            <td colspan="1">Seconda colonna</td>
            <td colspan="1">Terza colonna</td>
            <td colspan="1">Quarta colonna</td>
        </tr>
    </table><br>
</body>
</html>


Il problema si pone ,perche devo rispettare la formattazione della tabella di visualizzazione dove ho un riga che è divisa in due colonne "Interventi e Materiali" che con la struttura che ho creato non riesco a combinare , se cambiassi la formattazione e mettessi i due campi in due righe diverse il tutto funzionerebbe . Considerando che i dati inseriti possono essere diversi fra loro .
Adesso la domanda è , secondo voi, come dovrei strutturare il tutto per avere il risultato voluto?
 
Se ho capito correttamente, desideri combinare i campi "Interventi" e "Materiali" in una singola riga divisa in due colonne. Attualmente, stai visualizzando i campi in righe separate per ciascun intervento e materiale, il che causa una formattazione indesiderata.

Una possibile soluzione potrebbe essere quella di utilizzare celle di dimensioni variabili per combinare i campi "Interventi" e "Materiali" in una singola riga. Puoi farlo aggiungendo una variabile booleana per tenere traccia se stai attualmente visualizzando la sezione "Interventi" o "Materiali". In base al valore di questa variabile, puoi impostare la larghezza delle celle delle colonne corrispondenti nella tabella.

Ecco come puoi modificare il tuo codice per ottenere il risultato desiderato:
Codice:
<?php
// ... Il tuo codice precedente ...

$interventiShown = false; // Variabile per tenere traccia se stai visualizzando la sezione "Interventi" o "Materiali"

while ($intervento = $result_interventi->fetchArray(SQLITE3_ASSOC)) {
    if (!$interventiShown) {
        // Inizia la riga per "Interventi" e "Materiali"
        echo '<tr>';
        echo '<td colspan="2">' . $intervento['intervento'] . '</td>';
        $interventiShown = true;
    } else {
        // Continua la riga per "Interventi" e "Materiali"
        echo '<td colspan="2">Materiale: ' . $materiale_imp . '</td>';
        echo '</tr>';
        $interventiShown = false;
    }

    // ... Il tuo codice precedente ...
}

// ... Il tuo codice precedente ...
?>

Con questa modifica, stai controllando se hai già mostrato la sezione "Interventi" o "Materiali" e imposti correttamente il colspan delle celle corrispondenti. Inoltre, apri e chiudi la riga solo quando hai mostrato entrambe le sezioni.

Spero che questa soluzione sia ciò che stai cercando e che possa aiutarti a raggiungere il risultato desiderato nella formattazione della tabella.



Questo messaggio è stato interamente scritto da ChatGPT, non metto mano da un po' sui codici e non sapevo come indirizzarti. Mi è sembrata una bell'occasione per provare a far rispondere l'AI.
 
Interessante !
E' tre giorni che comunico con ChatGPT ma non mi ha mai offerto questa soluzione , neanche quando gli ho sottoposto un copia incolla di questo post , dove ha capito il problema , proponendomi una soluzione con rowspan che non risolve il problema comunque . A differenza della tua analisi , dove non ha capito che la soluzione su singola riga l'avevo gia trovata ma non soddisfaceva le aspettative di avere i due campi esattamente nella stessa riga (affiancati)
Che versione hai usato ? Era un task nuovo ? Intendo di chatgpt , io ho usato la 3 free
 
Ciao, mi sono limitato a copiare ed incollare il quesito così come lo hai posto qui su Inforge sull'ultima versione disponibile gratuitamente di ChatGPT.