“需要处理行动的建议”;改为;在PHP文件中处理CRUD操作
我试图设置一个PHP文件来处理特定类型数据的crud操作——“土地合同”。当我想从数据库中读取数据时,目前有4种情况:“需要处理行动的建议”;改为;在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下运行良
acion=“read”
和land\u contract\u id
时,则回显该土地合同acion=“create”
时,则在创建土地合同后回显该合同acion=“update”
时,在土地合同更新后回显该合同acion=“read”
和land\u-contract\u-id
设置为未设置时,则回显所有land-contract<?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;
}
?>