我已经尝试了几个小时,并在这里四处寻找答案,但找不到答案。
(我会尽力解释清楚):
我的网站是关于报告的。每份报告都会包含一些信息,其中包括报告者的姓名。记者可以从“选择”“选项”列表中选择自己的名字。
我有另一个页面,管理员可以在其中选择报告并查看是谁撰写的,并且管理员可以从同一“选择”“选项”列表中更改报告者姓名。
因此,当管理员选择报告时,代码会检索报告者的姓名并将其粘贴在数据库中的“选择”“选项”列表中。这很好。
这是代码的问题:
我有这些名字“按照数据库中的顺序”:Adam、Bell、Carlos、David
如果报告者姓名是 Bell,管理员将其更改为 Adam,然后单击“提交”。如果表格没有问题,表格将被正确提交。但是,如果页面信息出现任何其他问题(例如,电话格式错误),验证将会显示,这就是我遇到的问题:所选的名称不粘!所以,名字将保留为贝尔而不是亚当
疯狂的是,如果记者姓名是 Adam,管理员将其更改为 Bell,然后单击“提交”。页面信息出现任何问题,该名称都会与贝尔粘在一起!
重点是:
如果管理员将名称从“Adam”更改为 Bell、Carlos 或 David,则名称将被粘住。因为 Adam 是名字顺序中的第一个名字。
如果名字是 Bell,如果管理员将其更改为 Carlos 或 David,则该名称可能会被粘住(Carlos 会被粘住,与 David 相同),但不是 Adam!否则该名称将返回 Bell。
如果名字是 Carlos,只有当管理员将其更改为 David 时,该名字才可以被粘住(只有 David 才会保持粘性,否则名字将返回到 Carlos)
David 无法更改为保留任何其他名称,因为它是订单的姓氏。
你明白重点了吗?
如果姓名是 Carlos,管理员选择 Bell 更改姓名,则该姓名不会粘在表单中。它将回到卡洛斯。另一方面,如果名称是 Carlos,并且管理员选择 David 来更改名称,则名称将被粘住(这是因为我认为名称的顺序)或者因为“foreach”已经传递了名称Adam、Bell,所以当你遇到 Carlos 时,他们不会很粘,但是,对于 David 来说没关系,因为 David 是姓氏(在 Carlos 名字之后)
那么,我的代码有什么问题???
(很抱歉问了这么长的问题,但正如您所看到的,问题很复杂)
<?php
//check session value:
if (isset($_SESSION['report_id'])){
$report_id = $_SESSION['report_id'];
}
else if (isset($_POST['report_id'])){
$report_id = $_POST['report_id'];
}
else{
echo "index.php";
}
//if POST "Update" :
if ( ($_SERVER['REQUEST_METHOD'] == 'POST') && (isset($_POST['update'])) ) {
$username = $_POST['username'];
$phone_number = $_POST['phone_number'];
//errors handling :
$error = array();
if(empty($phone_number)) $error[]= "<div class='alert alert-danger alert-dismissible input-sm' role='alert' dir='rtl' style='padding-top: 5px; padding-right: -5px; padding-bottom: 0px; padding-left: 0px'>
<button type='button' class='close' data-dismiss='alert' aria-label='Close'>
<span aria-hidden='true'>×</span>
</button>
<strong style='color: #e62e00;'>Warning !</strong> Enter a phone number!
</div>";
if(empty($error)){
include("dbc.php");
$qq = "UPDATE reports SET username = '$username',
section_name = '$section_name',
phone_number = '$phone_number'
WHERE report_id = '$report_id'";
$rr = mysqli_query($dbc, $qq);
if($rr){
echo "<script>window.open('successful_update.php', '_self')</script>";
}
else{
echo "<div class='alert alert-danger alert-dismissible' role='alert'>
<button type='button' class='close' data-dismiss='alert' aria-label='Close'>
<span aria-hidden='true'>×</span>
</button>
<strong>Warning !</strong> Something wrong!
</div>";
}
}
else{
foreach ($error as $err){
echo $err;
}
}
}
<form action="report_details.php" method="POST" name="">
<?php
include("dbc.php");
$q = "SELECT * FROM reports WHERE report_id = '$report_id'";
$r = mysqli_query($dbc, $q);
while ($row = mysqli_fetch_array($r)){
$db_username = $row['username'];
$db_phone_number = $row['phone_number'];
}
?>
<!-- Username -->
<div class="form-group">
<label>name:</label>
<?php
include("dbc.php");
$qq = "SELECT DISTINCT username FROM users ORDER BY username";
$rr = mysqli_query($dbc,$qq);
while ($row = mysqli_fetch_array($rr)){
$username_array[] = $row['username'];
}
echo '<select class="form-control border-input" name="username">';
foreach($username_array as $user){
$selected = '';
if($user == $db_username) {
$selected = 'selected="selected"';
}
if($_POST['username'] == $user) {
$selected = 'selected="selected"';
}
echo '<option value="'.$user.'"'.$selected.'>'.$user.'</option>';
}
echo '</select>';
?>
</div>
<!-- Phone Number -->
<div class="form-group">
<label for="phone_number">Phone Number :</label>
<input type="text" class="form-control border-input" placeholder="Phone Number" name="phone_number" value =
<?php if(isset($_POST['phone_number'])) { echo $_POST['phone_number']; } else { echo $db_phone_number; } ?>>
</div>
<!-- Update Button -->
<div class="text-center">
<button type="submit" class="btn btn-warning btn-fill btn-wd" name="update" value="Update">Update</button>
</div>
</form>
最佳答案
问题在于,当发布表单时,您正在获取并使用数据库中的数据而不是发布的数据。至少对于用户名
来说是这样。
尝试改变:
$db_username = $row['username'];
到
$db_username = isset($_POST['username']) ? $_POST['username'] : $row['username'];
现在将使用已发布的数据(如果有),而不是数据库数据。
当您回显电话号码时,您实际上已经在执行此操作(回显电话号码时应将其用引号引起来)。
更好的选择
您实际上可以只更改这部分:
$q = "SELECT * FROM reports WHERE report_id = '$report_id'";
$r = mysqli_query($dbc, $q);
while ($row = mysqli_fetch_array($r)){
$db_username = $row['username'];
$db_phone_number = $row['phone_number'];
}
至
if (!isset($_POST['username'])) {
// We have no post data, get it from the database
$q = "SELECT * FROM reports WHERE report_id = '$report_id'";
$r = mysqli_query($dbc, $q);
while ($row = mysqli_fetch_array($r)){
$db_username = $row['username'];
$db_phone_number = $row['phone_number'];
}
} else {
// We have post data, let's use that instead
$db_username = $_POST['username'];
$db_phone_number = $_POST['phone_number'];
}
然后
<input type="text" class="form-control border-input" placeholder="Phone Number" name="phone_number" value="<?= $db_phone_number ?>" />
因为如果您有发布数据,则根本不需要进行数据库调用。
关于php - 提交表单后,在 PHP 中对来自 MySQL 的数据进行粘性选择不会粘住所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46374125/