数据库:
+------+------+
| id |status|
+------+------+
| 50 | 2 |
+------+------+
| 51 | 0 |
+------+------+
| 52 | 1 |
+------+------+
如您所见,有一个名为 id 的列和另一个名为 status 的列,它指示某事的当前状态(2=完成,1=工作,0 = 开放)
所以我做了一个小 GUI,您可以在其中通过选择选项输入字段选择当前状态,它还会预选状态的当前记录。
function generateSelect($name = '', $options = array(), $default = '') {
$html = '<select name="'.$name.'">';
foreach ($options as $option => $value) {
if ($value == $default) {
$html .= '<option value='.$value.' selected="selected">'.$option.'</option>';
} else {
$html .= '<option value='.$value.'>'.$option.'</option>';
}
}
$html .= '</select>';
return $html;
}
正如我提到的,数据库中的每个数字代表一个文本及其状态
$statusArray=array("Done" => "2", "In Work" => "1","Open" => "0");
这是为每个 id 生成所有选择选项字段的样子:
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$strStatus = generateSelect("stat", $statusArray, $row['status']);
echo '<tr><td>' . $row['id']. '</td><td>'.$strStatus.'</td></tr>';
我现在想做的是,当按下提交按钮时,它会更新所有状态记录。
我尝试过的:
1.获取选中的
function getSelected(){
$value="";
if($_POST['status']=="0")
$value="0";
else if($_POST['status']=="1")
$value="1";
else if($_POST['status']=="2")
$value="2";
else if($_POST['status']=="3")
$value="3";
return $value;
} 2. 可能出问题的SQL语句
$tmp = getSelected();
$sql = "UPDATE form SET status='$tmp' WHERE *";
另一种选择是只保存编辑过的内容,也许使用选择字段中的 onchange 方法? 非常感谢我能得到的每一个帮助 :) 提前联系我,感谢您花时间查看代码。
更新
感谢快速回答和额外更新@MarioZ
但是它似乎仍然无法正常工作。 :/也许你可以帮我 ^^
首先仅使用 $row['id'] 就可以正常工作,因为我希望能够更新我添加的更多字段。“['status']”
$strStatus = generateSelect($row['id']."['status']", $statusArray, $row['status']);
也尝试过这个,但没有成功。
$personArray=array("Zivildiener" => "4", "Schmikl" => "3", "Poier" => "2","Dirnböck" => "1","Tom" => "0");
$strPerson = generateSelect($row['id']."['person']", $personArray, $row['person']);
而且我还添加了这个也可以正常工作,但仅用于状态:/
foreach($_POST as $key => $value) {
$sql = "UPDATE form SET status='$value' WHERE id = $key";
$result = $conn->query($sql); }
老实说,我真的不明白 foreach 循环,但它以某种方式工作,你可能需要知道数据库中有更多我没有听过的列,但尽管如此,你给出的第一个答案工作得很好,没有线索不过 :x 所以,如果您有时间的话,我真的很感谢您再次提供帮助 :)
最佳答案
您需要将每一行的id作为每个选择的名称传递:
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$strStatus = generateSelect($row['id'], $statusArray, $row['status']);
echo '<tr><td>' . $row['id']. '</td><td>'.$strStatus.'</td></tr>';
因此,当您检索 $_POST 数据时,您将 id 作为键,将选项的值作为值:
foreach($_POST as $key => $value) {
$sql = "UPDATE form SET status='$value' WHERE id = $key";
}
您可以在该循环中调整您的函数 getSelected()
以确保查询中没有注入(inject)其他值。
最终更新:
这是一种做您想做的事情的方法,我写的是为了易于理解并应用到您的代码中:
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form name="tasks" action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
<?php
// Names of fields
$status_list[] = "open";
$status_list[] = "in work";
$status_list[] = "done";
$person_list[] = "John";
$person_list[] = "Bran";
$person_list[] = "Edd";
$task_list[50] = "Kill enemies";
$task_list[51] = "Avenge father";
$task_list[52] = "Sleep";
// Database conection
$db = new mysqli("localhost", "root", "", "test");
// Update database only if post
if(!empty($_POST)) {
foreach($_POST as $key => $value){
if($db->query("UPDATE change_status SET status = {$value['status']}, person = {$value['person']} WHERE id = $key ")) {
echo "<span>".$key." - UPDATED!</span>";
} else {
echo "<span>".$key." - FAILED!</span>";
}
}
}
// Get database
$query = $db->query("SELECT * FROM change_status");
// Draw the HTML content
$form = "";
while($result = $query->fetch_array()) {
$form .= '<div>';
$form .= '<span>'.$task_list[$result['id']].'</span>';
$form .= ' - ';
$form .= '<select name="'.$result['id'].'[status]">';
foreach($status_list as $key => $value) {
$form .= '<option value="'.$key.'"';
$form .= $result['status'] == $key? " selected" : "";
$form .= '>'.$value.'</option>';
}
$form .= '</select>';
$form .= '<select name="'.$result['id'].'[person]">';
foreach($person_list as $key => $value) {
$form .= '<option value="'.$key.'"';
$form .= $result['person'] == $key? " selected" : "";
$form .= '>'.$value.'</option>';
}
$form .= '</select></div>';
}
echo $form; // display html content
?>
<input type="submit">
</form>
</body>
</html>
关于php - 使用选择选项更新多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41707227/