php - 如何通过php数组一条一条更新mysql中的每条记录?

标签 php mysql arrays

我正在尝试更新我的一个表,其中有多个记录,但我想更新一个数组中的所有序列,因为数组是关联数组,所以我想用第一个数组项更新第一个记录,然后用第一个记录更新第二个记录第二个数组项,但我通过以下代码尝试的是我的最后一个数组被更新到每条记录中。我的查询中没有任何 WHERE 子句..! 这是我的代码:

$json = '[
    {
        "x": 0,
        "y": 0
    },
    {
        "x": 4,
        "y": 0
    }
]';

$decoded_json = json_decode($json,true);

foreach ($decoded_json as $row) {
  $x=$row['x'];
  $y=$row['y'];

 $query = mysqli_query($mysqli,"UPDATE clients SET x='$x',y='$y'");
}

这是我的 clients 表 SHOW CREATE :

CREATE TABLE `clients` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `full_name` text NOT NULL,
 `age` text NOT NULL,
 `city` text NOT NULL,
 `profession` text NOT NULL,
 `client_id` text NOT NULL,
 `info` text NOT NULL,
 `profile_photo` text NOT NULL,
 `x` text NOT NULL,
 `y` text NOT NULL,
 PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

最佳答案

首先是一些重要的基础信息:

  1. SQL Update在没有 where 子句的情况下,语句对整个表进行操作。
  2. 因此数组中的最后一个条目是最后一个 UPDATE 语句,因此它会影响所有行。
  3. MySql 表中的顺序是 not guaranteed在没有 Order By 子句的情况下。

然后问题变成了我们如何用第一个数组项更新第一个记录,然后用第二个数组项更新第二个记录

您需要某种方式将表的行关联到 json。

一个可能的 hack 是选择表的主键并使用它来控制更新。

// Assuming that 'ID' is the name of primary key column of the table clients
$pkResult = mysqli_query($mysqli, "SELECT ID from clients ORDER BY ID");
$pks = pkResult->fetch_all();
foreach ($decoded_json as $index=>$row)
{
    $x=$row['x'];
    $y=$row['y'];
    $pk = $pks[$index][0]; // The pk will be in index 0 of the returned array

    $query = mysqli_query($mysqli, "UPDATE clients SET x='$x',y='$y' WHERE id = $pk");
}

处理此类问题的更好方法是在 json 中包含主键。这样 json 就可以更好地记录对数据库执行的操作。此外,任何允许您将 json 行关联到表行的列都可以使用。 (最好有速度和稳定性指标)。

最后, 如果您没有主键,那么也许您可以从 json 中删除并租用数据。

关于php - 如何通过php数组一条一条更新mysql中的每条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32703575/

相关文章:

php - 有条件必填的 WooCommerce 结帐字段

javascript - 比较两个字符串数组 Javascript 的最快/最有效的方法

mysql union 减语法

java - 使用列表 Android Studio 从 HTMLData 获取 URL

ios - NSArray 元素无法匹配 Swift 数组元素类型

php - json_decode($data, true);不起作用

javascript - 如何使用 jQuery 加载包含 Chart.js 的页面

php - 导出为 csv 时,货币英镑显示为 £

C#:Select 语句未出现正确的结果

mysql - AWS RDS MySQL - GROUP_CONCAT 返回多行而不是逗号分隔的字符串