Décrivez ici votre problème ou ce que vous cherchez à faire.

<?php foreach ($donnees as $ingredients) : ?>
<form>
    <div class="col-lg-3 col-md-4 col-6">
        <div class="d-block mb-4 h-200">
      <label>
        <input type="checkbox" id="img" name="ingredient[]" value="<?= $ingredients['image']; ?>">
      <strong><?php echo  ucfirst($ingredients['nom']); ?></strong>

      </label>
            <img class="img-fluid img-thumbnail" src="ingredients/<?= $ingredients['image']; ?>" alt=""  >

            <input type="text" name="quantity[]" class="k">
       </div>

    </div>
    </form>
     <?php endforeach ?>

     if (!empty($_POST['ingredient']) ) {
        $ingre = $_POST['ingredient'];
        foreach ($ingre as $check ) {
        $quantity = implode(' ',  $_POST['quantity']);
            $res = $bdd->prepare("INSERT INTO ingredientmenus(nomingredient,quantity, idmenu ) VALUES  (?, ?, ?)");
        $res ->execute(array($check, $quantity  , $id ));

Ce que je veux

Je veux recuperer la cette valeur pour l'inserer dans ma base de donne <input type="text" name="quantity[]" class="k">

Ce que j'obtiens
Je n'arrive pas a extraire les donnees comme je le veux pour l'insertion dans ma bdd . svp qui peut m'aider.

12 réponses


où sont les balises <form> ?

Salut ! je les ai pas oublier . Il ne figure pas ici car le formulaire est long. ici le champ input est facultative mais je veux que quant l'utilisateur le rempli , je recupere seulement les champs rempplissent vu qu'il est a l'interieur d'une boucle.

tu peux mettre le formulaire en entier stp

Bonjour.
Je vois mal comment ton formulaire peut fonctionner, pour deux raisons principales :

  1. Il n'y a pas de bouton pour le soumettre
  2. Si tu ne définis pas l'attribut method dans la balise form, le formulaire enverra une requête en GET et non en POST, sauf que tu attends dans le traitement de celui-ci, de reçevoir en POST.

Par conséquent ton formulaire ne peut ni fonctionner, ni être traité (niveau PHP).
Autre chose, les balises d'ouverture et de fermeture de form doivent être situées en dehors de la boucle et non à l'intérieur.
Il ne te faut pas oublier, que la valeur de l'attribut id doit être unique sur une page, ce qui n'est pas le cas avec img pour ton input de type checkbox.
Dernière chose, concernant le dernier input, étant donné qu'il doit servir à renseigner une valeur numérique, il serait plus judicieux d'utiliser un input de type number, ce qui évitera déjà que l'utilisateur puisse y renseigner une valeur de type totalement différent.

VOILA LE FORMULAIR EN ENTIER
''
<form class="wrap-form-reservation size22 m-l-r-auto" action="" method="post" enctype="multipart/form-data" name="fo">
<div class="row">

    <div class="col-md-4">

    </div>
</div>

<div class="row">
    <div class="col-md-4">
        <!-- Name -->
        <span class="txt9">
            Name
        </span>

        <div class="wrap-inputname size12 bo2 bo-rad-10 m-t-3 m-b-23">
            <input class="bo-rad-10 sizefull txt10 p-l-20" type="text" name="menu" placeholder="Name">
        </div>
    </div>

</div>

<div class="row">
    <div class="col-md-4">
        <!-- Name -->
        <span class="txt9">
            Images
        </span>

        <div class="wrap-inputname size12 bo2 bo-rad-10 m-t-3 m-b-23">
            <input class="bo-rad-10 sizefull txt10 p-l-20" type="file" name="image">
        </div>
    </div>

</div>

<div class="row">
    <div class="col-12">
    <!-- Message -->
    <span class="txt9">
        Préparation
    </span>
    <textarea class="bo-rad-10 size35 bo2 txt10 p-l-20 p-t-15 m-b-10 m-t-3" name="preparation" placeholder="La préparation"></textarea>
</div>
</div>

<div class="container">

<h1 class="font-weight-light text-center text-lg-left mt-4 mb-0">Liste des ingredients</h1>
<br>
<?php include_once 'search.php'; ?>

<hr>
<div class="row text-center text-lg-left">

<?php foreach ($donnees as $ingredients) : ?>

<div class="col-lg-3 col-md-4 col-6">
    <div class="d-block mb-4 h-200">
  <label>
    <input type="checkbox" id="img" name="ingredient[]" value="<?= $ingredients['image']; ?>">
  <strong><?php echo  ucfirst($ingredients['nom']); ?></strong>

  </label>
        <img class="img-fluid img-thumbnail" src="ingredients/<?= $ingredients['image']; ?>" alt=""  >

        <input type="text" name="quantity[]" class="k">
   </div>

</div>
 <?php endforeach ?>

</div>
</div>
<!-- /.container -->

<br>
<div class="wrap-btn-booking flex-c-m m-t-6">
<!-- Button3 -->
<input type="submit" name="submit" class="btn3 flex-c-m size13 txt11 trans-0-4">
</input>
</div>
</form>
''
ET MON TRAITENMENT EST LE SUIVANT:
"
<?php
$bdd = new PDO("mysql:host=localhost;dbname=ncordonbleu; charset=utf8", 'root', '');
// Set the PDO error mode to exception
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$recup = $bdd->query('SELECT * FROM ingredients order by nom asc');
$donnees = $recup->fetchAll();

if (isset($_POST['submit'])) {
$target_dir = "images/";
@$target_file = $target_dir . basename($_FILES["image"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

@$check = getimagesize($_FILES["image"]["tmp_name"]);
if($check !== false) {
//echo "File is an image - " . $check["mime"] . ".";
$uploadOk = 1;
} else {
$mg = "File is not an image.";
$uploadOk = 0;
}

// Check if file already exists
if (file_exists($target_file)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}

// Check file size
if (@$_FILES["image"]["size"] > 500000) {
echo "Sorry, your file is too large.";
$uploadOk = 0;
}

// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
$uploadOk = 0;
}

// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
if (move_uploaded_file($_FILES["image"]["tmp_name"], $target_file)) {
//echo "The file ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). " has been uploaded.";
$image=htmlspecialchars( basename( $_FILES["image"]["name"]));

if (!empty($_POST['menu']) and !empty($_POST['preparation'])) {
  $menus = htmlspecialchars($_POST['menu']);
  $preparation = htmlspecialchars($_POST['preparation']);

    $req = $bdd->prepare("INSERT INTO menus(nommenu, preparatione, ladate, nomimage) VALUES 
  (?,?, NOW(), ? )");
$req ->execute(array($menus,$preparation,$image));
 $id = $bdd->lastInsertId();
 var_dump($id);

 $mg = 'Le produit a bien etait enregistre dans la base de donnee';
}
else{
    echo"error ";
}
}

}

if (!empty($_POST['ingredient']) ) {
    $ingre = $_POST['ingredient'];
    $quantity = implode(' ',  $_POST['quantity']); 
    foreach ($ingre as $check ) {
        //var_dump($quantity);
        //var_dump($check); 

        $res = $bdd->prepare("INSERT INTO ingredientmenus(nomingredient,quantity, idmenu ) VALUES  (?, ?, ?)");
    $res ->execute(array($check, $quantity  , $id ));

    $mg = "insertion reussit !";    

}
}
}

?>
"

Mais je n'arrive pas a recuperer la valeur de cet input : <input type="text" name="quantity[]" class="k">

Change le isset($_POST['submit']) en !empty($_POST)

Tous les autres enregistrement marche tresbien sauf celle la <input type="text" name="quantity[]" class="k">

ça te renvoi quoi var_dump($_POST); après le if quand tu soumets le formulaire

ça me renvoi un tableau
je veux pouvoir recuperer les valeur remplient seulement vue que le champ n'est pas obligatoir.
array (size=90)
0 => string '' (length=0)
1 => string '' (length=0)
2 => string '' (length=0)
3 => string '' (length=0)
4 => string '' (length=0)
5 => string '' (length=0)
6 => string 'et' (length=2)
7 => string '' (length=0)
8 => string '' (length=0)
9 => string '' (length=0)
10 => string '' (length=0)

c'est pas normal que ça donne ce tableau,
si tu as bien écrit :

<?php
// Set the PDO error mode to exception

if (!empty($_POST)) {
    var_dump($_POST);
    ...

tu devrais avoir un truc comme ça :

array (size=5)
  'menu' => string '' (length=0)
  'preparation' => string '' (length=0)
  'ingredient' => 
      array (size=1)
        0 => string 'aze' (length=3)
  'quantity' => 
      array (size=5)
        0 => string '54' (length=2)
        1 => string '' (length=0)
        2 => string '' (length=0)
        3 => string '' (length=0)
        4 => string '' (length=0)
  'submit' => string 'Envoyer' (length=7)

Et le tableau renvoyé sera obligatoirement de la même taille que le nombre de input que tu as dans le formulaire, après c'est à toi de prendre ce qui t'intéresse

Bonsoir.
Il y a une ligne de code qui m'a litéralement fait sauté de mon siège:

if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) {

Je vois mal comment un fichier spécifique peut avoir 3 extensions.
Je crois plutôt que tu voulais faire un ou entre chacune des possibilités et non un et, soit || à la place de &&.
Ou alors tu peux simplifier par :

if (!in_array($imageFileType, ['jpg', 'png', 'jpeg', 'gif'])) {

Tu devrais quand même plutôt vérifier le type MIME du fichier (via l'index type) plutôt que son extension, car un type MIME est propre au fichier, contrairement à son extension qui peut être changée par n'importe quoi.
Et donc plutôt faire par exemple:

$type = $_FILE['image']['type'];
if (mb_strcut($type, 0, mb_strpos($type, '/')) !== 'image' || !in_array(mb_strcut($type, mb_strpos($type, '/') + 1), ['jpg', 'png', 'jpeg', 'gif'])) {