“需要处理行动的建议”;改为;在PHP文件中处理CRUD操作

“需要处理行动的建议”;改为;在PHP文件中处理CRUD操作,php,parameters,switch-statement,custom-function,Php,Parameters,Switch Statement,Custom Function,我试图设置一个PHP文件来处理特定类型数据的crud操作——“土地合同”。当我想从数据库中读取数据时,目前有4种情况: 当设置了acion=“read”和land\u contract\u id时,则回显该土地合同 当acion=“create”时,则在创建土地合同后回显该合同 当acion=“update”时,在土地合同更新后回显该合同 当acion=“read”和land\u-contract\u-id设置为未设置时,则回显所有land-contract 我当前的设置在情况1、2和3下运行良

我试图设置一个PHP文件来处理特定类型数据的crud操作——“土地合同”。当我想从数据库中读取数据时,目前有4种情况:

  • 当设置了
    acion=“read”
    land\u contract\u id
    时,则回显该土地合同
  • acion=“create”
    时,则在创建土地合同后回显该合同
  • acion=“update”
    时,在土地合同更新后回显该合同
  • acion=“read”
    land\u-contract\u-id
    设置为未设置时,则回显所有land-contract
  • 我当前的设置在情况1、2和3下运行良好。但是,如果没有参数,我无法调用read函数。即在情况4中,当$land\u contract\u id未设置时

    当我想从数据库中读取数据时,我应该如何重新构造设置以在所有情况下都能工作

    下面是我的设置的简化版本

    <?php
    
        $action = isset($_POST["action"]) ? $_POST["action"] : '';
    
        $land_contract_id = isset($_POST["land_contract_id"]) ? $_POST["land_contract_id"] : '';
    
        switch ($action) {
          case "create":
    
            // Here I'm creating a new land contract and getting the last inserted id with $pdo->lastInsertId()
    
            read($last_inserted_land_contract_id);
    
            break;
          case "read":
    
            if (isset($_POST['land_contract_id'])) {
              read($land_contract_id);
            }
    
            break;
          case "update":
    
            // Here I'm updating an existing land contract
    
            read($land_contract_id);
    
            break;
          case "delete":
    
            break;
        }
    
        function read(land_contract_id) {
    
          // Fetching land contract from database and echoing as JSON
    
        }
    
    ?>
    

    您需要修改
    read()
    函数以使
    $land\u contract\u id
    可选:

    函数读取($land\u contract\u id=null){
    $sql=“从土地契约中选择*”;
    if($land\u contract\u id){
    $sql.=“其中土地合同id={$土地合同id}”;
    }
    $result=$database->select_行($sql);
    }
    

    现在,
    $land\u contract\u id
    是可选的。如果将值传递给
    read()
    ,它将只返回所选的合同,否则如果将其保留为null/空,它将返回所有合同。

    通常,各种CRUD方法将发送各种请求类型,看起来就像您将它们全部编码为POST。谢谢。我一直不明白为什么我应该发出获取数据的GET请求,而POST也可以。你能解释一下吗?这并不总是一个有效的例子——更多的是一个惯例的例子。与编码标准一样,编码标准并不能使代码工作得更好,但它使与其他人的代码一起工作变得更容易。@NigelRen我明白了!我应该像这样声明两个版本的$land\u contract\u id吗<代码>$land\u contract\u id=isset($\u POST[“land\u contract\u id”])$_张贴[“土地合同id]:''
    $land\u contract\u id=isset($\u GET[“land\u contract\u id”])$_获取[“土地合同id]:''。一个用于读取,另一个用于创建、更新和删除?您需要将
    $pdo
    作为参数传递给函数
    read()
    。谢谢!我试过你的解决方案,但现在我出错了。请参阅我原始问题中的更新。对不起,我忘了说我正在将
    action=read
    land\u contract\u id=111
    发布到PHP文件中。我可以看到函数“read”正在被字符串“111”调用。请参阅我原始问题中的更新。我在那里写了错误,现在错误消失了。显然,在调用
    read()
    时,我必须将$pdo作为变量传递。谢谢
    <?php
    
    header("Content-Type: application/json; charset=UTF-8");
    
    header("Access-Control-Allow-Origin: *");
    
    require_once("./pdo_connect.php");
    
    $action = isset($_POST["action"]) ? $_POST["action"] : '';
    $land_contract_id = isset($_POST["land_contract_id"]) ? $_POST["land_contract_id"] : '';
    $land_contract_name = isset($_POST["land_contract_name"]) ? $_POST["land_contract_name"] : '';
    $location_id = isset($_POST["location_id"]) ? $_POST["location_id"] : '';
    $land_contract_link = isset($_POST["land_contract_link"]) ? $_POST["land_contract_link"] : '';
    $land_contract_notes = isset($_POST["land_contract_notes"]) ? $_POST["land_contract_notes"] : '';
    $land_owner_id = isset($_POST["land_owner_id"]) ? $_POST["land_owner_id"] : '';
    $land_contract_start_date = isset($_POST["land_contract_start_date"]) ? $_POST["land_contract_start_date"] : '';
    $land_contract_end_date = isset($_POST["land_contract_end_date"]) ? $_POST["land_contract_end_date"] : '';
    $land_contract_terminated = isset($_POST["land_contract_terminated"]) ? $_POST["land_contract_terminated"] : 'false';
    $land_contract_payment_interval = isset($_POST["land_contract_payment_interval"]) ? $_POST["land_contract_payment_interval"] : '';
    $land_contract_price_type = isset($_POST["land_contract_price_type"]) ? $_POST["land_contract_price_type"] : '';
    $land_contract_fixed_annual_price = isset($_POST["land_contract_fixed_annual_price"]) ? $_POST["land_contract_fixed_annual_price"] : '';
    $land_contract_variable_annual_price_year = isset($_POST["land_contract_variable_annual_price_year"]) ? $_POST["land_contract_variable_annual_price_year"] : '';
    
    switch ($action) {
        case "create":
    
            // Insert land_contract to database
            $stmt1 = $pdo->prepare("INSERT INTO land_contract (land_contract_name, location_id, land_contract_link, land_contract_notes, land_owner_id, land_contract_start_date, land_contract_end_date, land_contract_terminated, land_contract_payment_interval, land_contract_price_type) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
            $stmt1->execute([$land_contract_name, $location_id, $land_contract_link, $land_contract_notes, $land_owner_id, $land_contract_start_date, $land_contract_end_date, $land_contract_terminated, $land_contract_payment_interval, $land_contract_price_type]);
    
            // Get id of last inserted land_contract
            $last_inserted_land_contract_id = $pdo->lastInsertId();
    
    
            // Check if there are any variable annual prices and if so, insert them into land_contract_annual_price
            if ( isset( $_POST['land_contract_variable_annual_price_year'] ) ) {
                $years = $_POST ['land_contract_variable_annual_price_year'] ;
                if( is_array( $years ) ) {
                    foreach ( $years as $year => $price ) {
    
                        $price_with_decimals = number_format((float)$price, 2, '.', '');
    
                        // Insert the variable annual prices into land_contract_annual_price
                        $stmt2 = $pdo->prepare("INSERT INTO land_contract_annual_price (land_contract_annual_price_year, land_contract_annual_price_amount, land_contract_id) VALUES (?, ?, ?)");
                        $stmt2->execute([$year, $price_with_decimals, $last_inserted_land_contract_id]);
    
                    }
                }
            }
    
            read($last_inserted_land_contract_id);
    
            // Reset statements
            $stmt1 = null;
            $stmt2 = null;
    
            break;
        case "read":
    
            if ( isset($_POST['land_contract_id']) ) {
                read($land_contract_id);
            }
            else {
                read();
            }
    
            break;
        case "update":
    
            $row = [
                'land_contract_id' => $land_contract_id,
                'land_contract_name' => $land_contract_name,
                'location_id' => $location_id,
                'land_contract_link' => $land_contract_link,
                'land_contract_notes' => $land_contract_notes,
                'land_owner_id' => $land_owner_id,
                'land_contract_start_date' => $land_contract_start_date,
                'land_contract_end_date' => $land_contract_end_date,
                'land_contract_terminated' => $land_contract_terminated,
                'land_contract_payment_interval' => $land_contract_payment_interval,
                'land_contract_price_type' => $land_contract_price_type,
                'land_contract_fixed_annual_price' => $land_contract_fixed_annual_price,
                'land_contract_variable_annual_price_year' => $land_contract_variable_annual_price_year
    
            ];
    
            $stmt = $pdo->prepare("UPDATE land_contract SET land_contract_name=:land_contract_name, location_id=:location_id, land_contract_link=:land_contract_link, land_contract_notes=:land_contract_notes, land_owner_id=:land_owner_id, land_contract_start_date=:land_contract_start_date, land_contract_end_date=:land_contract_end_date, land_contract_terminated=:land_contract_terminated, land_contract_payment_interval=:land_contract_payment_interval, land_contract_price_type=:land_contract_price_type, land_contract_fixed_annual_price=:land_contract_fixed_annual_price, land_contract_variable_annual_price_year=:land_contract_variable_annual_price_year WHERE land_contract_id=:land_contract_id");
            $stmt->execute($row);
    
            read($land_contract_id);
    
            $stmt = null;
            break;
        case "delete":
            $stmt = $pdo->prepare("DELETE FROM land_contract WHERE land_contract_id = ?");
            $stmt->execute([$land_contract_id]);
            $stmt = null;
            break;
    }
    
    function read($land_contract_id = null) {
    
        $params = [];
        $array = [];
    
        $sql = "SELECT lc.*, 
                       py.land_contract_annual_price_year AS `year`,  
                       py.land_contract_annual_price_amount AS `amount`
                FROM land_contract AS lc
                LEFT JOIN land_contract_annual_price AS py 
                    ON py.land_contract_id = lc.land_contract_id
                ";
        if ($land_contract_id) {
            $sql .= 'WHERE lc.land_contract_id = ?';
            $params[] = $land_contract_id;
        }
    
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        while ($row = $stmt->fetch()) {
            // Fields we want to extract from the select statement into the array 
            $select_fields = ['land_contract_id', 'land_contract_name', 'location_id', 'land_contract_link', 'land_contract_notes', 'land_owner_id', 
                                'land_contract_start_date', 'land_contract_end_date', 'land_contract_terminated', 'land_contract_payment_interval', 
                                'land_contract_price_type', 'land_contract_fixed_annual_price '];
    
            if (!isset($array[$row['land_contract_id']])) {
                // initialize the subarray if it has not been set already 
                $array[$row['land_contract_id']] = array_intersect_key($row, array_flip($select_fields));
    
                if ($row['year'] != null) {
                    $array[$row['land_contract_id']]['land_contract_annual_prices'] = [];
                } else {
                    $array[$row['land_contract_id']]['land_contract_annual_price'] = $row['land_contract_fixed_annual_price'];
                }
            }
    
            if ($row['year'] != null) {
                $array[$row['land_contract_id']]['land_contract_annual_prices'][] = ['year' => $row['year'], 'amount' => $row['amount']];
            }
    
        }
    
        if (empty($array)) {
            echo "No results";
            exit;
        }
    
        echo json_encode($array, JSON_UNESCAPED_UNICODE);
    
        $stmt = null;
    }
    
    ?>