Aiuto per php html

Pubblicità

Euroca

Nuovo Utente
Messaggi
47
Reazioni
5
Ciao a tutti, quando non trovo qualcosa che mi comoda me la faccio. E' così che mi sono ritrovato ad avere un sito con altervista per gestire il mio menù settimanale. Sono agli inizi. Per ora ho un form che scrivi Nome e numero della settimana di cui vuoi inserire il menù. Premi invio e si collega a un file php che prima di inserire i dati dentro una tabella del database, fa un controllo se sono già presenti (mi servirà più avanti per la modifica). Prova per vedere se riuscivo ad arrivare fino a qua. Ora vorrei che invece di inserire i dati sulla tabella facesse venire fuori un nuovo form che mi permetta di inserire tutti i vari cibi. Domanda sto form lo devo mettere nel file php o html. (Il secondo form non voglio che si veda fino a quando non si schiaccia sul pulsante Inserisci menù).

Codice:
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="generator" content="AlterVista - Editor HTML"/>
  <title>CARICA MENU'</title>
</head>
<table border="0">
    <tr>
      <td align="center">Inserisci il tuo nome e la settimana del menù</td>
    </tr>
    <tr>
        <form method="post" action="input.php">
            <tr>
                <td>Nome</td>
                <td><input type="text" name="nome" size="20"></td>
            </tr>
            <tr>
                <td>Settimana</td>
                <td><input type="week" name="settimana" size="40"></td>
            </tr>
            <tr>
                <td align="right"><input type="submit" name="submit" value="Scrivi il tuo menù"></td>
            </tr>
         </form>
    </tr>
</table>
</html>

<?
//la stringa mysql_connect deve essere compilata con i dati relativi al proprio database
// HOST = IP server Mysql
// USER = Nome utente databse
// PASSWORD = Password utente database
// DATABASE = il nome del vostro DB
$data=mysqli_connect("localhost","menuespesa","","my_menuespesa");
echo "Connesso: ".mysqli_get_host_info($data);

// recupero i valori si NOME e INDIRIZZO e li assegno alle variabili $name e $address
$nome = $_POST['nome'];
$settimana = $_POST['settimana'];
$settimana1=date("Y/m/d", strtotime($settimana));

