2017-06-30 93 views
0

我似乎无法弄清楚只更新包含空值的单元格的方法。利用这个语句(初始数据库更新后)将初始数据模仿到相邻的单元格中,以便数据发生更改时,它具有基准参考。如何使用PDO和数组更新表格单元格

只需要找到一种方法,只允许这些单元更新一次。默认情况下,我将它们设置为NULL。每天将不同的数据集收集到具有唯一时间/日期标识的同一张表中。

$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. 

编辑:添加了一个更好地说明什么,如何和为什么的例子。

+0

发布一些示例数据和您的预期结果。 – Blank

+0

谢谢,试图澄清我想要完成的事情。缺少文档使我相信我完全使用了错误的方法。 – d3c0y

回答

0

你的数组声明中有语法错误。此外,我也知道这是挑剔的,的$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声明以查看它是否正确配置。

+0

感谢您的提示!为了保持简洁和简单,我在这里删减了很多声明,并在那里留下了一个流浪的逗号。只是在当前值为NULL的情况下查找一个方法来更新所有值。 – d3c0y

0

我不知道究竟是如何PDO作品,但我只是在某些地方,所以我只给你暗示与PDO更新上的空

$stmt = $dbh->prepare('UPDATE `access_users` SET `contact_first_name` = :firstname, `contact_surname` = :surname, `contact_email` = :email, `telephone` = :telephone WHERE `user_name` = :user_name'); 
$stmt->bindValue(':param', null, PDO::PARAM_INT); 
0

你将不得不把一个条件上的每个字段读,但像...

update `action-data` 
    set `angle_start` = if(`angle_start` is not null, `angle_start`, ?), 
.... 

的,如果将意味着,如果有一个值,那么它会保持相同的值,如果它是空它将使用新的价值。

相关问题