Вставка значений из одной таблицы в другую таблицу sql и php

В настоящее время я занимаюсь арендой книг с использованием PHP с небольшим количеством ООП. Я пытаюсь вставить информацию из таблицы таблицы (id, bookTitle) и пользователей таблицы (user_id, fullname) в таблицу заимствований, но я не знаю, как это сделать. Я просто новичок в PHP

TABLE BOOK
id | bookId | bookTitle | authorName

TABLE USERS
user_id | uname | upass | fullname | uemail

TABLE BORROWBOOK
borrow_id | borrowDate | returnDate | b_Title | u_Borrower | status | b_id | u_id

u_id и b_id - внешние ключи user_id и id

Вот результат

Изображение 48399

Вот код

<?php
class Borrow {
    public $bookId;
    public $bookTitle;
    public $bookAuthor;
    public $id;

    public $a_id;
    public $authorId;
    public $fName;
    public $lName;

    public $borrow_id;
    public $borrowDate;
    public $returnDate;
    public $b_Title;
    public $u_Borrower;
    public $status;

    private $conn;
    public function __construct($db) {
        $this->conn = $db;
    }

    public function displayAll() {
        $sql = "SELECT * FROM book";
        $stmt = $this->conn->prepare($sql);
        $stmt->execute();

        return $stmt;
    }

    public function displayRequest() {
        $sql = "SELECT * FROM borrowbook";
        $stmt = $this->conn->prepare($sql);
        $stmt->execute();

        return $stmt;
    }

    public function selectBook() {
        $sql = "SELECT * 
                FROM book as A 
                LEFT JOIN borrowbook AS BK ON A.bookId = BK.b_id 
                LEFT JOIN users AS U ON U.user_id = BK.u_id 
                WHERE id = ?";
        
        //$sql = "SELECT * FROM book WHERE id = ?";
        $stmt = $this->conn->prepare($sql);
        $stmt->bindparam(1, $this->id);
        $stmt->execute();

        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        $this->id = $row['id'];
        $this->bookId = $row['bookId'];
        $this->bookTitle = $row['bookTitle'];
        $this->authorName = $row['authorName'];
    }

    public function insertBook() {
        $sql = "INSERT INTO borrowbook SET borrowDate = ?, returnDate = ?";
        $stmt = $this->conn->prepare($sql);
        $stmt->bindparam(1, $this->borrowDate);
        $stmt->bindparam(2, $this->returnDate);
        $stmt->execute();
    }

    public function insertInfo() {
        $sql = "INSERT INTO borrowbook (u_Borrower, b_Title, b_id, u_id) 
                SELECT u.fullname, b.bookTitle, b.id, u.user_id 
                FROM users AS u, book AS b 
                WHERE u.user_id = b.id WHERE id = ?";
        
        $stmt = $this->conn->prepare($sql);
        $stmt->bindparam(1, $this->id);
        $stmt->execute();
    }

    public function readAll($from_record_num, $records_per_page) {
        $sql = "SELECT * FROM book ORDER BY bookId ASC LIMIT {$from_record_num}, {$records_per_page}";
        $stmt = $this->conn->prepare($sql);
        $stmt->execute();

        return $stmt;
    }

    public function countAll() {
        $sql = "SELECT id FROM book";
        $stmt = $this->conn->prepare($sql);
        $stmt->execute();

        $num = $stmt->rowCount();

        return $num;
    }
}
?>
<!-- INSERT INTO `bookborrow`(`b_id`, `b_Title`, `u_Borrower`) VALUES ((SELECT id FROM book WHERE id = 1),(SELECT bookTitle FROM book WHERE id = 1), (SELECT authorName FROM book WHERE id = 1)); -->

<!-- INSERT INTO `borrowbook`(`borrowDate`, `returnDate`, `b_Title`, `u_Borrower`, `status`) VALUES('June 10', 'June 13', (SELECT bookTitle FROM book WHERE id = 1), (SELECT fullname FROM users WHERE user_id = 5), 1) -->
# oop
Источник
  • 2
    В таблице borrowbook не должно быть названия и имени заемщика. Просто используйте внешние ключи и получите имена из исходной таблицы с помощью объединений.
Codelisting
за 1 против

Несколько вещей:

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

Вставьте заимствованную книгу:

public function insertInfo($user_id, $book_id) {
    $sql = "INSERT INTO borrowbook (u_Borrower, b_Title, b_id, u_id) 
            SELECT u.fullname, b.bookTitle, b.id, u.user_id 
            FROM users AS u, book AS b 
            WHERE u.user_id = {$user_id} AND b.id = {$book_id}";
    
    $stmt = $this->conn->prepare($sql);
    $stmt->execute();
}

При обновлении строки используйте UPDATE, а не INSERT. И обязательно включите предложение where, иначе каждая строка будет обновлена.

Обновить книгу:

public function updateBook($user_id, $book_id) {
    $sql = "UPDATE borrowbook SET borrowDate = ?, returnDate = ? WHERE u_id = {$user_id} AND b_id = {$book_id}";
    $stmt = $this->conn->prepare($sql);
    $stmt->bindparam(1, $this->borrowDate);
    $stmt->bindparam(2, $this->returnDate);
    $stmt->execute();
}

Как упоминалось в @Barmar, при объединении таблиц вы хотите хранить только идентификаторы и новую информацию. Не сохраняйте название книги, потому что оно уже хранится в таблице с книгами.

Предпочтительная структура таблицы заимствований такова:

TABLE BORROWBOOK
borrow_id | borrowDate | returnDate | status | b_id | u_id

Если вы переместите статус в таблицу с книгами, вы можете обновить статус с помощью этого метода:

public function setBookStatus() {
    $sql = "UPDATE book SET status = ? WHERE id = ?";
    $stmt = $this->conn->prepare($sql);
    $stmt->bindparam(1, $this->status);
    $stmt->bindparam(2, $this->b_id);
    $stmt->execute();
}

На странице необходимо сохранить идентификатор книги (b_id) для обновления.

  • 0
    Я добавил «статус» в свою таблицу книг и удалил его в таблице заимствований, код обновления работает при обновлении таблицы заимствований, но он не работает, когда я пытался обновить статус в таблице книг
Codelisting
Популярные категории
На заметку программисту