簡體   English   中英

將多個復選框插入 MySQL (PDO)

[英]inserting multiple checkboxes into MySQL (PDO)

我目前正在做一個學校項目,我正在嘗試上傳一個食譜的“帖子”。 這包括圖像、標題、說明、成分以及 1 個或多個類別。 他們都插入得很好。 唯一的問題是類別。 即使我 select 多個復選框,它也只插入 1 個類別。 應該將每個復選框插入數據庫中的新行。

我的 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;
}

我的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();
          }
        }
      }
    }
  }
}

這里也有一些用於圖像上傳的代碼,但它不相關,因為它正在工作。

我的 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>

我所知道的:我知道 recipe_id 不是問題。 我對其他 SQL 插件使用相同的方法。 我不想要explode()implode()因為它們在這種情況下不起作用。 嘗試了幾個 foreaches 但還沒有讓它工作,只是還沒有。 它也與括號或逗號或其他無關。

當我有 2 個復選框值時,它只是插入只做一次。 而且我不知道如何在選擇全部 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>

您需要使用category[] ,而不僅僅是category在表單提交中發送多個值。

現在,您可以獲取類別的值

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

如果沒有選中復選框,我已經為類別分配了默認值。

然后使用 php 的內爆 function:

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

或根據您希望在數據庫表中的保存方式使用 foreach 循環:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM