使用PHP foreach

时间:2017-08-22 09:24:48

标签: php mysql foreach

我想连续更新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 ...

的每个选定记录

5 个答案:

答案 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();

 }