Я бы попробовал что-то в этом духе, я не привел полный пример, потому что у меня действительно нет времени, но вы должны получить достаточно идей для завершения остальной части кода.
<?php
require('dbcon.php');
include("header.php");
$transaction_id = $_GET['transaction_id'];
$stm = $pdo->prepare("SELECT * FROM [Transaction] WHERE transaction_id = ?");
$stm->execute(array($transaction_id));
$transaction = $stmt->fetch(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Update Transaction</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<div class="form">
<h1>Update Transaction</h1>
<?php
$status = "";
if (isset($_POST['update']) && $_POST['update'] == 1) {
$transaction_id = $_POST['transaction_id'];
$fund = $_POST['fund'];
$department = $_POST['department'];
$code_name = $_POST['code_name'];
$budget_year = $_POST['budget_year'];
$entry_date = $_POST['entry_date'];
$project_name = $_POST['project_name'];
$item_desc = $_POST['item_desc'];
$amount = $_POST['amount'];
$detail = $_POST['detail'];
$PO = $_POST['PO'];
$modified = $_POST['modified'];
$stm = $pdo->prepare("UPDATE [Transaction] SET fund = ? , department = ? , code_name = ? , budget_year = ? , entry_date = ? , project_name = ? , item_desc = ? , amount = ? , detail = ? , PO = ?");
$res = $stm->execute(array($fund,$department,$code_name,$budget_year,$entry_date,$project_name,$item_desc,$amount,$detail,$PO));
if($res){
$status = "Record Updated Successfully. </br></br>
<a href='transactions.php'>View Updated Record</a>";
}else{
$status = "Record Update Failed.";
}
echo '<p style="color:#FF0000;">' . $status . '</p>';
} else {
?>
<div>
<form name="form" method="post" action="">
<input type="hidden" name="update" value="1" />
<input name="transaction_id" type="hidden" value="<?php echo $transaction['transaction_id']; ?>" />
<p>Fund:
<select name= 'fund' class='form-control selectpicker' onChange='getState(this.value)' Required>
<?php
$stm = $pdo->prepare("SELECT * FROM Funding");
$stm->execute();
$funding = $stmt->fetchAll();
foreach($funding as $row)) {
$fund = $row['fund'];
if ($transaction['fund'] == $fund) {
$selected = 'selected="selected"';
} else {
$selected = "";
}
echo "<option value=\"$fund\" $selected>$fund</option>";
}
?>
</select>
</p>
<p>Department:
<select name= 'department' class='form-control selectpicker' onChange='getState(this.value)' Required>
<?php
$stm = $pdo->prepare("SELECT * FROM Department");
$stm->execute();
$department = $stmt->fetchAll();
foreach($department as $row) {
$department = $row['department'];
if ($transaction['department'] == $department) {
$selected = 'selected="selected"';
} else {
$selected = "";
}
echo "<option value=\"$department\" $selected>$department</option>";
}
?>
</select>
</p>
Итак, прежде всего используйте подготовленные операторы , в вашем старом коде у вас есть это:
$transaction_id = $_REQUEST['transaction_id'];
$sql = "SELECT * FROM [Transaction]where
transaction_id='" . $transaction_id . "'";
Что если значение $transaction_id
было 1; DROP TABLE Transactions;
?Строка запроса SQL, которую вы затем отправляете на свой сервер, будет выглядеть следующим образом:
SELECT * FROM [Transaction] WHERE transaction_id = 1; DROP TABLE Transactions;
И тогда вы потеряете все свои данные, я взял этот базовый пример из bobby-tables.com
Я бы порекомендовал использовать от PDO
до prepare
и execute
ваших запросов в PHP, я дал вам краткое представление о синтаксисе в моем примере кода выше.
Теперь, переходя от этого, в вашем старом коде было несколько вещей, которые не имели особого смысла, я постараюсь назвать как можно больше;
Вы сохраняете свой запрос на обновление в переменной с именем $update
, затем выполняете запрос, используя переменную с именем $sql
$update = "update [Transaction] set
fund='" . $fund . "',
department='" . $department . "',
code_name='" . $code_name . "',
budget_year='" . $budget_year . "',
entry_date='" . $entry_date . "',
project_name='" . $project_name . "',
item_desc='" . $item_desc . "',
amount='" . $amount . "',
detail='" . $detail . "',
PO='" . $PO . "'
where transaction_id='" . $transaction_id . "'";
sqlsrv_query($conn, $sql);
Первоначально транзакция получена изDB в начале сценария и сохранить строку в переменной с именем $row
, а затем в сценарии выполнить много запросов для получения информации, скажем, «Финансирование», и все результаты сохраняются в переменной с именем $row
, перезаписываяинформация о транзакции.Просто будьте более точны при именовании ваших переменных, это облегчит чтение кода и предотвратит ошибки, подобные этой.
В циклах select
вы дважды используете echo
?а также тестирование, чтобы увидеть, если $row['fund'] == 'Operational'
дважды?
В заключение я кратко объясню свой код, чтобы вы могли закончить остальное.
Сначала мыполучить идентификатор транзакции из запроса $_GET
, мы используем его, чтобы получить правильную строку из базы данных и сохранить результат в имени ассоциативного массива $transaction
, чтобы позже в коде всякий раз, когда нам нужна информация о существующей транзакциимы используем эту переменную.
Оператор обновления, который я только что изменил на подготовленный оператор, и добавил еще одно для отображения, если запрос не удался.
Я добавил закрывающий тег select
, так кактвой пропал.И для финансирования, и для отдела мы делаем одно и то же, готовим отчет, извлекаем все результаты в виде массива (с соответствующим названием) и затем через них foreach
.На каждой итерации foreach
мы сравниваем значение $row
с соответствующим значением $transaction
(например, $transaction['fund']==$row['fund']
) и, если они совпадают, выбираем его!Если они не совпадают, тогда переменная $selected
устанавливается пустой и, таким образом, не влияет на option
.
Что ж, этот ответ оказался длиннее, чем я ожидал, возможно, пропустил много вещей, но если у вас есть какие-либо вопросы, оставьте их ниже!