我想连续更新MySQL数据库记录......
下面的代码用于将数据库与PDO连接并选择一个表,使用foreach
循环从中提取数据然后,我希望能够根据以下内容更新每行的状态提取数据..
如何使用PHP和MySQL正确完成此操作,以便逐行提取和更新行...
代码:
// Database connection
define('DBHOST','localhost');
define('DBUSER','username');
define('DBPASS','password');
define('DBNAME','database');
try {
//create PDO connection
$db = new PDO("mysql:host=".DBHOST.";dbname=".DBNAME, DBUSER, DBPASS);
$db->exec("set names utf8");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
//show error
echo '<p>'.$e->getMessage().'</p>';
exit;
}
$sql = 'SELECT * FROM table';
foreach ($db->query($sql) as $row) {
$id = $row['id'];
$status= $row['status'];
echo $status;
if($status==1) {
//Update status
//$sql_update = "UPDATE table SET status=2 WHERE id=". $id ."";
}
}
我想更新状态为1到2 ...
的每个选定记录答案 0 :(得分:1)
你可以在一个查询中真正做到这一点:
UPDATE table SET status=2 WHERE status=1
你有没有理由一个接一个地做这个?如果是性能原因,您可以批量限制查询,如下所示:
UPDATE table SET status=2 WHERE status=1 LIMIT 100
如果你真的需要逐个循环它们,将这个片段放在你的if语句中应该有所帮助:
$updateSql = "UPDATE table SET status=2 WHERE id=:id";
// Prepare statement
$stmt = $db->prepare($updateSql);
$stmt->bindParam(":id", $id);
// execute the query
$stmt->execute();
但是,您应该通过将查询限制为状态= 1的行并将其限制为您实际需要的数据来提高选择效率,因此您不需要执行if,只需运行我的代码段即可直接循环:
SELECT id FROM table WHERE status = 1
答案 1 :(得分:0)
如果我理解正确,只需使用查询
UPDATE table SET status=2 WHERE id = :id
并使用PDO prepare
将:id
绑定到解压缩的$id
此外,您的SELECT
查询应如下所示:
SELECT id, status FROM table WHERE status = 1
如果您不需要使用SELECT
语句返回的数据,只需点击UPDATE
查询到您的数据库,而不选择以下内容:
UPDATE table SET status=2 WHERE status=1
但是,如果有许多记录需要更新(谈论100k +),这不是最好的选择。
请注意,table
应该有status
的索引,因为查询不需要扫描每一行,但知道要更新的行。
答案 2 :(得分:0)
您的查询可以简化为:
UPDATE `table` SET status=2 WHERE status=1
在php中:
$sql = 'UPDATE `table` SET status=2 WHERE status=1';
$db->query($sql);
答案 3 :(得分:0)
我想更新状态为1到2 ...
的每个选定记录
如果您想更新记录,则不需要先发出select
声明。
事实上,它不会以这种方式工作,因为您在脚本中更新单个值而对数据库没有任何影响
作为通知,您可以考虑添加
$db->setAttribute(PDO::ATTR_EMULATE_PREPARE,false)
使准备好的语句激活,事实上这是一个安全问题
答案 4 :(得分:0)
我很好理解你可以这样做......
$sth = $db->prepare("INSERT INTO table VALUES(:value, :value1, :value2, ...)");
foreach ($db->query($sql) as $row) {
$id = $row['id'];
$status= $row['status'];
if($status==1) {
$sth->bindParam(':value',$someValue));
$sth->bindParam(':value1',$someValue1));
$sth->bindParam(':value2',$someValue2));
//...
$sth->execute();
}