【问题标题】:How to update specific single column with multiple columns in an update query using php?如何使用 php 在更新查询中用多列更新特定的单列?
【发布时间】:2017-05-22 00:12:36
【问题描述】:

我有一张名为Master 的表,它有四列名为idABC

当我更新表格时,我需要修改用户选择的特定单列。例如,如果用户选择列A,那么只有A 记录将在数据库中更新。如果用户选择C,那么只会更新C 记录。

以下是我尝试过的代码,但它正在更新所有列。你会在这方面帮助我吗?

$column_name=$row['column_name'];//A,B,C
if (isset($result->num_rows) > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        $A=$row['A'];
        $B=$row['B'];
        $C=$row['C'];
      }}

 UPDATE Master SET $column_name='$A'+20, $column_name='$B'+30, $column_name='$C'+50 WHERE user_id='$id'";

【问题讨论】:

  • 现在您使用的是什么数据库系统MySQL 还是 MS SQL server?您为您的问题提供了 both 标签,这是没有意义的。
  • 对不起,我正在使用 MySQL。
  • 如果只更新一列,为什么会有 3 个变量?
  • 顺便说一下,这段代码只更新一列

标签: php mysql loops if-statement


【解决方案1】:

虽然你的要求对我来说并不完全清楚,所以我认为 将帮助您满足您的要求。这是一个动态的解决方案。如果不是,您可以澄清您的要求,我必须尽力解决它。谢谢你的提问。

* table schema is stakcoverflow
* table name is master_tbl
* fields name 
id | a | b | c


<?php 
$myHost = "localhost"; // use your real host name ex. myDomainName.com
$myUserName = "root";   // use your real login user name ex. myUserName
$myPassword = "";   // use your real login password ex. myPassword
$myDataBaseName = "stakcoverflow"; // use your real database name ex. myDataBaseName

$con = mysqli_connect( "$myHost", "$myUserName", "$myPassword", "$myDataBaseName" );

if( !$con ) // == null if creation of connection object failed
{ 
    // report the error to the user, then exit program
    die("connection object not created: ".mysqli_error($con));
}

if( mysqli_connect_errno() )  // returns false if no error occurred
{ 
    // report the error to the user, then exit program
    die("Connect failed: ".mysqli_connect_errno()." : ". mysqli_connect_error());
} 

$sql="SELECT a,b,c,id FROM master_tbl ORDER BY id";
$affectedrowsno  = 0;
if ($result=mysqli_query($con,$sql))
  {
    // Get field information for all fields
    while ($fieldinfo=mysqli_fetch_field($result))
    {
        $column_name = $fieldinfo->name;
        // Get field information for all fields

        while ($row=mysqli_fetch_assoc($result))
        {
            $a = $row['a'];
            $b = $row['b'];
            $c = $row['c'];
            $id = $row['id'];
            $sql = "UPDATE master_tbl SET $column_name=$a+20, $column_name=$b+50, $column_name=$c+80 WHERE id=$id";
            mysqli_query($con,$sql);

            $affectedrowsno += count(mysqli_affected_rows($con));
        }

   }
   echo "Affected rows = " . $affectedrowsno;
   // Free result set
    mysqli_free_result($result);

}

mysqli_close($con);

?>

【讨论】:

  • 感谢Didar Alam先生的回复,你能解释一下$affectedrowsno += count(mysqli_affected_rows($con));我可以在 while 语句之外使用更新查询吗?
  • 没有。因为那时它不是增量。如果你把它放在循环的外侧,你总是会得到 1。如果您的更新查询用完循环,那么您可以。因为它在循环内部,所以每次执行它都会返回受影响的行 1。希望你理解。如果您想更新在循环之外运行的查询,那么您必须将所有数据收集在一个数组中,并且您必须根据您的需要来管理它们以更新查询本身的语法。谢谢
【解决方案2】:

你可以使用if语句:

$column_name=$row['column_name'];//A,B,C
if (isset($result->num_rows) > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        $A=$row['A'];
        $B=$row['B'];
        $C=$row['C'];
      }}

    if($column_name == 'A'){
       UPDATE Master SET A='$A'+20 WHERE user_id='$id'";
    } elseif($column_name == 'B'){
       UPDATE Master SET B ='$B'+30 WHERE user_id='$id'";
    }elseif($column_name == 'C'){
       UPDATE Master SET C ='$C'+50 WHERE user_id='$id'";
    }    
}

【讨论】:

  • 感谢艾哈迈德先生的回复,我有一个疑问,如果我们有超过 3 列,那么每次我们必须创建 if 语句?或任何简单的方法?
  • 您在每种情况下都有一个特定的数字要添加! : 20,30,50,所以你必须检查列名。如果您必须添加的数字对所有人都相同,例如20,那么就不需要if语句:UPDATE Master SET $column_name ='$column_name'+20 WHERE user_id='$id'"; - 你可以在mysql中使用CASE ... WHEN语句,但是这种方式只会将if语句从php转换为mysql!
  • 感谢您再次回复。我有 $column_name=$A(我从其他表中获得的这个值)+ 20(数字不同)
  • 那么也许这不是一个好主意?
  • @NarendraVerma 您可以在 php 中使用 swith case 语句而不是 if ,以减少代码
猜你喜欢
  • 2017-04-26
  • 1970-01-01
  • 2012-05-13
  • 2011-02-11
  • 2019-01-03
  • 1970-01-01
  • 2020-05-13
  • 2012-06-25
  • 1970-01-01
相关资源
最近更新 更多