JSON数组访问-存储在数据库中

时间:2018-11-30 22:03:59

标签: php

我已经在数据库中存储了一个JSON字符串,以防止需要多列。如下所示,“数据”列包含三个字符串:外部,设备和内部。

enter image description here

我正在尝试访问变量,但是它没有按预期运行。 var_dump 数据字段上的会显示要访问的变量。

var_dump($ImpJson[1]->data);

string(72) "{ "external": "26.5", "device": "2333b23643fc42ee", "internal": "26.9" }"

但是,当我尝试访问单个变量时,出现错误消息,指出该变量不存在:

var_dump($ImpJson[1]->data['external']); 

Warning: Illegal string offset '"external"' 

我想到访问该字符串的唯一其他方法是通过范围函数,例如16-19 =外部,但是,我正在使用的数据是实时数据,并且如果设备ID更改且包含的字符较少,则整个范围值均无效,这并不是一个一致的解决方案。

如何访问数据库中等于JSON字符串的变量?

 function selectImp()
{
    global $conn;
    $sql = "SELECT * FROM Imp ORDER BY id DESC";
    $stmt = $conn->prepare($sql);
    $stmt->execute();
    $rows = array();
    $result = $stmt->get_result();
    while($r = $result->fetch_assoc())
    {
        $rows[] = $r;
    }
    return  json_encode($rows);


    //Selecting from database
$ImpText = selectImp();
$ImpJson = json_decode($ImpText);
//var_dump($ImpJson);
echo ' <div class="col-lg-4 col-md-6 col-sm-6 col-xs-12" id="articleDiv">';
    for ($i=0 ; $i<1 ; $i++) 
    {
        //var_dump($ImpJson[1]->data);
        var_dump($ImpJson[1]->data['external']); //16-19  34-49  66-69
          /*  echo '<p>'.$ImpJson[$i]->data[16,19].'</p>';
            echo '<p>'.$ImpJson[$i]->date.'</p>';
            echo '<p>'.$ImpJson[$i]->data.'</p>';
        echo '<hr>';*/
    }
echo '</div>';
    }

[![在此处输入图片描述] [3]] [3]

3 个答案:

答案 0 :(得分:4)

我建议您在获取行时已经对json进行解码:

function selectImp() {
   global $conn;
   $sql = "SELECT * FROM Imp ORDER BY id DESC";
   $stmt = $conn->prepare($sql);
   $stmt->execute();
   $rows = array();
   $result = $stmt->get_result();
   while($r = $result->fetch_assoc())
   {
      // decode that json already here!
      $r['data'] = json_decode($r['data']); 
      $rows[] = $r;
   }
   return  $rows;  // no need for a json_encode here...
                   // this would have gone messy anyway with a jsonstring inside that..
}

$ImpText = selectImp();
// now you'll find your values here:
$ImpText[0]['data']->external;
  • $ImpText是所有行的数组,因此我们需要[i]才能访问行
  • 行是列的数组-> ['data']
  • 数据是一个对象(根据json字符串),因此->external

所以输出看起来像这样:

echo ' <div class="col-lg-4 col-md-6 col-sm-6 col-xs-12" id="articleDiv">';
for ($i=0 ; $i<count($ImpJson) ; $i++) 
{
     echo '<p>'.$ImpText[$i]['data']->external.'</p>';
     echo '<p>'.$ImpText[$i]['data']->device.'</p>';
          // the 'normal' data:
     echo '<p>'.$ImpText[$i]['id'].'</p>';
     echo '<hr>';
}
echo '</div>';

还可以查看mysql中的新JSON数据类型: https://dev.mysql.com/doc/refman/8.0/en/json.html 可能值得考虑切换到该位置。

答案 1 :(得分:3)

尝试在JSON字符串上使用json_decode

$data = json_decode($ImpJSON[1]->data);

json_decode接受JSON编码的字符串,并将其转换为PHP变量。

答案 2 :(得分:1)

您需要先将json转换为数组,然后才能像这样访问它:

ORA-01799: a column may not be outer-joined to a subquery
01799. 00000 -  "a column may not be outer-joined to a subquery"
*Cause:    <expression>(+) <relop> (<subquery>) is not allowed.
*Action:   Either remove the (+) or make a view out of the subquery.
           In V6 and before, the (+) was just ignored in this case.