php - 如何使用 PDO 和数组仅更新表格单元格(如果为空)

标签 php mysql pdo mariadb

我似乎无法找出仅更新包含空值的单元格的方法。利用此语句(初始数据库更新后)将初始数据模拟到相邻单元格中,以便在数据更改时它具有基础引用。

只需要找到一种方法,只允许这些单元格更新一次。我已将它们设置为 NULL 作为默认值。每天都会将不同的数据集收集到具有唯一时间/日期 ID 的同一个表中。

$data        = "http://192.168.1.1/data.xml";
$domdoc      = new DOMDocument();
$domdoc      ->load($data);
$xml         = new Domxpath($domdoc);

$unitCount = $xml->query("//data/units")->length;

//get unit id's
$id_array = array();
$id = $xml->query('//data/units//@id');
foreach($id as $item){
  array_push($id_array, $item->nodeValue);
};

for ($i=0; $i < $unitCount; $i++){

  $id_db = $id_array[$i];

  //get unit angle
  unset($angle_array);
  $angle_array = array();
  $angle = $xml->query('//data/units[@id="'$id_array[$i]'"]//@angle');
  foreach($angle as $item){
    array_push($angle_array, $item->nodeValue);
  };

  //get unit speed
  unset($speed_array);
  $speed_array = array();
  $speed = $xml->query('//data/units[@id="'$id_array[$i]'"]//@speed');
  foreach($speed as $item){
    array_push($speed_array, $item->nodeValue);
  };

  //get unit charge
  unset($charge_array);
  $charge_array = array();
  $charge = $xml->query('//data/units[@id="'$id_array[$i]'"]//@charge');
  foreach($charge as $item){
    array_push($charge_array, $item->nodeValue);
  };

  $stmt = $dbh->prepare("REPLACE INTO `action-data` (
    `id`,
    `angle_start`,
    `angle`,
    `speed_start`,
    `speed`,
    `charge_start`,
    `charge`
  ) VALUES (?,?,?,?,?,?)");
  $stmt->execute(array(
    $id_db,
    $angle_db,
    $angle_db,
    $speed_db,
    $speed_db,
    $charge_db,
    $charge_db
  ));
}


| id  |angle_start|angle|speed_start|speed|charge_start|charge|
-------------------------------------------------------------------
| a4b |     1     |  2  |      0    |  5  |    100     |  31  |
| a4b |     3     |  7  |      0    |  4  |    95      |  29  |
| a4b |     1     |  5  |      0    |  5  |    100     |  4   |
| a4b |     3     |  4  |      0    |  2  |    97      |  36  |

            ^                  ^                ^
             \                 |               /
              These values default NULL and
              should be set once upon first input
              but ignored on future inputs if not == NULL.   

编辑:添加了一个示例,可以更好地说明内容、方式和原因。

最佳答案

您的数组声明中存在语法错误。另外,我知道这是挑剔的,$dbh->prepare()的结果是一个准备好的语句,而不是SQL,所以也许重命名你的变量,这样就不会让你自己感到困惑或将来的其他开发者:

$stmt = $dbh->prepare("REPLACE INTO `action-data` (
  `angle_start`,
  `speed_start`,
  `temp_start`,
  `direction_start`,
  `charge_start`
) VALUES (?,?,?,?,?)");
$stmt->execute(array(
  $angle_start_db,
  $speed_start_db,
  $temp_start_db,
  $direction_start_db,
  $charge_start_db
));

如果仍然不起作用,我们可能需要查看您的 $dbh 声明以查看其配置是否正确。

关于php - 如何使用 PDO 和数组仅更新表格单元格(如果为空),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44839246/

相关文章:

javascript - 从 PHP 获取多个数组到 AJAX

php - 使用寻路器在 modx revolution 中创建子菜单

mysql - 如何强制MySQL "Using index for group-by"

PHP PDO 不会在重复键插入时抛出异常

php - 从 mysql_connect() 获取 PHP PDO 连接?

php - 如何使用 Docker 连接 php-apache 和 MySQL?

php生成图像 curl 箭头

mysql - SQL Sum 返回错误值

javascript - 我不知道如何在 sequelize (Mac) 中使用 POST 方法

mysql - 在 join/order mysql 中使用 where 条件