我已经在数据库中存储了一个JSON字符串,以防止需要多列。如下所示,“数据”列包含三个字符串:外部,设备和内部。
我正在尝试访问变量,但是它没有按预期运行。 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]
答案 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']
->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.