2015-04-23 20 views
0

我实际上想要以相同的顺序更新mysql的输出。我有一个数据库,其中一些数据已经存在,并且sendondate是常见的。我试图更新,但它只更新最后的输出,而不是所有的序列。请帮我从这个..更新json结果mysql依次

<?php 
    $data = '[{"message":"Hello+Test+Message","sender":"test","billcredit":"0.00","messageStatus":"DND","sendondate":"2015-04-23 12:27:00","provider":"aaaa"},{"message":"Hello+Test+Message","sender":"test","billcredit":"0.00","messageStatus":"DELIVERD","sendondate":"2015-04-23 12:27:00","provider":"aaaa"}]'; 


     // $objs = json_decode($data); 
    $con=mysqli_connect("localhost","root","Password*9","sms9"); 
     $objs = json_decode($data,true); 
     foreach ($objs as $obj){ 
      $repor = $obj['messageStatus']; 
      // echo $repor . '<br />'; 
      $sen= $obj['sendondate']; 
      //echo $sen; 

      $repor=array(); 
      while($row = mysql_fetch_array($repor)) 
     { 
      $sql2= "Update detail SET Delivery='$repor' WHERE Datetime='$sen'"; 
    if(mysqli_query($con, $sql2)){ 
      echo "up"; 
      } 
     } 

     } 

    ?> 

回答

0

只需卸下$repor=array()while条件(我看不到,什么是它的目的):

<?php 

$data = '[ 
    {"message":"Hello+Test+Message","sender":"test","billcredit":"0.00","messageStatus":"DND","sendondate":"2015-04-23 12:27:00","provider":"aaaa"}, 
    {"message":"Hello+Test+Message","sender":"test","billcredit":"0.00","messageStatus":"DELIVERD","sendondate":"2015-04-23 12:27:00","provider":"aaaa"} 
]'; 

// $objs = json_decode($data); 
$con = mysqli_connect("localhost","root","Password*9","sms9"); 
$objs = json_decode($data,true); 

foreach ($objs as $obj) { 
    $repor = $obj['messageStatus']; 
    // echo $repor . '<br />'; 
    $sen = $obj['sendondate']; 
    //echo $sen; 

    $sql2 = "Update detail SET Delivery='$repor' WHERE Datetime='$sen'"; 
    if (mysqli_query($con, $sql2)) { 
     echo "up"; 
    } 
} 

更新基于您的评论:

在sql中,如果你想修改特定的行,你必须使用适当的条件匹配它们。通常,根据诸如datetime之类的非唯一列来选择行并不是一个好主意。所以,如果你可以改变你都DB和JSON数据,通常的方法是定义某种ID(通常是整数):

$data = '[ 
    {"id": 123, "message":"Hello+Test+Message","sender":"test","billcredit":"0.00","messageStatus":"DND","sendondate":"2015-04-23 12:27:00","provider":"aaaa"}, 
    {"id": 666, "message":"Hello+Test+Message","sender":"test","billcredit":"0.00","messageStatus":"DELIVERD","sendondate":"2015-04-23 12:27:00","provider":"aaaa"} 
]'; 
... 
    $id = $obj['id']; 
    ... 
    $sql2 = "Update detail SET Delivery='$repor' WHERE id=$id"; 

或者,如果你不能添加额外的列,你必须添加一个已经定义的用于区分具有相同日期时间的行,例如发件人(发件人值必须不同于记录以区分它们,这在json示例数据中不是这种情况,但这仅仅是使用示例):

... 
    $sender = $obj['sender']; 
    ... 
    $sql2 = "Update detail SET Delivery='$repor' WHERE Datetime='$sen' AND sender='$sender'"; 

额外的安全提示: 一般来说,你应该prope将数据发送到db之前,防止sql injection。或者,您可以使用prepared statementsbinded parameters

+0

我也尝试删除相同的提及,但它只存储$ repor中存储的最后一个值。我无法顺序存储$ repor的所有值。 @Honza Haering – Seego

+0

在你的json数据中,两个记录都有相同的“sendondate”。所以where子句在db中选择相同的记录。数据库首先将“Delivery”列更新为“DND”,然后用“DELIVERD”替换它。两者在db中的同一行上Datetime ='2015-04-23 12:27:00'。 现在的问题是,你想在这些更新后的数据库中有什么?两个记录,一个是'DND',一个是'DELIVERD'? –

+0

它会扣除信贷..我想我没有让你明白。我发送短信给两个号码。所以在同一时间,消息将被插入到数据库中。现在,我在一张桌子上有两个indendical sendondate。在我收到json一次发送后,我需要更新两个数字的状态。现在问题是它获得同样的状态更新,而不是相应的状态。所以请帮助我.. @Honza Haering – Seego