//controllo che non sia presente
$checkpresence= mysqli_query($data, 'SELECT Nome, WEEKOFYEAR(Settimana) as sett
                                    FROM Menusettimana WHERE Nome="'.$nome.'" and Settimana="'.$settimana1.'"');
$num=mysqli_num_rows($checkpresence);
if ($num==0) {
  //inserting data order
  $toinsert = "INSERT INTO Menusettimana
              (Nome, Settimana, Giorno,Portata, Cibo, Peso)
              VALUES
              ('$nome',
              '$settimana1',NULL, NULL, NULL, NULL)";
    $result=mysqli_query($data, $toinsert);

    if($result){
        echo("<br>Inserimento avvenuto correttamente");
    } else{
        exit("Errore: impossibile eseguire la query.".mysqli_error($data));
    }
}
else {
    exit("Errore: valori già presenti! Vuoi modificare il tuo menù?");
}

//$result=mysqli_query($data, 'SELECT Nome, WEEKOFYEAR(Settimana) as sett FROM Menusettimana');
//while ($row = mysqli_fetch_array($result)) {
//    echo $row['Nome'].' '.$row['sett'].'<br>';
//}
?>
 
Ultima modifica da un moderatore:
Stai impostando male tutto quanto a mio avviso.
Prima di pensare a proseguire, meglio se sistemi il codice.

Ti conviene avere il file html separato da quello PHP, tanto per iniziare. Inoltre, molto meglio se usi il prepared statement per fare le query; così sei vulnerabile a SQL Injection, visto che non fai nemmeno un controllo sui valori inseriti.

E poi, i dati del DB (la connessione etc) dovrebbero essere messi in un altro file php che richiami all'occorrenza. L'ideale sarebbe usare una classe per gestire tutto ciò che riguarda il DB.

La cosa migliore per fare una cosa così è usare un qualche framework comunque, che gestisce le cose come si deve. Qualcosa come Yii2 se vuoi andare sul semplice, oppure Laravel. Mi rendo conto però sia più complesso per iniziare...

Per altro il codice che riporti ho anche il sospetto non sia proprio tuo tuo.
 
Ciao, grazie mille per la risposta. I file sono due me li a caricati come unico ma in realtà la parte del php è su un altro file. Il codice php è preo un pò di qua e un pò di la.

Comunque ho sistemato un pò seguendo i tuoi consigli. Ma senza utilizzare il mio caso, mi faresti un semplice esempio di come nel file html ci sono due form. Il primo sempre visibile e ils econdo nascosto. Inserisco dei valori nel primo che vanno a richiamare la pagina php che esegue una select sul db e verifica se certi valori sono già presenti nel database. A quel punto solo se non presenti il secondo form diventa visibile.
 
Se vuoi che ti faccio un esempio (ti mostro come cambierei quel codice e come mostrerei i dati), sempre se non mi precede qualcuno, esporta per favore le CREATE TABLES e se ne hai, dei record di prova. Puoi anche fare l'upload direttamente del backup del database, se preferisci (assicurati di non avere dati reali, ovviamente... ma visto che stai iniziando, non penso ce ne siano).

Valgono però le considerazioni fatte sopra: nel 2024 non si scrive direttamente codice PHP "a mano", si usano i framework.
 
Allora grazie mille e ti ringrazio. Ti allego la create e due tre record. Ho creato un ulteriore file php per il discorso della connessione come mi hai consigliato. Perciò in questo momento ho il file CaricaMenu_sett.html che contiene il form numero 1 (Nome e settimana) che richiama input.php che fa un semplice controllo se quella persona ha già inserito un menù per quella settimana. Qui fa un controllo e per ora mi dice se sono già presenti (utilizzando il file connessione.php). Invece di dirmi semplicemente se sono presenti, vorrei che se non ci fossero, renda visibile il form numero 2 del file html che contiene una grande tabellona con vari input per cibo e grammi (ti allego immagine). I dati li ho assegnati a 1 array per ogni giorno e fa l'inserimento di tutto il menù. Devo fare ancora molti controlli sui vari campi.
Riguardo ai dati tranquillo a parte il nome e i cibi non c'è nulla. Riguardo ai framework grazie mille per il consiglio, mi studio un pò quelli che mi hai nominato.
Grazie ancora!
sql di create table:

CREATE TABLE Menusettimana
Nome varchar(20) NOT NULL PRIMARY KEY,
Settimana date NOT NULL PRIMARY KEY,
Giorno Enum (Lunedi, Martedi, Mercoledi, Giovedi, Venerdi) NOT NULL PRIMARY KEY,
Portata Enum (Colazione, Spuntino, Pranzo, Merenda, Cena) NOT NULL PRIMARY KEY,
Cibo varchar(50) NOT NULL PRIMARY KEY,
Peso (decimal)

Devo mettere tutto praticamente nella chiave primaria perchè può capitare che per tre colazioni mangio sempre Yogurt. Esempio di un record:
1719903026690.webp 1719903315147.webp
 
Ultima modifica da un moderatore:
Rispondimi prima ad alcune domande per favore, perchè ho la sensazione ci siano problemi nella struttura del DB (nella sua progettazione).
  • lo stesso menu può ricapitare uguale in futuro?
  • può essere uguale per esempio a pranzo da lun-ven e diverso gli altri due giorni (magari per un tot di tempo)?
Inoltre la colonna settimana ha un campo "date". Non trovo corretto nemmeno questo; non trovo corretto nemmeno l'utilizzo di tutte quelle chiavi primarie sinceramente.

Ma attendo prima che mi rispondi a queste due domande.
 
Mmmm faccio fatica a capire le domande perchè essendo stato poco chiaro probabilmente stiamo ragionando su due linee diverse. Ti rispiego meglio le miei intenzioni e spero di rispondere alle tue domande di conseguenza. L'obiettivo, non sono stato chiaro scusami, è quello di gestire una dieta e di conseguenza creare un menù che rispecchia la dieta. L'utente gestisce la dieta settimanalmente. La dieta è stata proposta all'utente non con una proposta giornaliera per 7 gg e da ripetere ogni settimana. Ma ha una proposta generica per colazione pranzo ecc. e per ogni elemento ha varie alternative. Per esempio se ha fette biscottate a colazione, queste il giorno dopo le può sostituire con un alternativa indicata dal dietologo. Quindi l'utente (Gianni) in base alle alternative si costruisce lui il suo menù ogni giorno. Gianni entra nel sito e scriverà Gianni e la settimana della quale vuole creare il menù (input di tipo week) mettiamo che sia la 28esima settimana. Controllo sul db se Gianni ha già impostato il menù per quella settimana --> Se si lo vedrò successivamente | se no --> gli viene fuori il form 2 (la tabellona con i giorni della settimana e delle righe per le varie portate). L'inserimento non avviene per piatti ma per ingredienti. Per esempio se il lunedi ha pasta al pomodoro a pranzo. Scriverà | pasta | 150 | nella colonna lunedì e nella prima riga della sezione pranzo (vedi tabella allegata messaggio precedente) nella riga successiva scriverà | pomodoro | 50 | a questo punto sul db verrà scritto: Gianni | 5/7/2024 | Lunedi | Pranzo | Pasta | 150 e Gianni | 5/7/2024 | Lunedi | Pranzo | Sugo | 50 . Ovviamente la pasta può ricapitare anche a pranzo il venerdì ma magari con una quantità diversa. Inoltre in effetti ora scrivendo mi rendo conto di essere stato stupido a gestire il campo settimana in input come week. Per poi fare una conversione in data nel primo giorno della relativa settimana. Direi che la cosa migliore è metterlo sulla tabella come integer, che dici?
 
Ultima modifica:
Ok, ora è più chiaro. Piccolo appunto: non fare un text wall, dai un pò di respiro, spazia... altrimenti da leggere è complicato (specie se uno vede "bene" come me). 😁

Quindi ok, mi aspettavo una cosa molto diversa in realtà.
Volevo fare una cosa analoga per un amico anni fa; però se ben ricordo servivano altri dati nel suo caso. Mi spiego: può capitare, in generale, di avere un tipo di pasta (o di alimento, in generale) con determinate caratteristiche, che sono quindi proprietà di quell'alimento? E quindi scegliere poi il tipo in base a questo.

Mi spiego meglio: "Pasta al sugo" avrà caratteristiche (proteine, energia etc etc) diverse da "pasta al pesto", così come ci possono essere variazioni tra "pasta" e "pasta integrale".

Ora ti spiego il motivo delle mie domande e di queste mie osservazioni.
Non è una buona pratica creare un db in quel modo: se hai una tipologia di paasta che una persona può scegliere (tipo, esempio stupido "pasta senza condimento", "pasta sugo pomodoro" ) andrebbero inserite i una tabella a parte con tutti i relativi dati; se tu metti come default che 80gr di pasta al pesto danno 1000 calorie e 50 grassi (sparo numeri a caso) e Gianni deve mangiarne 120, puoi farti la proporzione e ricavare quante calorie e grassi ha mangiato Gianni (perchè magari per Gianni 80 non sono sufficienti).

In questo modo la tua tabella del menu settimanale non sarà più composta in quel modo, ma avrà dei collegamenti (indici, dei numeri) che identificano un elemento di un'altra tabella. Eviti di avere N record ripetuti nella tabella del menu, hai un controllo sulle entità che si possono selezionare / inserire, e puoi fare dei calcoli "nutrizionali" perchè hai dei valori a DB (e appunto, se Gianni inserisce un numero di verso di gr o di quantità in generale, sei in grado di calcolartela).

Inoltre, non so se è per un utente unico, perchè come stai facendo lo è: ti conviene prevedere più utenti. L'utente va fatto loggare per accedere all'applicazione, e gli vanno mostrati i propri dati; questo implica aggiungere un id utente su quelle righe (o creare una tabella associativa... dipende bene da come deve funzionare il tutto).

A questo punto puoi anche permettere di salvare una dieta o salvare anche solo un menu giornaliero o settimanale; così quando lo si compila non si fa tutto ex novo, ma si può precompilare da un database esistente (che la persona stessa ha salvato).

Questo è come si impostano di solito i software di questo tipo... 😉

In merito alla gestione della settimana in sè, trovo che la tabella sia fuorviante; tu con 1 record di quella tabella gestisci 1 giorno della settimana alla fine, non la settimana intera. BTW, a parte ciò, io mi semplificherei la vita usando direttamente una data, senza dover gestire i campi separati come stai facendo. Lato codice tanto recuperi tutto quello che vuoi (eg, il giorno della settimana per esempio) e puoi anche fare un filtro per settimana, se devi cercare.

Il campo "Cibo" di questa tabella a DB, è il medesimo campo cibo che si vede nella griglia dello screenshot? Perchè se è così, valgono tutte le considerazioni fatte sopra.


PS. non so se è si è perso nei commenti, ma se vuoi far apparire il secondo form devi inserire quel codice (meglio se richiami un file php che lo contiene) in quell'else che hai sopra.

Ma in tutta onestà rivaluterei quanto ho scritto qui; cambiare il database ora è facile rispetto a farlo in seguito, così come riscrivere parte del codice.
 
Grazie mille per la risposta!

Allora io l'ho esposta come una cosa anche per altri. In realtà è tutto nato dalla mia dieta e che piuttosto di gestire su un file excel nel quale mi turbava una volta fatto il menù della settimana dover vedere quante volte c'erano le banane e scrivere sulla lista della spesa "banane 5".

Perciò ho detto faccio un sito che una volta inserito il menù premo un pulsante e mi esporta la lista della spesa.
Quindi per ora l'utilizzo è solo per me. Discorso energia ecc poco mi interessa in realtà e per la tipologia semplicemente sul campo cibo invece di pasta metterei pasta integrale. L'input era più veloce piuttosto di inserire pasta in una cella e integrale in un'altra cella. A questo punto non considerando ne il tipo ne le calorie non vedevo senso a fare una tabella solo per il cibo.

Però mi hai convinto a introdurre le calorie ecc. non voglio introdurre il campo "tipo" sul cibo, ma nella tabella cibo ci sarà il record PASTA | Kcal | proteine | ecc. e PASTA INTEGRALE | Kcal | proteine | A questo punto creerò la tabella cibo. Domanda: Posso far in modo che l'utente quando inserisce il cibo gli venga proposta la tabella Cibo? In quesot momento la lista che gli viene proposta è un semplice datelist.

Grazie mille per la spiegazione di dove mettere il form2. Io l'avevo messo sempre sul file html. Grazie.

Riguardo al discorso login per ora è solo per me e anche se per assurdo mi fregano il mio menù settimanale poco mi interessa haha uguale per il discorso statistico non mi interessa. Però grazie mille per tutta la spiegazione!
 
Però mi hai convinto a introdurre le calorie ecc. non voglio introdurre il campo "tipo" sul cibo, ma nella tabella cibo ci sarà il record PASTA | Kcal | proteine | ecc. e PASTA INTEGRALE | Kcal | proteine | A questo punto creerò la tabella cibo. Domanda: Posso far in modo che l'utente quando inserisce il cibo gli venga proposta la tabella Cibo? In quesot momento la lista che gli viene proposta è un semplice datelist.

Bhe, è esattamente ciò che intendevo: avrai una tabella con pasta, pasta integrale, riso, etc etc
Non si lascia mai la libertà di scrivere cose in quel modo nel db; ok che è solo tuo, ma saresti molto più comodo nel selezionare qualcosa invece che doverlo ogni volta digitare (magari anche diverso dalla precedente, eg "Pasta", "pasta").

Non avrai pasta in una cella e integrale in un'altra, avrai 2 record diversi nella tabella "Alimenti" (faccio per dire) a database. Questi avranno un ID autoincrementale che userai per associare l'alimento nella tabella del menu settimanale.

Dov'è quel datelist? Cioè, è a database?

Di solito si popola il menu (una "combo", o select... non ricordo come si chiama) leggendo i dati dall'altra tabella.

Visto che non usi framework, potresti avere una funzione tipo getAlimenti() che ti restituisce tutti gli alimenti e che usi per popolare una select; di solito si usa qualche componente per fare in modo che non ti compaiano direttamente tutti gli elementi, ma si fa in modo siano filtrabili.

Esempio in "pseudo codice":
PHP:
function getAlimenti() {
     $query = "SELECT * FROM tbl_alimenti";
     // fai la query e restituisci i risultati
      return .... ;
}

La chiamerai idealmente prima di popolare la tabella, così almeno fai 1 sola query prima di creare la tabella (il risultato di questa query saranno i valori delle tue select dei cibi, però appunto, tutte saranno uguali).

Ti conviene usare lato front-end qualche framework, tipo Bootstrap, anche se è pesantuccio; una validissima alternativa per comporre le cose è https://tailwindcss.com/
Ci sono già dei componenti fatti come noti https://tailwindui.com/components/application-ui/forms/comboboxes
Sono fatti lato frontend, quindi lato backend devi fare tu la query di ricerca in base a quello che ti arriva dal frontend.

In merito a come mostrare i dati, sta a te; personalmente non la gestirei in quel modo. Preferirei comporre alcuni menu indipendentemente dalla settimana in cui mi trovo, e qui poterli scegliere; se non sono presenti, li si inserisce. Sono convinto che ti ritroveresti ad inserire gli stesi dati più volte (perdendo tempo).

Abbi pazienza, ma tutte le mie osservazioni sono dovute al fatto che ho sviluppato software (web e non) per un un pò di anni... 😁
 
Ok cinciono un pò e vedo se riesco a introdurre un pò i framework.

Il datelist era sulla pagina html. Questa per esempio era una cella dove andavo a inserire un alimento:
<td style="width: 14%; height: 10px;"><input name="lunedi[]" type="text" value="" list="cibi"/></td>

sotto alla fine c'era questo:
<datalist id="cibi">
<option>ACCIUGHE salate</option>
<option>ACCIUGHE sotto olio</option>
<option>AGLIO</option>
<option>AGNELLO</option>
.
.
</datalist>

Domanda: non mi è chiaro come faccio a sostituire i valori della datalist con quelli della tabella Cibo. Chiaro la funzione, ma non il collegamento. Ovviamente dopo quello che mi hai detto questa parte la devo spostare sul file php e non sarà più sulla pagina html.
 
Ok cinciono un pò e vedo se riesco a introdurre un pò i framework.

Il datelist era sulla pagina html. Questa per esempio era una cella dove andavo a inserire un alimento:
<td style="width: 14%; height: 10px;"><input name="lunedi[]" type="text" value="" list="cibi"/></td>

sotto alla fine c'era questo:
<datalist id="cibi">
<option>ACCIUGHE salate</option>
<option>ACCIUGHE sotto olio</option>
<option>AGLIO</option>
<option>AGNELLO</option>
.
.
</datalist>

Domanda: non mi è chiaro come faccio a sostituire i valori della datalist con quelli della tabella Cibo. Chiaro la funzione, ma non il collegamento. Ovviamente dopo quello che mi hai detto questa parte la devo spostare sul file php e non sarà più sulla pagina html.

Se introduci framework lato backend (Laravel per dire) ti conviene fermarti, studiartelo, smanettarci e introdurlo. Dovrai introdurlo partendo praticamente da 0, perchè non è integrabile con quello che stai facendo. Per contro, ti semplifichi di molto la vita su tantissime cose... ad iniziare dalle query al database e dalle creazioni delle tabelle.

Quando pubblichi del codice, usa il tag BBcode "CODE", trovi la spiegazione qui.

Da PHP quando fai la query puoi restituire un array associativo, fingo (per comodità mia) che stai facendo così nella funzione getAlimenti(); nella pagina php che chiama la funzione diciamo che il risultato lo salvi in $alimenti.

PHP:
<td style="width: 14%; height: 10px;"><input name="lunedi[]" type="text" value="" list="cibi"/>
<select name="alimenti" id="alimenti-select">
  <option value="">Scegli un alimento</option>
  <?php foreach($alimenti : $alimento):  ?>
      <option value="<?php  echo $alimento['id']?>"><?php  echo $alimento['name']?></option>
  <?php endforeach; ?>
</select>
</td>

Ci potrebbe essere qualche errore sintattico poichè non uso PHP da più di 1 anno.
Le righe della tabella saranno generate dinamicamente tramite PHP; ogni riga dovrà avere tutti gli identificativi corretti (gli id e i name dei campi HTML), altrimenti quando farai il submit di questo form, non funzionerà (ogni ID deve essere diverso; e i name dovranno essere gestiti come array). Per corretti intendo che devono essere univoci; di solito gli si appende un id autoincrementale che identifica semplicemente il nr di riga.

Dai un occhio a MDN per vedere come fare il submit di dati in questo modo.

Per info, guarda anche:
- https://stackoverflow.com/questions/7880619/multiple-inputs-with-same-name-through-post-in-php
- https://stackoverflow.com/questions/50534299/creating-a-php-table-generator-with-input-fields
 
Pubblicità
Pubblicità
Indietro
Top