简体   繁体   English

将多个复选框插入 MySQL (PDO)

[英]inserting multiple checkboxes into MySQL (PDO)

I'm currently working on a school project and i'm trying to upload a "post" of a recipe.我目前正在做一个学校项目,我正在尝试上传一个食谱的“帖子”。 this includes image, title, instructions,ingredients and also 1 or multiple categories.这包括图像、标题、说明、成分以及 1 个或多个类别。 all of them insert fine and well.他们都插入得很好。 the only issue is with the categories.唯一的问题是类别。 It only inserts 1 category even if I select multiple checkboxes.即使我 select 多个复选框,它也只插入 1 个类别。 It's supossed to insert every checkbox into a new row in the database.应该将每个复选框插入数据库中的新行。

My DAO我的 DAO

public function insertCategory($data, $title) {
    
  if (empty($errors)) {
    $sql = "INSERT INTO `recipes_categories` (`category_id`, `recipe_id`) VALUES(:category_id,:recipe_id);";
    $stmt = $this->pdo->prepare($sql);
    $stmt->bindValue(':category_id', $data['category_id']);
    $stmt->bindValue(':recipe_id', $title['id']);
    if ($stmt->execute()) {
      return $this->selectcategoryById($this->pdo->lastInsertId());
    }
  }
  return false;
}

My Controller (relevant parts)我的Controller(相关零件)


