j'ai un form qui contient des checkboxs , mais je ne peux pas envoyes les checkboxs selectionner a ma base de donnes

if (isset($_POST['submit'])) {
$toDo=$_POST['ch'];
$sql = "insert into `evenement` values ('','$ligne','$s_voiture','$code','$matricule','$s_conducteur','$un1','$un2','$h_debut','$h_fin','$desc','$lieu',$voie,'$meteo','$toDo')";

  $result = mysqli_query($con, $sql);
  if ($result) {
    echo "Information Inseree";
  } else {
    die(mysqli_error($con));
  }
  //les checkboxs
    <div class="form-group">
        <label class="checkbox-inline"><input type="checkbox" value="int" name="ch[]">Interruption de service</label>
        <label class="checkbox-inline"><input type="checkbox" value="hlp" name="ch[]">HLP</label>
        <label class="checkbox-inline"><input type="checkbox" value="gmao" name="ch[]">GMAO</label>
        <label class="checkbox-inline"><input type="checkbox" value="maj" name="ch[]">Majeur</label>
      </div>
       <button type="submit" class="btn btn-primary" name="submit">Submit</button>

      <?php
        if(isset($_POST['submit'])){
            echo "Les cases suivant sont cochez :<br>" ;
            $chk=implode(",",$_POST['ch']);
            $query="INSERT INTO `evenement` (toDo) values ('$chk')";
        }

       ?> 

Ce que j'obtiens

Pour le moment j'obtiens cet erreur la :
Warning: Array to string conversion in C:\xampp\htdocs\STAGE\PROJECT STAGE\event.php on line 29
Information Inseree
la ligne 29 c'est
$sql = "insert into evenement values ........

11 réponses


Soundboy39
Réponse acceptée

Je me suis permis de réorganiser ton code, je n'ai pas testé donc il y a peut-être encore quelques coquilles, mais sur le principe ça doit fonctionner.

J'ai pris l'habitude de bien séparer les différentes couches de mon code en les regroupant par "métier/language", cette pratique m'a permis de gagner en efficacité.

À toi de voir...

<?php

// -- La partie TRAITEMENT PHP
$postCh = isset($_POST['ch']) ? $_POST['ch'] : array();
$toDo = '';
$sqlInsertResult = FALSE;
if (isset($_POST['submit'])) { // Réception des données envoyées par le formulaire    

    /****
     * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     * IL FAUT IMPERATIVEMENT VALIDER LE CONTENU DE CHAQUE VARIABLE AVANT DE LES INSERER EN BASE DE DONNEES
     * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     * ****/

    $toDo = count($postCh) > 0 ? implode(",", $postCh) : '';
    // la concatenation ci-dessous peut être améliorée en ajoutant des "." pour délimiter les variables et les chaines de caractères, voir https://www.php.net/manual/fr/language.operators.string.php
    $sql = "insert into `evenement` values ('','$ligne','$s_voiture','$code','$matricule','$s_conducteur','$un1','$un2','$h_debut','$h_fin','$desc','$lieu',$voie,'$meteo','$toDo')";

    $sqlInsertResult = mysqli_query($con, $sql);

}
?>
<!-- La partie HTML -->
<?php if(isset($_POST['submit'])) : ?>
    <?php if(strlen($postCh) > 0) : ?>
    <p>Les cases suivante(s) sont cochée(s) :<br /><?php echo $toDo;?></p>
    <?php else : ?>
    <p>Aucune case cochée</p>
    <?php endif; ?>

    <?php if($sqlInsertResult === TRUE) : ?>
    <p>Information Inseree</p>
    <?php else : ?>
    <p><?php echo mysqli_error($con);?></p>
    <?php endif; ?>
<?php endif; ?>
<div class="form-group">
    <label class="checkbox-inline"><input type="checkbox" value="int" name="ch[]">Interruption de service</label>
    <label class="checkbox-inline"><input type="checkbox" value="hlp" name="ch[]">HLP</label>
    <label class="checkbox-inline"><input type="checkbox" value="gmao" name="ch[]">GMAO</label>
    <label class="checkbox-inline"><input type="checkbox" value="maj" name="ch[]">Majeur</label>
</div>
<button type="submit" class="btn btn-primary" name="submit">Submit</button>

bonne journée

Soundboy39
Réponse acceptée

Effectivement je me suis planté, il faut bien utiliser un strlen mais avec $toDo au lieu de $postCh, c'est pour ça que tu avais l'erreur "must be of type string, array given "

En revange ta corection n'est pas bonne, avec ton isset tu vérifie si $postCh est définie, ce qui est toujours le cas.

Le résultat en BDD semble un peu plus cohérent maintenant, après tu sais mieux que moi ce qu'elles sont le valeurs censsées être en base... bref je pense que tu vois le bout du tunnel, en esperant aussi que tu a compris ce que j'ai fait...

Bonjour,

$toDo est un Array au lieu d'être une String, si tu veux la listes des "ch" dans un champ il faut que tu fasse implode comme tu fait plus bas
( php $chk=implode(",",$_POST['ch']);)

Deets
Auteur

Merci pour votre reponse , j'ai fait plus de recherche et apparament j'ai oublier d'ajouter cette ligne ,

        $result = mysqli_query($con, $query);  
                    $row = mysqli_fetch_array($result, MYSQLI_ASSOC);  

mais au moment de submit , et en verifiant la base de donnes j'obtiens 2 lignes ajouter , comme dans cette image
https://imgur.com/3W1JOS3

re,

Je ne vois pas comment l'ajout de ce "mysqli_fetch_array" peut régler le problème initial... d'ailleurs il ne le règle pas puisque dans la ligne insérée on à la valeur "Array" dans le champs "toDo".

Concernant le 2ème problème, en fait c'est normal que cela arrive puisque vous faite 2 INSERT dans le cas où isset($_POST['submit'])" est TRUE.

Donc pour récapituler : voir mon poste précédent pour le problème initial, et supprimer le 2eme INSERT pour le problème de ligne "en double".

Bon courage,

Deets
Auteur

Bonsoir , voila mon essaie j'espere que j'ai bien compris ta suggestion , en faite je suis nouveau en php , desole s'il y a des erreurs .
https://imgur.com/a/xhZtMJj

Pas de souci, moi je me considère comme un nouveau permanent ^^

Du coup, j'ai regardé ta capture... c'est toujours pas bon... est-ce que tu a regardé le résultat en base ? à mon avis tu n'a que des champs vides mis à part le champ "toDo"...

Il faut que tu fasse un seul INSERT avec les champs correctement paramétrés.
Tu a déjà les bons ingrédients, c'est juste une histoire de position des lignes... et comme je suis là pour aider... je vais te laisser deviner tout seul ;-)

Après le conseil que je peux te donner, c'est d'utiliser PDO plutôt que "mysqli", et aussi :

Bon courage,

Deets
Auteur

Le resultat de ce lien du lien precedent est : https://imgur.com/a/xhZtMJj
Toujours le probleme de duplication je ne vois toujours pas ou l'erreur xD , peut etre avec PDO ca etre plus simple , a part si c'est l'emplacement du code php est mauvais .
J'aimerais bien refaire avec PDO mais je crois ca va prendre un peu du temps pour l'apprendre , puisque il me reste une semaine pour mon stage , et j'ai que la partie CRUD du projet a realiser.
Merci pour les ressources !!

Deets
Auteur

Bonjour ,
La premiere insertion est correcte vers la base de donnes , mais je recois cette erreur .
Fatal error: Uncaught TypeError: strlen(): Argument #1 ($str) must be of type string, array given in C:\xampp\htdocs\STAGE\PROJECT STAGE\event.php:257 Stack trace: #0 {main} thrown in C:\xampp\htdocs\STAGE\PROJECT STAGE\event.php on line 257.
la ligne 257 :

<?php if(strlen($postCh) > 0) : ?>
Deets
Auteur

Re , par hasard j'ai reglee ce probleme en remplacant

<?php if(strlen($postCh) > 0) : ?>

par ceci

if(isset($postCh)) : ?>

voila une image de la base de donnes : https://imgur.com/a/WbU1Qvl
je ne sais pas , est-ce que c'est logique ce je viens de faire ou non xD

Deets
Auteur

J'ai une question , pourquoi on a besoin du strlen dans ce cas ?