php - 使用选择选项更新多行

标签 php mysql

数据库:

+------+------+
|  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&ouml;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/

相关文章:

php - 您的系统中缺少请求的 PHP 扩展 ext-mysql *。在 PHP 7.1.7 中

php - 使用 Guzzle HTTP PHP 客户端限制连接时间

php - 谷歌云空间/图像部署错误,构建未完成

java - 无法填充池 : when starting jboss application

mysql - Excel VBA : recordset joining and performance

php - 如何在 Doctrine 中对多个实体执行以下查询?

php - 如何在Laravel 5.6中使用不同的编辑形式更新表

php - php 中的 cfhttp "POST"

php - Laravel 唯一验证在更新时失败

php - 错误: Data truncated for column 'lat'