public function upload() {
    
    
  // variabele om foutmelding bij te houden
  $error = '';

  // controleer of er iets in de $_POST zit
  if(!empty($_POST['action'])){
    // controleer of het wel om het juiste formulier gaat
    if($_POST['action'] == 'add-image') {
      // controleren of er een bestand werd geselecteerd
      if (empty($_FILES['image']) || !empty($_FILES['image']['error'])) {
        $error = 'Gelieve een bestand te selecteren';
      }

      if(empty($error)){
          // controleer of het een afbeelding is van het type jpg, png of gif
          $whitelist_type = array('image/jpeg', 'image/png','image/gif');
          if(!in_array($_FILES['image']['type'], $whitelist_type)){
              $error = 'Gelieve een jpeg, png of gif te selecteren';
          }
        }

        if(empty($error)){
        // controleer de afmetingen van het bestand: pas deze gerust aan voor je eigen project
        // width: 270
        // height: 480
        $size = getimagesize($_FILES['image']['tmp_name']);
        if ($size[0] < 100 || $size[1] < 100) {
            $error = 'De afbeelding moet minimum 100x100 pixels groot zijn';
        }
      }

      if(empty($error)){
        // map met een random naam aanmaken voor de upload: redelijk zeker dat er geen conflict is met andere uploads
        $projectFolder = realpath(__DIR__);
        $targetFolder = $projectFolder . '/../assets/ads';
        $targetFolder = tempnam($targetFolder, '');
        unlink($targetFolder);
        mkdir($targetFolder, 0777, true);
        $targetFileName = $targetFolder . '/' . $_FILES['image']['name'];

        // via de functie _resizeAndCrop() de afbeelding croppen en resizen tot de gevraagde afmeting
        // pas gerust aan in je eigen project
        $this->_resizeAndCrop($_FILES['image']['tmp_name'], $targetFileName, 100, 100);
        $relativeFileName = substr($targetFileName, 1 + strlen($projectFolder));
        $data = array(
            'image' => $relativeFileName,
            'title' => $_POST['title'],
            'instructions' => $_POST['stappenplan'],
            'description' => $_POST['ingredienten'],
            'category_id' => $_POST['category'],
        );

        // TODO: schrijf de afbeelding weg naar de database op basis van de array $data

        if (!empty($_POST['action'])) {
          if ($_POST['action'] == 'add-image') {
            // array met data invullen
            $data = array(
              'path' => '/' . $relativeFileName,
              'title' => $_POST['title'],
              'instructions' => $_POST['stappenplan'],
              'description' => $_POST['ingredienten'],
              'category_id' => $_POST['category'],
            );
              
             // aanspreken van de DAO
             $insertImage = $this->uploadDAO->insertImage($data);

             $title = $this->uploadDAO->ImageInsterId($data);
             $this->set('title', $title);

             $ingredientsArray = explode( ',', $data['description'] );
             foreach($ingredientsArray as $ingredient){
               $insertIngredient = $this->uploadDAO->insertIngredients($ingredient , $title);
             }
             
             $insertCategory = $this->uploadDAO->insertCategory($data, $title);
   
        // TODO 2: zorg dat de variabele $error getoond wordt indien er iets fout gegaan is
          if (!$insertImage) {
            $errors = $this->uploadDAO->validate($data);
            $this->set('errors', $errors);
          } else {
            $_SESSION['info'] = 'Thank you for adding a Post!';
            header('Location: index.php?page=detail&id='. $title['id']);
            exit();
          }
        }
      }
    }
  }
}

There is some code here for the image upload too, but it isn't relevant since that is working.这里也有一些用于图像上传的代码,但它不相关,因为它正在工作。

My HTML我的 HTML

    <span class="error"><?php if(!empty($error)){ echo $error;} ?></span>
    <section class="upload_box">
        <h1 class="hidden">upload-form</h1>
        <form method="post" action="index.php?page=upload" enctype="multipart/form-data" class="form__box">
            <input type="hidden" name="action" value="add-image" />
            <div class="form-field">
              <label class="upload__title form_container">Kies een afbeelding
              <span class="error"><?php if(!empty($errors['title'])){ echo $errors['title'];}?></span>
                  <input type="file" name="image" accept="image/png, image/jpeg, image/gif" required  class="upload__button filter__submit input">
              </label>
              </div>
            <div class="form-field">
            <label class="upload__title form_container">Titel
              <span class="error"><?php
               if(!empty($errors['title'])){ 
                 echo $errors['title'];} ?></span>
              <input type="text" name="title" required  class="upload__title form_field input">
            </label>
            </div> 
            <div class="form-field"> 
                <label class="upload__title form_container">Stappenplan
                  <span class="error"><?php if(!empty($errors['instructions'])){ echo $errors['instructions'];} ?></span>
                  <textarea name="stappenplan" id="stappenplan" cols="50" rows="5" required  class="form_field upload__title input"></textarea>
                </label>
            </div>
            <div class="form-field"> 
              
              <label class="upload__title form_container">Ingredienten
              <span class="error"><?php if(!empty($errors['description'])){ echo $errors['description '];} ?></span>
              <input type="text" TextMode="MultiLine" name="ingredienten" maxlength="255" required  class="form_field upload__title input"  id="ingredienten">
            </label>
            </div>
          
            <div class="category_container">
              <label class="category_label filter__button">
              <input class="category_input" type="checkbox" id="pasta" name="category" value="1">
              Pasta</label>

              <label class="category_label filter__button">
              <input class="category_input" type="checkbox" id="veggie" name="category" value="2">
              Veggie</label>

              <label class="category_label filter__button">
              <input class="category_input" type="checkbox" id="vlees" name="category" value="3">
              Vlees</label>
            </div> 
            <div class="form-field">
              <input type="submit" value="uploaden"  class="filter__button filter__submit">
              <input type="reset" value="wissen"  class="filter__button filter__submit">
            </div> 
          </form>
    </section>

<script src="js/validate.js"></script>

What I do know: I know the recipe_id isn't an issue.我所知道的:我知道 recipe_id 不是问题。 I use the same for other SQL inserts.我对其他 SQL 插件使用相同的方法。 I don't want an explode() or implode() as they don't work in this case.我不想要explode()implode()因为它们在这种情况下不起作用。 Tried several foreaches but haven't gotten it to work, just yet.尝试了几个 foreaches 但还没有让它工作,只是还没有。 it's also nothing to do with brackets or comma's or whatever.它也与括号或逗号或其他无关。

It's just the insert only doing it once while I have 2 checkbox values.当我有 2 个复选框值时,它只是插入只做一次。 and I don't know how to make it loop over both or all 3 when all 3 are selected而且我不知道如何在选择全部 3 个或全部 3 个时使其循环

             <div class="category_container">
              <label class="category_label filter__button">
              <input class="category_input" type="checkbox" id="pasta" name="category[]" value="1">
              Pasta</label>

              <label class="category_label filter__button">
              <input class="category_input" type="checkbox" id="veggie" name="category[]" value="2">
              Veggie</label>

              <label class="category_label filter__button">
              <input class="category_input" type="checkbox" id="vlees" name="category[]" value="3">
              Vlees</label>
            </div>

You need to use category[] , rather than just category to send multiple values in form submit.您需要使用category[] ,而不仅仅是category在表单提交中发送多个值。

Now, you can fetch the values of categories现在,您可以获取类别的值

$categories = (is_array($_POST['category'])) ? $_POST['category'] : [];

I have assigned categories a default value if there is no checkbox selected.如果没有选中复选框,我已经为类别分配了默认值。

Then use implode function of php:然后使用 php 的内爆 function:

$categories_string = implode(',', $categories);

or use a foreach loop based on how you want to save in your database table:或根据您希望在数据库表中的保存方式使用 foreach 循环:

foreach ($category as $category)
{
  //use each category
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM