【问题标题】:How to create rest API GET method in php using multiple filter如何使用多个过滤器在 php 中创建 rest API GET 方法
【发布时间】:2022-12-13 10:04:33
【问题描述】:

我使用参数 id 在 php 中创建了一个 rest API GET 方法。 http://localhost:8012/REST-API/items/expenses?id=2。这工作正常,但我想使用 http://localhost:8012/REST-API/items/expenses?id=2&year=2022 获取数据。我是 php 的新手,尝试了所有的可能性,但没有得到正确的回应。这是下面的代码

/class 文件中的 Expenses.php

<?php
class Expenses{   
    private $expensesTable = "expenses";      
    public $id;
    public $month;
    private $amount;
    public $year;
    
    public function __construct($db){
        $this->conn = $db;
    }   

    function expenses(){    
        if($this->year) {
            $stmt = $this->conn->prepare("SELECT * FROM ".$this->expensesTable." WHERE year = ?");
            $stmt->bind_param("i", $this->year);                    
        } 
        else if($this->id) {
            $stmt = $this->conn->prepare("SELECT * FROM ".$this->expensesTable." WHERE id = ?");
            $stmt->bind_param("i", $this->id);                  
        }
        else if($this->id && $this->year) {
            $stmt = $this->conn->prepare("SELECT * FROM ".$this->expensesTable." WHERE id = ? AND year= ?");
            $stmt->bind_param("i", $this->id,$this->year);                  
        }

        else {
            $stmt = $this->conn->prepare("SELECT * FROM ".$this->expensesTable);        
        }       
        $stmt->execute();           
        $result = $stmt->get_result();      
        return $result; 
    }
}
?>

readexpenses.php

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");

include_once '../config/Database.php';
include_once '../class/Expenses.php';

$database = new Database();
$db = $database->getConnection();
 
$expenses = new Expenses($db);

$expenses->id = (isset($_GET['id']) && $_GET['id']) ? $_GET['id'] : '0';
$expenses->year = (isset($_GET['year']) && $_GET['year']) ? $_GET['year'] : '0';
$expenses->extra = (isset($_GET['month']) && $_GET['month']) ? $_GET['month'] : '0';

$result = $expenses->expenses();

if($result->num_rows > 0){    
    $itemRecords=array();
    $itemRecords["expenses"]=array(); 
    while ($expense = $result->fetch_assoc()) {     
        extract($expense); 
        $itemDetails=array(
            "id" => $id,
            "month" => $month,
            "amount" => $amount,
            "year" => $year
        ); 
       array_push($itemRecords["expenses"], $itemDetails);
    }    
    http_response_code(200);     
    echo json_encode($itemRecords);
}else{     
    http_response_code(404);     
    echo json_encode(
        array("message" => "No item found.")
    );
} 

.htaccess

RewriteEngine On    # Turn on the rewriting engine
RewriteRule ^read$ read.php [NC,L]
RewriteRule ^read/([0-9_-]*)$ read.php?id=$1 [NC,L]
RewriteRule ^create$ create.php [NC,L]
RewriteRule ^update$ update.php [NC,L]
RewriteRule ^delete$ delete.php [NC,L]
RewriteRule ^expenses$ readexpenses.php [NC,L]
RewriteRule ^expenses/([0-9_-]*)$ readexpenses.php?year=$1 [NC,L]
RewriteRule ^expenses/([0-9_-]*)$ readexpenses.php?id=$1 [NC,L]
RewriteRule ^expenses/([0-9_-]*)$ readexpenses.php?id=$1&year=$2 [NC,L]

【问题讨论】:

  • 最后三个规则是错误的,您将如何区分 idyear?年份只有4位吗?是超过4位的id吗?为什么你不将 url 更改为类似:expenses/id/123456expenses/year/2022 并且当两者都存在时只是 expenses/123456/2022,你还允许 - 字符只需使用:[0-9]+ 仅获取数字
  • 根据您的问题,ID 将是 1 到 4 位数字,年份将始终是 4 位数字。所以最终规则将是 RewriteRule ^expenses/([0-9]+)$ readexpenses.php/year/$1 [NC,L] RewriteRule ^expenses/([0-9]+)$ readexpenses.php/id/ $1 [NC,L] 和浏览器 localhost:8012/REST-API/items/expenses/year/2021 但它显示“找不到 url”
  • 刚刚回答,如果有效请告诉我

标签: php


【解决方案1】:

正如我在评论中所说,他最后三个规则是错误的:

RewriteRule ^expenses/([0-9_-]*)$ readexpenses.php?year=$1 [NC,L]
RewriteRule ^expenses/([0-9_-]*)$ readexpenses.php?id=$1 [NC,L]
RewriteRule ^expenses/([0-9_-]*)$ readexpenses.php?id=$1&year=$2 [NC,L]

这个网址会发生什么? http://example.com/expenses/2012 你如何检测到它是idyear

我建议使用这个方案:

http://example.com/expenses/id/2012   -> readexpenses.php?id=2012
http://example.com/expenses/year/2022 -> readexpenses.php?year=2022
http://example.com/expenses/2012/2022 -> readexpenses.php?id=2012&year=2022

所以 .htaccess 文件将是:(只是更改了最后三个规则)

RewriteEngine On    # Turn on the rewriting engine
RewriteRule ^read$ read.php [NC,L]
RewriteRule ^read/([0-9_-]*)$ read.php?id=$1 [NC,L]
RewriteRule ^create$ create.php [NC,L]
RewriteRule ^update$ update.php [NC,L]
RewriteRule ^delete$ delete.php [NC,L]
RewriteRule ^expenses$ readexpenses.php [NC,L]
RewriteRule ^expenses/year/([0-9]+)$ readexpenses.php?year=$1 [NC,L]
RewriteRule ^expenses/id/([0-9]+)$ readexpenses.php?id=$1 [NC,L]
RewriteRule ^expenses/([0-9]+)/([0-9]+)$ readexpenses.php?id=$1&year=$2 [NC,L]

【讨论】:

    猜你喜欢
    • 2019-12-05
    • 1970-01-01
    • 2017-11-16
    • 2021-03-07
    • 1970-01-01
    • 2016-07-22
    • 2016-10-31
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多