@Chesterfield25

Как вставить несколько записей в бд?

У меня есть selected при выборе добавляет к записи id выбранного(ых) магазинов country_id[].

<form class="sign-up-form form" action="do_addshop.php" method="post">
          <label class="form-label-wrapper">
        <p class="form-label">Faucet Category</p>
        <select name="country_id[]" form="data" multiple>
        <?php
    // Получим данные категорий
    $stmt = pdo()->prepare("SELECT * FROM `country`");
    $stmt->execute();
    foreach($stmt as $row){

        echo "<option value=". $row["id"] . "selected>" . $row["name"] . "</option>";

    }
    ?>
    </select>
      </label>
      <label class="form-label-wrapper">
        <p class="form-label">Name Shop</p>
        <input class="form-input" type="text" placeholder="Enter name shop" id="name" name="name" required>
      </label>
      <label class="form-label-wrapper">
        <p class="form-label">Image Url</p>
        <input class="form-input" type="text" placeholder="Enter img url" id="img" name="img" required>
      </label>
      <button class="form-btn primary-default-btn transparent-btn">Add</button>
    </form>

Добавление записи

<?php

require_once __DIR__.'/boot.php';

// Проверим, не занято ли название
$stmt = pdo()->prepare("SELECT * FROM `shop` WHERE `name` = :name");
$stmt->execute(['name' => $_POST['name']]);
if ($stmt->rowCount() > 0) {
    flash('Этот магазин уже существует.');
    header('Location: addshop.php'); // Возврат на форму регистрации
    die; // Остановка выполнения скрипта
}

// Добавим магазин в базу
$stmt = pdo()->prepare("INSERT INTO `shop` (`name`, `img`) VALUES (:name, :img)");
$stmt->execute([
    'name' => $_POST['name'],
    'img' => $_POST['img'],
]);

$stmt = pdo()->lastInsertId();
$shop_id_inserted = $stmt; /*считать вставленный id записи из shop, метод зависит от вида СУБД */

// убеждаемся, что пост-параметр country_id существует, он массив, и в нем есть элементы
if(isset($_POST['country_id']) && is_array($_POST['country_id']) && count($_POST['country_id']) > 0)
{
  foreach($_POST['country_id'] as $country_id)
  {
     // вставляем категории в промежуточную таблицу для хранения выбранных категорий
   $stmt = pdo()->prepare("INSERT INTO `country_shop` (`country_id`, `shop_id`) VALUES (:country_id, :shop_id)");
     $stmt->execute([
    'country_id' => $country_id,
    'shop_id' => $shop_id_inserted]);
  }
  pdo('commit'); // все категории вставили, консистентность данных достигнута, можно фиксировать транзакцию
}
else
{
pdo('rollback'); //нет выделенных категорий, если они обязательны, то нужно откатить вставку записи в таблицу faucets. Если нет, то else нужно не использовать
// генерируем сообщение об ошибке, если нужно
}

При проверке var_dump($country_id); мне приходит массив с значением NULL.
При проверке var_dump($shop_id_inserted); приходит id последней записи.
При проверке var_dump(pdo()->errorInfo()); приходит
array(3) { [0]=> string(5) "00000" [1]=> NULL [2]=> NULL }
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ответы на вопрос 2
@nozzy
Symfony, Laravel, SQL
Multiple Values Insert with PDO Prepared Statements

https://stackoverflow.com/questions/1176352/pdo-pr...
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
При проверке var_dump($country_id); мне приходит массив с значением NULL
Ок, а проверить таким же способом $_POST что мешало?

Путь должен быть от корня сервера, а не просто имя вызываемого файла.

echo "<option =". $row["id"] . "selected>" . $row["name"] . "</option>";
Так у вас получается что ВСЕ опции при старте уже выделены... кроме того - откройте код странички и посмотрите что у вас в value попадает, не факт что там есть значения.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы