如何在请求中像参数一样发送数据库 table 名称并在服务器上的函数中处理它?

How to send database table name like a parameter in the request and handle it in the function on server?

我有自己的 API,一切都很好,但我需要帮助: 我使用了一个函数来获取其参数中的数据库 table 名称,并根据该名称插入数据。 例如:

function InsertData( $Employee,$userId,...) {
$query = INSERT INTO $Employee(...,...,...,...) VALUES (?,?,?,...)
}


function InsertData( $Passenger,$userId,...) {
$query = INSERT INTO $Passenger(...,...,...,...) VALUES (?,?,?,...)
}
public function createPost ($tablename,$userid,$content){

    $postStatement = $this->con->prepare("INSERT INTO '.$tablename.'(userid,content) VALUES (?,?)");
    $postStatement ->bind_param("is",$userid,$content);
    if ($postStatement ->execute()){
        return DONE;
    }else{
        return NOT_DONE;
}

它总是向我显示消息:内部服务器错误

在你的情况下,我会尝试为每个查询创建一个自定义方法。

  1. 确保 PDO 抛出异常:
$host = 'localhost';
$dbname = 'test';
$username = 'root';
$password = '';
$charset = 'utf8mb4';
$collate = 'utf8mb4_unicode_ci';
$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_PERSISTENT => false,
    PDO::ATTR_EMULATE_PREPARES => true,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES $charset COLLATE $collate"
];

$pdo = new PDO($dsn, $username, $password, $options);

然后为每个查询创建一个方法。示例:

public function insertPassenger(string $firstName, string $lastName): int
    $row = [
        'first_name' => $firstName,
        'last_name' => $lastName,
    ];

    $sql = "INSERT INTO passengers SET first_name=:first_name, last_name=:last_name;";
    $this->pdo->prepare($sql)->execute($row);

    return (int)$this->pdo->lastInsertId();
}

public function insertReservation(int flightId, $passengerId): int
    $row = [
        'flight_id' => $flightId,
        'passenger_id' => $passengerId,
    ];

    $sql = "INSERT INTO reservations SET flight_id=:flight_id, passenger_id=:passenger_id;";
    $this->pdo->prepare($sql)->execute($row);

    return (int)$this->pdo->lastInsertId();
}