Problema checkbox

di il
6 risposte

Problema checkbox

Buonasera,
ho un problema che per voi sarà banale ma io non ne vengo a capo.
Sto creando un programma in PHP dove vado ad inserire in un form i nomi delle persone con annesso orario da: a: e, tramite una spunta, se sono disponibili a lavorare il lunedì.
Il primo passo inserisco i valori nel DB, i campi sono 'id', 'nome', 'orario_da', 'orario_a', 'lunedi'

Fin qui nessun problema, ho impostato nella pagina di inserimento utente (create.php) i campi nome <input type="text"> ed orario come <input type="time"> e nel DB sono campi varchar(30) mentre il campo lunedi l'ho impostato come <input type="checkbox"> e nel DB varchar(11) così che nella pagina di inserimento utente mi compare il campo lunedì con la possibilità di fare il ceck o meno.

Il problema nasce nella pagina dell'index dove vedo tutto il DB e dove il campo lunedi, che è impostato nel DB come varchar(11), mi restituisce 'on' se la spunta è attiva, io vorrei che apparisse ancora come checkbox.... poi l'inserimento è possibile solo se il flag è attivo.
1.JPG
1.JPG


ma la cosa più grave è che nel momento in cui vado a richiamare per modificare l'utente (es: il lunedì non è più disponibile) il campo mi appare già non selezionato e se clicco sul tasto per aggiornare non mi modifica il campo, non restituisce errore ma non modifica il campo me lo restituisce sempre attivo!!!

2.JPG
2.JPG

Allego il codice della mia pagina principale:
<?php
require 'db.php';
$sql = 'SELECT * FROM people';
$statement = $connection->prepare($sql);
$statement->execute();
$people = $statement->fetchAll(PDO::FETCH_OBJ);
 ?>
<?php require 'header.php'; ?>
<div class="container">
  <div class="card mt-5">
    <div class="card-header">
      <h2>Disponibili:</h2>
    </div>
    <div class="card-body">
      <table class="table table-bordered">
        <tr>
          <th>ID</th>
          <th>Name</th>
          <th>Orario da</th>
          <th>Orario a</th>
          <th>Lunedi</th>
          <th>Modifica</th>
        </tr>
        <?php foreach($people as $person): ?>
    
          <tr>
            <td><?= $person->id; ?></td>
            <td><?= $person->name; ?></td>
            <td><?= $person->orario_da; ?></td>
            <td><?= $person->orario_a; ?></td>
            <td><?= $person->lunedi; ?></td>
            <td>
              <a href="edit.php?id=<?= $person->id ?>" class="btn btn-info">Edit</a>
            </td>
          </tr>
        <?php endforeach; ?>
      </table>
    </div>
  </div>
</div>
e anche quello della pagina che mi permette la modifica
<?php
require 'db.php';
$id = $_GET['id'];
$sql = 'SELECT * FROM people WHERE id=:id';
$statement = $connection->prepare($sql);
$statement->execute([':id' => $id ]);
$person = $statement->fetch(PDO::FETCH_OBJ);

if (isset ($_POST['name'])  && isset($_POST['orario_da']) && isset($_POST['orario_a']) && isset($_POST['lunedi'])) {
  $name = $_POST['name'];
  $orario_da = $_POST['orario_da'];
  $orario_a = $_POST['orario_a'];
  $lunedi = $_POST['lunedi'];
 
  
  $sql = 'UPDATE people SET name=:name, orario_da=:orario_da, orario_a=:orario_a, lunedi=:lunedi WHERE id=:id';
  $statement = $connection->prepare($sql);
  
  if ($statement->execute([':name' => $name, ':orario_da' => $orario_da, ':orario_a' => $orario_a, ':lunedi' => $lunedi, ':id' => $id])) {
    header("Location: /");
  }



}


 ?>
<?php require 'header.php'; ?>
<div class="container">
  <div class="card mt-5">
    <div class="card-header">
      <h2>Aggiorna utente</h2>
    </div>
    <div class="card-body">
      <?php if(!empty($message)): ?>
        <div class="alert alert-success">
          <?= $message; ?>
        </div>
      <?php endif; ?>
      <form method="post">
        <div class="form-group">
          <label for="name">Name</label>
          <input value="<?= $person->name; ?>" type="text" name="name" id="name" class="form-control">
        </div>
        
        <div class="form-group">
          <label for="orario_da">orario_da</label>
          <input type="time" value="<?= $person->orario_da; ?>" name="orario_da" id="orario_da" class="form-control">
        </div>
        
        <div class="form-group">
          <label for="orario_a">orario_a</label>
          <input type="time" value="<?= $person->orario_a; ?>" name="orario_a" id="orario_a" class="form-control">
        </div>
        
        <div class="form-group">
          <label for="lunedi">lunedi</label>
          <input type="checkbox" value="<?= $person->lunedi; ?>" name="lunedi" id="lunedi" class="form-control">
        </div>
        
        <div class="form-group">
          <button type="submit" class="btn btn-info">Aggiorna</button>
        </div>
      </form>
    </div>
  </div>
</div>
Spero mi possiate aiutare con questo problema...
Grazie anticipatamente.

6 Risposte

  • Re: Problema checkbox

    Solo quando selezionato l'agente utente dovrebbe inviare il valore.
    Fai un query DESCRIBE nome_tabella; lì ti indica se la colonna di default è null se in assenza di valore.
    Quindi se Lunedi esiste ed è con valore on devi aggiungere checked quando scrivi il tuo checkbox altrimenti senza checked (non selezionato).
    Puoi effettuare solamente un controllo se tutti i dati sono obbligatori, cioè isset($var1, $var2, $var3); mentre questo sarà con operatore ternario $lunedi = (isset($_POST['lunedi']) ? ($_POST['lunedi'] == 'on' ? 'on' : null) : null); //Puo anche essere assente, nel form ovviamente può solo inviare stringa, quindi trasforma il valore null in off o 0 etc. (Il recupero è nella variabile $lunedi).
  • Re: Problema checkbox

    Innanzitutto ti ringrazio per la rapida risposta, devo dirti che non sono esperto con PHP, tutto il codice l'ho creato da autodidatta provando riprovando e seguendo link vari e forum.
    Detto ciò mi sarebbe d'aiuto un esempio nel codice, quello da modificare credo sia quello della mia index.php....
    Poi ti dirò che il programma prevede, oltre che al lunedì, anche gli altri giorni della settimana ma questa modifica una volta capito come funziona il 'lunedi' la replico io....
    Grazie mille per il tuo aiuto.
  • Re: Problema checkbox

    Edit.php modifica in
    if (isset ($_POST['name'], $_POST['orario_da'], $_POST['orario'])) {
      $name = $_POST['name'];
      $orario_da = $_POST['orario_da'];
      $orario_a = $_POST['orario_a'];
      $lunedi = ($person->lunedi !== null && isset($_POST['lunedi']) ? ($_POST['lunedi'] == 'on' ? 'on' : 'off') : ($person->lunedi == 'on' ? 'off' : 'on')); //Puo anche essere assente
    //resto del tuo codice
    }
    //Salto qualche rigo arrivo al punto.
    
    ?>
    <input type="checkbox" value="<?= ($person->lunedi == 'on' ? 'off' : 'on'); ?>" name="lunedi" id="lunedi" class="form-control" checked>
    Spero ti aiuti.
    L'operatore ternario è un if e else, puoi anche annidarlo.
  • Re: Problema checkbox

    Ho fatto come mi hai suggerito, se edito il rigo dove lunedì è 'on' in aggiorna utente il flag è presente
    3.JPG
    3.JPG

    ma nel momento che lo disattivo e clicco Aggiorna si ricarica la pagina e il flag compare ancora e in più non posso inserire un nuovo utente se il flag è disattivato.
    Ti allego il nuovo file edit.php modificato
    <?php
    require 'db.php';
    $id = $_GET['id'];
    $sql = 'SELECT * FROM people WHERE id=:id';
    $statement = $connection->prepare($sql);
    $statement->execute([':id' => $id ]);
    $person = $statement->fetch(PDO::FETCH_OBJ);
    
    if (isset ($_POST['name'])  && isset($_POST['orario_da']) && isset($_POST['orario_a']) && isset($_POST['lunedi'])) {
      $name = $_POST['name'];
      $orario_da = $_POST['orario_da'];
      $orario_a = $_POST['orario_a'];
      $lunedi = ($person->lunedi !== null && isset($_POST['lunedi']) ? ($_POST['lunedi'] == 'on' ? 'on' : 'off') : ($person->lunedi == 'on' ? 'off' : 'on'));
     
      
      $sql = 'UPDATE people SET name=:name, orario_da=:orario_da, orario_a=:orario_a, lunedi=:lunedi WHERE id=:id';
      $statement = $connection->prepare($sql);
      
      if ($statement->execute([':name' => $name, ':orario_da' => $orario_da, ':orario_a' => $orario_a, ':lunedi' => $lunedi, ':id' => $id])) {
        header("Location: /");
      }
    }
    
     ?>
     
    <?php require 'header.php'; ?>
    <div class="container">
      <div class="card mt-5">
        <div class="card-header">
          <h2>Aggiorna utente</h2>
        </div>
        <div class="card-body">
          <?php if(!empty($message)): ?>
            <div class="alert alert-success">
              <?= $message; ?>
            </div>
          <?php endif; ?>
          <form method="post">
            <div class="form-group">
              <label for="name">Name</label>
              <input value="<?= $person->name; ?>" type="text" name="name" id="name" class="form-control">
            </div>
            
            <div class="form-group">
              <label for="orario_da">orario_da</label>
              <input type="time" value="<?= $person->orario_da; ?>" name="orario_da" id="orario_da" class="form-control">
            </div>
            
            <div class="form-group">
              <label for="orario_a">orario_a</label>
              <input type="time" value="<?= $person->orario_a; ?>" name="orario_a" id="orario_a" class="form-control">
            </div>
            
            <div class="form-group">
              <label for="lunedi">lunedi</label>        
              <input type="checkbox" value="<?= ($person->lunedi == 'on' ? 'off' : 'on'); ?>" name="lunedi" id="lunedi" class="form-control" checked>
              
            </div>
            
            <div class="form-group">
              <button type="submit" class="btn btn-info">Aggiorna</button>
            </div>
          </form>
        </div>
      </div>
    </div>
    non so più che fare...
  • Re: Problema checkbox

    Comunque cambia in $lunedi = (isset($_POST['lunedi']) ? ($_POST['lunedi'] == 'on' ? 'on' : 'off') : ($person->lunedi == 'on' ? 'off' : 'on')); //Puo anche essere assente
    //resto
    Mi dispiace studia il tuo codice al meglio, prima ti ho scitto di eseguire una query DESCRIBE per conoscere il default e tu non hai mai risposto. Quindi per me il supporto è terminato (la prossima volta presterai più attenzione a ciò che leggi e ti viene richiesto).
  • Re: Problema checkbox

    Ok, ti ringrazio comunque,
    comunque non ho ancora capito come funziona la query DESCRIBE... ho provando a cercare sul manuale mysql ma non mi riesce, non so dove inserirla e come farla funzionare.
    Eppure non pensavo che inserire una check box in un form dove se cliccata mi da ON e non cliccata mi da OFF fosse così complicato.
    Va be grazie lo stesso.
Devi accedere o registrarti per scrivere nel forum
6 risposte