我正在尝试更新我的一个表,其中有多个记录,但我想更新一个数组中的所有序列,因为数组是关联数组,所以我想用第一个数组项更新第一个记录,然后用第一个记录更新第二个记录第二个数组项,但我通过以下代码尝试的是我的最后一个数组被更新到每条记录中。我的查询中没有任何 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
最佳答案
首先是一些重要的基础信息:
- SQL Update在没有 where 子句的情况下,语句对整个表进行操作。
- 因此数组中的最后一个条目是最后一个 UPDATE 语句,因此它会影响所有行。
- 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/