@Chesterfield25

Как получить запись по id и вставить в уже существующий запрос?

У меня есть в бд таблица category и есть запрос который получает id категории далее вставляет запись в таблицу freeroll. Как изменить запрос что бы когда я получаю category_id бралась запись по этому id из таблицы category и значения которые я получаю а это: category_name category_img и category_url так же добавлялись в таблицу freeroll?

Сам запрос
<?php

require_once __DIR__.'/boot.php';

// убеждаемся, что пост-параметр category_id существует, он массив, и в нем есть элементы
if(isset($_POST['category_id']) && is_array($_POST['category_id']) && count($_POST['category_id']) > 0 || isset($_POST['symbol']) && is_array($_POST['symbol']) && count($_POST['symbol']) > 0 || isset($_POST['buyin_symbol']) && is_array($_POST['buyin_symbol']) && count($_POST['buyin_symbol']) > 0)
{

  foreach($_POST['category_id'] as $category_id)
  {

     // вставляем категории в промежуточную таблицу для хранения выбранных категорий
   $stmt = pdo()->prepare("INSERT INTO `freeroll` (`name_turnament`, `prize`, `password`, `data`, `time`, `category_id`, `prize_symbol`, `buyin` , `buyin_symbol`) VALUES (:name_turnament, :prize, :password, :data, :time, :category_id, :prize_symbol, :buyin, :buyin_symbol)");
     $stmt->execute([
    'name_turnament' => $_POST['name_turnament'],
    'prize' => $_POST['prize'],
    'password' => $_POST['password'],
    'data' => $_POST['data'],
    'time' => $_POST['time'],
    'category_id' => $category_id,
    'prize_symbol' => $_POST['symbol'],
    'buyin' => $_POST['buyin'],
    'buyin_symbol' => $_POST['buyin_symbol'],

    ]);
  }
  pdo('commit'); // все категории вставили, консистентность данных достигнута, можно фиксировать транзакцию
} 
else
{
pdo('rollback'); //нет выделенных категорий, если они обязательны, то нужно откатить вставку записи в таблицу faucets. Если нет, то else нужно не использовать
// генерируем сообщение об ошибке, если нужно
}

header('Location: addfreerolls');


Пробовал такой запрос

<?php

require_once __DIR__.'/boot.php';

// убеждаемся, что пост-параметр category_id существует, он массив, и в нем есть элементы
if(isset($_POST['category_id']) && is_array($_POST['category_id']) && count($_POST['category_id']) > 0 || isset($_POST['symbol']) && is_array($_POST['symbol']) && count($_POST['symbol']) > 0 || isset($_POST['buyin_symbol']) && is_array($_POST['buyin_symbol']) && count($_POST['buyin_symbol']) > 0)
{
  
  foreach($_POST['category_id'] as $category_id)
  {

    $stmt = pdo()->prepare("SELECT * FROM 'category' WHERE $category_id VALUE(`name`, `img`, `url`)");
    $stmt->execute([
      'name' => $category_name,
      'img' => $category_img,
      'url' => $category_url,
      ]);

     // вставляем категории в промежуточную таблицу для хранения выбранных категорий
   $stmt = pdo()->prepare("INSERT INTO `freeroll` (`name_turnament`, `prize`, `password`, `data`, `time`, `category_id`, `prize_symbol`, `buyin` , `buyin_symbol`, `category_name`, `category_img`, `category_url`) VALUES (:name_turnament, :prize, :password, :data, :time, :category_id, :prize_symbol, :buyin, :buyin_symbol, :category_name, :category_img, :category_url)");
     $stmt->execute([
    'name_turnament' => $_POST['name_turnament'],
    'prize' => $_POST['prize'],
    'password' => $_POST['password'],
    'data' => $_POST['data'],
    'time' => $_POST['time'],
    'category_id' => $category_id,
    'prize_symbol' => $_POST['symbol'],
    'buyin' => $_POST['buyin'],
    'buyin_symbol' => $_POST['buyin_symbol'],
    'category_name' => $category_name,
    'category_img' => $category_img,
    'category_url' => $category_url,
    ]);
  }
  pdo('commit'); // все категории вставили, консистентность данных достигнута, можно фиксировать транзакцию
} 
else
{
pdo('rollback'); //нет выделенных категорий, если они обязательны, то нужно откатить вставку записи в таблицу faucets. Если нет, то else нужно не использовать
// генерируем сообщение об ошибке, если нужно
}

header('Location: addfreerolls');


но получаю ошибку

[14-Mar-2023 21:37:34 UTC] PHP Notice:  Undefined variable: category_name in /do_addfreerolls.php on line 14
[14-Mar-2023 21:37:34 UTC] PHP Notice:  Undefined variable: category_img in /do_addfreerolls.php on line 15
[14-Mar-2023 21:37:34 UTC] PHP Notice:  Undefined variable: category_url in /do_addfreerolls.php on line 16
[14-Mar-2023 21:37:34 UTC] PHP Fatal error:  Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''category' WHERE 1 VALUE(`name`, `img`, `url`)' at line 1 in /home/bubbmxyq/public_html/poker/freerolls/admins/do_addfreerolls.php:16
Stack trace:
#0 /do_addfreerolls.php(16): PDOStatement->execute(Array)
#1 {main}
  thrown in /do_addfreerolls.php on line 16
  • Вопрос задан
  • 166 просмотров
Решения вопроса 1
@nozzy
Symfony, Laravel, SQL
$stmt = pdo()->prepare("INSERT INTO `freeroll` (`name_turnament`, `prize`, `password`, `data`, `time`, `category_id`, `prize_symbol`, `buyin` , `buyin_symbol`, `category_name`, `category_img`, `category_url`) 
SELECT :name_turnament, :prize, :password, .......... и тд, name, img, url FROM category WHERE id = :category_id");

$stmt->execute([
    'name_turnament' => $_POST['name_turnament'],
    'prize' => $_POST['prize'],
    'password' => $_POST['password'],
    'data' => $_POST['data'],
    'time' => $_POST['time'],
    'prize_symbol' => $_POST['symbol'],
    'buyin' => $_POST['buyin'],
    'buyin_symbol' => $_POST['buyin_symbol'],
    'category_id' => $category_id
	]);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mahmudchon
@mahmudchon
Синтаксис выборки неверный. Для выбора:
"SELECT * FROM `category` WHERE `category_id` = '" . $category_id . '" LIMIT 1";

или еще лучше
"SELECT `name`, `img`, `url` FROM `category` WHERE `category_id` = '" . $category_id . '" LIMIT 1";

Если там у Вас вообще в таблице category поле с наименованием category_id существует. А то мб id, но это вы сможете посмотреть.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы