【问题标题】:How to update php form but individually?如何单独更新php表单?
【发布时间】:2022-01-04 17:32:52
【问题描述】:

我想更新数据库中的一条记录,但一次只能更新一条。目前,当我单击提交时,所有其他值都是空的,将从数据库中删除。我如何使它保持其他值?

我能想到的唯一解决方法是让每个字段本身成为一个单独的进程,但这似乎效率低下

这是处理文件:

<?php
session_start();

$host="localhost";
$user="root";
$password="";
$db="portal";

$data=mysqli_connect($host,$user,$password,$db);
$currentuser = $_SESSION["username"];

if($data===false)
{
    die("connection error");
}

if(isset($_POST['submit']))
{
    $username=$_POST['username'];
    $password=$_POST['password'];
    $name=$_POST['name'];
    $phonenum=$_POST['phonenum'];
    $address=$_POST['address'];
    $email=$_POST['email'];

    $sql="UPDATE user SET username='$username', password='$password', name='$name', phonenum='$phonenum', address='$address', email='$email' WHERE username = '$currentuser'";
    $result=mysqli_query($data,$sql);
}
?>

<!doctype html>
<html>

<head>
<title>User Updated!</title>
    
<!--Icons-->
<script src="https://kit.fontawesome.com/5669020dd7.js" crossorigin="anonymous"></script>
<!--Font-->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;600&display=swap" rel="stylesheet">
<!--For navbar-->
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>

<style>
body {
    background-image:url('bg5.png');
    background-color:#9ec6e4;
    background-size: 100% auto;
    font-family: 'Source Sans Pro', sans-serif;
}

.main {
  margin-left: 220px; /* Same as the width of the sidenav */
  padding: 0px 10px;
}

.bgbox {
    position: absolute;
    z-index: -1;
}

.container {
  border-radius: 5px;
  background-color: #fffdd0;
  padding: 20px;
}

h1 {
    font-family: 'Source Sans Pro', sans-serif;
    font-size: 50px;
}

.padding {
    margin-left: 50px;
}

/*button*/
.button {
    background-color: #d1b7a0;
    border-radius: 8px;
    font-family: 'Source Sans Pro', sans-serif;
    color: black;
    text-align: center;
    text-decoration: none;
    display: inline-block;
    padding: 5px 20px;
    margin: 8px 0;
    border: none;
    border-radius: 8px;
    cursor: pointer;
}
    
.button:hover {
    background-color: #5f4f47;
    color: #d1b7a0;
}
/*button*/

</style>
</head>

<body>
<!--navbar-->
<div id="usernav">
</div>
<script>
$(function(){
  $("#usernav").load("usernav.html");
});
</script>
<!--navbar-->

<div class="main">
<br>
    <a>Welcome, </a><?php echo $_SESSION["username"] ?><a>!</a>
</div>
<br>
<div class="bgbox">
    <img src="box.png" style="opacity:0.6; width: 100%;">
</div>

<div class="main">
    <br><br>
    <div class="container">
        <h1>User Updated!</h1>
        <div class="padding">
            <?php echo "<b>Username:</b> $username<br/><br/>";
            echo "<b>Name:</b> $name<br/><br/>";
            echo "<b>Phone Number:</b> $phonenum<br/><br/>";
            echo "<b>Office Address:</b> $address<br/><br/>";
            echo "<b>Email:</b> $email";?>
        </div>
    </div>
</div>

</body>
</html>

这是我的html:

<?php
session_start();

$host="localhost";
$user="root";
$password="";
$db="portal";

$data=mysqli_connect($host,$user,$password,$db);
$currentuser = $_SESSION["username"];

if($data===false)
{
    die("connection error");
}

if(isset($_POST['submit']))
{
    $username=$_POST['username'];
    $password=$_POST['password'];
    $name=$_POST['name'];
    $phonenum=$_POST['phonenum'];
    $address=$_POST['address'];
    $email=$_POST['email'];

    $sql="UPDATE user SET username='$username', password='$password', name='$name', phonenum='$phonenum', address='$address', email='$email' WHERE username = '$currentuser'";
    $result=mysqli_query($data,$sql);
}
?>

<!doctype html>
<html>

<head>
<title>User Updated!</title>
    
<!--Icons-->
<script src="https://kit.fontawesome.com/5669020dd7.js" crossorigin="anonymous"></script>
<!--Font-->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;600&display=swap" rel="stylesheet">
<!--For navbar-->
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>

<style>
body {
    background-image:url('bg5.png');
    background-color:#9ec6e4;
    background-size: 100% auto;
    font-family: 'Source Sans Pro', sans-serif;
}

.main {
  margin-left: 220px; /* Same as the width of the sidenav */
  padding: 0px 10px;
}

.bgbox {
    position: absolute;
    z-index: -1;
}

.container {
  border-radius: 5px;
  background-color: #fffdd0;
  padding: 20px;
}

h1 {
    font-family: 'Source Sans Pro', sans-serif;
    font-size: 50px;
}

.padding {
    margin-left: 50px;
}

/*button*/
.button {
    background-color: #d1b7a0;
    border-radius: 8px;
    font-family: 'Source Sans Pro', sans-serif;
    color: black;
    text-align: center;
    text-decoration: none;
    display: inline-block;
    padding: 5px 20px;
    margin: 8px 0;
    border: none;
    border-radius: 8px;
    cursor: pointer;
}
    
.button:hover {
    background-color: #5f4f47;
    color: #d1b7a0;
}
/*button*/

</style>
</head>

<body>
<!--navbar-->
<div id="usernav">
</div>
<script>
$(function(){
  $("#usernav").load("usernav.html");
});
</script>
<!--navbar-->

<div class="main">
<br>
    <a>Welcome, </a><?php echo $_SESSION["username"] ?><a>!</a>
</div>
<br>
<div class="bgbox">
    <img src="box.png" style="opacity:0.6; width: 100%;">
</div>

<div class="main">
    <br><br>
    <div class="container">
        <h1>User Updated!</h1>
        <div class="padding">
            <?php echo "<b>Username:</b> $username<br/><br/>";
            echo "<b>Name:</b> $name<br/><br/>";
            echo "<b>Phone Number:</b> $phonenum<br/><br/>";
            echo "<b>Office Address:</b> $address<br/><br/>";
            echo "<b>Email:</b> $email";?>
        </div>
    </div>
</div>

</body>
</html>

【问题讨论】:

  • 请注意,通过手动将 $_POST 数据连接到查询中,您对 SQL 注入持开放态度。有关防止这种情况的建议,请参阅stackoverflow.com/questions/60174/…。你能澄清一下问题是什么吗?您的查询已经有WHERE username = x,所以它应该只更新用户x。你能在查询运行之前确认$currentuser 的值是多少吗?看起来您在问题中粘贴了两次相同的 HTML 文件。
  • 如果您要提交一个值数组 (&lt;input name="username[]" /&gt;),那么 $_POST['username'] 应该默认返回一个数组,您可以对其进行迭代以对每个提交的用户进行查询。请参阅stackoverflow.com/questions/21750478/retrieve-post-array-values 了解更多信息。
  • 当我更新名称时,它会更新正确的用户,但所有其他字段(电子邮件、密码等)都是空白的,因为该字段是空的,因为我只想更新名称。我正在寻找一种能够仅更新用户输入的字段的方法。
  • 然后,无论如何,从UPDATE 语句中删除其他字段,并且只更新您真正想要更新的内容。 ;)
  • 啊,那么您可以使用条件动态构建查询,或者您可以将查询更改为 SET phonenum = IFNULL($phonenum, phonenum) 这样它会设置新值,如果它为空,它将使用现有的phonenum 查询中的值。

标签: php sql forms


【解决方案1】:

执行此操作的一种方法是通过在将要更新的字段添加到查询之前检查要更新的字段来动态构建查询。这是未经测试的,但应该是你想要做的事情的要点。它将各种SET x = y 值添加到一个数组中(并且将参数化的值分别添加到avoid SQL injection)。

<?php

if (isset($_POST['submit']))
{
    $username=$_POST['username'];
    $password=$_POST['password'];
    $name=$_POST['name'];
    $phonenum=$_POST['phonenum'];
    $address=$_POST['address'];
    $email=$_POST['email'];
}

// placeholder arrays while we determine which fields/values to update
$set = [];
$parameters = [];

// do we need to update address?
// note: check if it's set and if it's truthy so we don't submit empty strings (unless you want the user to be able to submit blank data?)
if (isset($address) && $address) {
    $set[] = ' address = ? ';
    $parameters[] = $address;
}

// do we need to update name?
if (isset($name) && $name) {
    $set[] = ' name = ? ';
    $parameters[] = $name;
}

// do we need to update phonenum?
if (isset($phonenum) && $phonenum) {
    $set[] = ' phonenum = ? ';
    $parameters[] = $phonenum;
}

// as long as we have some values to update, run the query
if (count($set) > 0) {
    // build the SQL query
    $sql = "UPDATE user SET ".implode(', ', $set).' WHERE username = ?';
    $parameters[] = $currentuser;

    //run the parameterized query
    $stmt = $pdo->prepare($sql);
    $stmt->execute($parameters);
}

另一种方法是首先查询当前用户的数据并使用它来预填充input 字段,然后您的查询可以随时更新每个字段。您可能希望为 password 字段构建一些额外的功能/验证(确认密码?特殊字符或长度要求?),但这也是如何做到这一点的基本思想:

<?php
    if(isset($_POST['submit'])) {
        $username=$_POST['username'];
        $password=$_POST['password'];
        $name=$_POST['name'];
        $phonenum=$_POST['phonenum'];
        $address=$_POST['address'];
        $email=$_POST['email'];

        $sql="UPDATE user SET username='$username', password='$password', name='$name', phonenum='$phonenum', address='$address', email='$email' WHERE username = '$currentuser'";
        $result=mysqli_query($data,$sql);
    } else {
        $stmt = $pdo->prepare("SELECT username, phonenum, name, address, email FROM user WHERE username = ?");
        $stmt->execute([$currentuser]);
        // https://www.php.net/manual/en/pdostatement.fetchall.php
        $result = $sth->fetchAll(PDO::FETCH_ASSOC);
    }
?>

<form>
    <input name="username" type="text" value="<?= $result['username']; ?>" />
    <input name="phonenum" type="tel" value="<?= $result['phonenum']; ?>" />
    <input name="name" type="text" value="<?= $result['name']; ?>" />
    <input name="address" type="text" value="<?= $result['address']; ?>" />
    <input name="email" type="email" value="<?= $result['email']; ?>" />
</form>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多