【问题标题】:Update mysql table with an array用数组更新 mysql 表
【发布时间】:2012-12-08 17:53:01
【问题描述】:

我有桌子:平台

此表内的列:1. first_scan_date, 2. next_scan_date 3. scan_frequency

现在,我从基于网络的公式中得到了这样的数组:

Array
(
    [scan_freq1] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 0
            [3] => 0
        )

    [first_scan_date1] => Array
        (
            [0] => 0000-00-00
            [1] => 0000-00-00
            [2] => 0000-00-00
            [3] => 0000-00-00
        )

    [next_scan_date1] => Array
        (
            [0] => 
            [1] => 
            [2] => 
            [3] => 
        )

)

如何使用来自 PHP 数组的内容在数据库中更新它?我想我需要像 foreach 这样的东西,但不知道......

更新平台 (first_scan_date,next_scan_date,scan_frequency) VALUES (?,?,?)...

帮助?

【问题讨论】:

  • 这个帖子回答得很好stackoverflow.com/questions/7884284/…
  • 哦,谢谢,没看过。
  • 你想要insertupdate 吗?
  • 如何识别表格的特定行?你想更新表格的所有行吗?
  • 它们由平台类型识别:os、mw、net。此示例适用于操作系统,因此 WHERE platformtype='os'。

标签: php mysql arrays foreach


【解决方案1】:

我会遍历数组以准备一个要插入到单个查询中的字符串,如下所示:

$sql = "INSERT INTO table (first_scan_date,next_scan_date,scan_frequency)
VALUES ('0000-00-00','0000-00-00',1),('0000-00-00','0000-00-00',1),('0000-00-00','0000-00-00',1)
ON DUPLICATE KEY UPDATE first_scan_date=VALUES(first_scan_date),next_scan_date=VALUES(next_scan_date),scan_frequency=VALUES(scan_frequency);";

你可以这样做:

$freq = $arr['scan_freq1'];
$date1 = $arr['first_scan_date1'];
$date2 = $arr['next_scan_date1'];
foreach ($date1 as $key => $value){
    $row[] = "('".$value."','".$date2[$key]."',".$freq[$key].")";
}
$list = implode(',', $row);
$sql = "INSERT INTO table (first_scan_date,next_scan_date,scan_frequency)
VALUES ".$list."
ON DUPLICATE KEY UPDATE first_scan_date=VALUES(first_scan_date),next_scan_date=VALUES(next_scan_date),scan_frequency=VALUES(scan_frequency);";

【讨论】:

  • 看起来不错,能否请您包含用于查询特定值的循环?
  • 您的 SQL 语法有误;查看与您的 MySQL 服务器版本相对应的手册,了解在 '5)、(2012-12-26,,7)、(2012-12-14,,5),(2012-12-07, ,8) 在第 2 行首先进行重复密钥更新
  • 我不确定是什么问题。我使用了确切的语法并成功进行了更新。 $sql 字符串有什么作用?
  • 你能把它改成只更新吗?之前没有 INSERT?我认为对我来说会更容易,并且仍然可以正常工作。
  • 使用 INSERT 是一种 hack。 UPDATE 不允许您使用这样的列表。
【解决方案2】:

试试下面的方法

$cnt = count($arr['scan_freq1']);
for($i=0;$i<$cnt;$i++){
  echo $arr['scan_freq1'][$i];
  echo $arr['first_scan_date1'][$i];
  echo $arr['next_scan_date1'][$i];

//now you have three values make query and update into db

$db->prepare(
     "UPDATE `platforms` SET `first_scan_date`=?, `next_scan_date`=?,
     `scan_frequency`= ? WHERE platformtype='os'"
 )->execute(array($arr['first_scan_date1'][$i],$arr['next_scan_date1'][$i],$arr['scan_freq1'][$i]));
}

【讨论】:

  • 嗯,看表,没更新,有什么简便的方法可以调试mysql可能报错的结果吗?
【解决方案3】:

这可能会迟到,但可能会对现在或未来的人有所帮助,我相信这是实现这一目标的最短方法

public function update($table,$values,$where_clause)
{
  foreach ($values as $key => $val)
  {
    $valstr[] = $key." = '$val'";
  }

 $update_query = 'UPDATE '.$table.' SET '.implode(', ', $valstr)
 ." WHERE ".$where_clause; 
  return $update_query;
}

在其中一个 codeigniters 核心文件中发现了它,它只是循环遍历所有值 将它们存储在一个数组中,然后将数组转换为一个字符串并将其添加到查询中,最后一个 where 子句..我希望这对某人有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2020-06-27
    相关资源
    最近更新 更多