Получить id из связанной таблицы

175
24 ноября 2018, 14:00

Всем привет.

Есть две таблицы

Таблица press

+-------+----------+------------+--------------+
| id    | text     | category   |category_id   |
+-------+----------+------------+--------------+
|       |          |            |              |
+-------+----------+------------+--------------+

Таблица category

+-------+----------+------------+
|     id|      name| img        |
+-------+----------+------------+
|  12   |  facebook|   icon.png |
+-------+----------+------------+
|  13   | football |   ball.png |
+-------+----------+------------+

Используя foreign key я связал ячейку category_id таблицы press с идентификатором (id) другой таблицы (category) чтобы при удалении категории также удалялась информация из другой таблицы press (сделал это я через phpmyadmin поставив on delete cascade)

Вроде все сделал правильно ну вот никак не могу взять id из таблицы category чтобы добавить в другую таблицу press в категорию category_id

if(isset($_POST["submit"])){ //при нажатии на кнопку submit
        $press_text_area =  $_POST["presstextarea"];
        $category_select = $_POST["categoryselect"];
        if(empty($press_text_area)){
            $_SESSION["ErrorMessage"] = "all fields must be field up";
            redirect_to("press.php");
            exit;
        } else if(strlen($press_text_area) < 5){ //name of category can't be 100 symbols cause in DB have a config
            $_SESSION["ErrorMessage"] = "Press info should be at least 5 character's";
            redirect_to("press.php");
            exit;
        } else {
             global $db;
            //  тут мои несчастные попытки вязть идентификатор из таблицы и засунуть в переменную $post_id_from_url
             $post_id_from_url = $_GET["id"];
            //  $category_id = $db->query("SELECT 'id' FROM `category` WHERE id='$post_id_from_url'");

             $db = $db->execute("INSERT INTO `press` (text , category, category_id) VALUES('{$press_text}',
             '{$category_select}','{$post_id_from_url}'");
                if($db){
                    $_SESSION["SuccessMessage"] = "Press added succesfully";
                    redirect_to("press.php");
                }   else {
                    $_SESSION["ErrorMessage"] = "Something went wrong";
                    redirect_to("press.php");
                }
        }
    }

Чтобы не у кого не было вопроса насчет этих $db переменных я покажу файл DB.php там все эти подключения

     Class Database {
         private $link;
         public function __construct() {
            $this->connect();
         }
         private function connect(){
            $config = require_once "config.php";
            $dsn = "mysql:host=".$config["host"].";dbname=".$config["db_name"].";";
            $this->link = new PDO($dsn, $config["username"], $config["password"]);
            return $this;
         }
         public function execute($sql){
            $sth = $this->link->prepare($sql);
            return $sth->execute();
         }
         public function query($sql){
            $sth = $this->link->prepare($sql);
            $sth->execute();
            $result = $sth->fetchAll(PDO::FETCH_ASSOC);
            if($result === false){
                return [];
            }
            return $result;
         }
     }
$db = new Database();

Все в коде работает отлично .Только вот проблема у меня как получить идентификатор

Мои попытки

1.Как и наверху я пыталсья писать так.

$post_id_from_url = $_GET["id"];
            //  $category_id = $db->query("SELECT 'id' FROM `category` WHERE id='$post_id_from_url'");

2.Пыталсья извлечь напрямую таким образом

$category_id = $db->query("SELECT 'id' FROM `category`);

потом эту же переменную добавить как значения для ячейки category_id

3.пыталсья писать так

$category_id = $db->execute("SELECT 'id' FROM `category`);

И еще внизу страницы я получаю все данные из таблицы category включая id (но его не использую )и помещаю в тег select option чтобы выбрать категорию через селект и добавить контент.

после дня серфинга

Такой вывод

$rows = $db->query("SELECT id FROM `category`");
print_r($rows);

Показывает ассоциативный (всех id) массив полученный из БД но как добавить это как значение ?

И форма из которой должна добавлятсья информация .ВНутри select option-а выводитсья все информация из БД соответственно он берет имя каждой категории и идентификатор (которое мы не используем)

<form action="press.php" method="POST">
    <fieldset>

        <label for="categoryselect">Press Category:</label>
        <select class="selectpicker" id="categoryselect" name="categoryselect">
        <?php
            global $db;
            $rows = $db->query("SELECT * FROM `category`");
            foreach ($rows as $row) {
                $name = $row["name"]; 
                $id = $row["id"];        
        ?>
            <option><?php echo $name; ?></option>
        <?php } ?>
        </select>
        <label for="presstextarea">Press Text:</label>
        <input class="pulse" type="text"  name="presstextarea" id="presstextarea" placeholder="Press Text">
        <button type="submit" name="submit">Add Press</button>
    </fieldset>
</form>
Answer 1

Вы так и не смогли объяснить нам, что вы хотите, но тем не менее.

Как я вижу из формы, у вас есть select с именем categoryselect. При сабмите формы значение выбранной опции из этого селекта будет доступно в переменной $_POST["categoryselect"].

Так как у вас наполнение селекта происходит без указания аттрибута value для каждого option, естественно вам в качестве значения $_POST["categoryselect"] возвращается что-то, отличное от ИД категории. Ну так измените вывод селекта, добавьте аттрибут value:

    <select class="selectpicker" id="categoryselect" name="categoryselect">
    <?php
        global $db;
        $rows = $db->query("SELECT * FROM `category`");
        foreach ($rows as $row) {
            $name = $row["name"]; 
            $id = $row["id"];        
    ?>
        <option value="<?php echo $id; ?>"><?php echo $name; ?></option>
    <?php } ?>
    </select>

Теперь, если вы в момент сабмита выведете $_POST["categoryselect"], то он будет содержать выбранное в селекте значение, которое заинсертится в таблицу.

Надеюсь, это вам поможет. А что такое $post_id_from_url = $_GET["id"]; так и осталось загадкой.

Дополнение: во-первых, вы должны понимать что сообщение Something went wrong ни о чем вам не говорит. Требуется использовать функции для получения текстов ошибок. В PDO это errorInfo. Это поможет вам понимать что конкретно не так. Далее, ваш запрос на вставку:

INSERT INTO `press` (text , category, category_id) 
VALUES(
    '{$press_text}',
    '{$category_select}',
    '{$post_id_from_url}'
)

Зачем вы ввели поле (привыкайте к терминологии, ячейки оставьте в Экселе) category? У вас есть поле category_id, его достаточно, поле category можно удалить из таблицы press. Запрос на вставку должен быть таким:

INSERT INTO `press` (`text`, category_id) 
VALUES(
    '{$press_text}',
    '{$category_select}'
)

Замечания:

  • Я взял в бэктики слово text, так как в mysql есть тип данных с таким названием. Не допускайте чтобы служебные, а тем более зарезервированные слова mysql пересекались с вашими запросами.
  • Убрал из инсерта поле category. Оно не требуется в таблице press совсем.
  • Обратите внимание, что если в переменной $press_text будет содержаться кавычка ', то в запросе обнаружится синтаксическая ошибка. Чтобы такого не было - начните сразу пользоваться подготовленными выражениями.
READ ALSO
Ошибка с num_rows &ldquo;Trying to get property of non-object in&rdquo;

Ошибка с num_rows “Trying to get property of non-object in”

Проверяю кол-во записей в запросе

153
Синхронная загрузка данных

Синхронная загрузка данных

Я новичок в PHP и JSПишу некоторый скрипт, который передает запросы на два api

124