使用select选项更新多行

时间:2017-01-17 21:21:54

标签: php mysql

数据库:

+------+------+
|  id  |status|
+------+------+
|  50  |   2  |
+------+------+
|  51  |   0  |
+------+------+
|  52  |   1  |
+------+------+

正如你所看到的那样,有一个名为id的列和另一个名为status的列,表示sth的当前状态(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); }

Idk老实说,我并没有真正了解foreach循环,但是它以某种方式工作,你可能需要知道数据库中有更多的列我没有听,但尽管如此,你给出的第一个答案完美无缺,没有任何线索怎么样:x所以如果你有时间我会非常感谢你的帮助:)

1 个答案:

答案 0 :(得分:0)

您需要将每行的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(),以确保查询中没有注入其他值。

最终更新:

这是一种做你想做的事情,我写的很容易理解并适用于你的代码:

<!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>