Convert JSON from MySQL to PHP - php

So i have this JSON in my MySQL Database
{
"11011001": {
"id": 11011001,
"name": "Test",
"price": 4,
"inCart": 7
}
}
Now i want to work with this data in PHP.
I got the JSON by doing this in PHP:
$sql = "SELECT article FROM test WHERE id = '$id'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
$aricle = $row["article"];
} else {
echo "Something went wrong";
}
After that i did this which resulted in getting a JSON Array:
$tarray = json_decode($article, TRUE);
What can i do now to get the values from the JSON?
For example i want the value of the price in a variable called $price.

$price = $tarray[11011001]['price'];
Or you can loop through the results if you have many articles
$tarray = json_decode($json,true);
foreach ($tarray as $index => $item)
{
$price[] = $item['price'];
}
var_dump($price);

Assuming you might have a collection of items, you can map the ids to prices with array_column.
<?php
$json =<<<JSON
{
"11011001": {
"id": 11011001,
"name": "Test",
"price": 4,
"inCart": 7
}
}
JSON;
$items = json_decode($json, TRUE);
$ids_prices = array_column($items, 'price', 'id');
var_export($ids_prices);
Output:
array (
11011001 => 4,
)
Only one item, but you don't know the key up front?
if(count($items) === 1) {
$item = array_pop($items);
$price = $item['price'];
}
echo $price;
Output:
4

First you have a sql injection, you must create a prepared query if you have data from users.
$sql = "SELECT article FROM test WHERE id = :id";
$query = $con->prepare($sql);
$query->bindValue(":id", $id);
$query->execute();
$result = $query->fetch();
if ($result) {
// $article will be stdClass if json correct
$article = json_decode($result['article']);
$price = $article->price;
// or $article = json_decode($result['article'], true);
// $price = $article['price'];
}
Just an example

Related

Insert multidimensional array into multidimensional json in PHP

I want to insert some data into sub in json data with my data in database
here is my code:
$sql = "SELECT * FROM pharma_data";
$result = mysqli_query($conn, $sql);
$data = array();
while ($row = mysqli_fetch_assoc($result)){
$row_array['id'] = $row['phar_id'];
$row_array['name'] = $row['name'];
$row_array['batch'] = $row['batch_no'];
$row_array['category'] = $row['category'];
$row_array['measurement'] = $row['measurement'];
$row_array['stock'] = $row['stock'];
$row_array['price'] = $row['price'];
$row_array['date'] = $row['date_added'];
$row_array['expiration'] = $row['expiration_date'];
$row_array['type'] = $row['medicin_type'];
$row_array['supplier'] = $row['supplier'];
array_push($data,$row_array);
}
$convert = json_encode($data);
echo $convert;
but the output of my code is:
[{"id":"8","name":"Test Product Name Pharmacy","batch":"Test Product Name Pharmacy","category":"Test Category Pharmacy","measurement":"1mg","stock":"2","price":"15","date":"February 18, 2021, 11:36 am","expiration":"2021-02-18","type":"Test Medicine Type Pharmacy","supplier":"Nicole Gonzaga"},{"id":"9","name":"Alaxan","batch":"Test user medicine Supplies","category":"Test Category Pharmacy","measurement":"1mg","stock":"66","price":"63.43","date":"February 28, 2021, 4:45 pm","expiration":"2021-02-28","type":"Test Medicine Type Pharmacy","supplier":"Nicole Gonzaga"},{"id":"10","name":"Medicol","batch":"987","category":"Test Category Pharmacy","measurement":"1mg","stock":"15","price":"123.23","date":"February 28, 2021, 5:42 pm","expiration":"2021-02-28","type":"Test Medicine Type Pharmacy","supplier":"Nicole Gonzaga"},{"id":"11","name":"test","batch":"test","category":"Test Category Pharmacy","measurement":"213","stock":"32","price":"123.78","date":"February 28, 2021, 6:43 pm","expiration":"2021-02-28","type":"Test Medicine Type Pharmacy","supplier":"Nicole Gonzaga"}]
Want output like this:
{
"total": 800,
"totalNotFiltered": 800,
"rows": [
{
"id": 0,
"name": "Item 0",
"price": "$0"
},
{
"id": 1,
"name": "Item 1",
"price": "$1"
}
]
}
enter image description here
You need to filter out $data before sending it to the response so it means we need a function myFilter to filter the $data elements and we can filter all the elements in the array using array_map(). The total and totalFiltered column seems to give the total number of rows in $data hence the count(). Try the code below:
function myFilter($a) {
$row['id'] = $a['id'];
$row['name'] = $a['name'];
$row['price'] = $a['price'];
return $row;
};
$filterData = array(
'total' => count($data),
'totalNotFiltered' => count($data),
'rows' => array_map("myFilter", $data)
);
$convert = json_encode($filterData);
echo $convert;
Demo code would be here: https://ideone.com/pZCUbG
You need to convert the returned data. Something like:
$data = array();
while ($row = mysqli_fetch_assoc($result)){
$row_array['id'] = $row['phar_id'];
$row_array['name'] = $row['name'];
// $row_array['batch'] = $row['batch_no'];
// $row_array['category'] = $row['category'];
// $row_array['measurement'] = $row['measurement'];
// $row_array['stock'] = $row['stock'];
$row_array['price'] = $row['price'];
// $row_array['date'] = $row['date_added'];
// $row_array['expiration'] = $row['expiration_date'];
// $row_array['type'] = $row['medicin_type'];
// $row_array['supplier'] = $row['supplier'];
$data[] = $row_array; // Same as array_push($data,$row_array);
}
$final_data = array(
'total' => count($data),
'totalNotFiltered' => '',
'rows' => $data
);
$convert = json_encode($final_data);
echo $convert;
Commented out the data that isn't needed in this context (maybe you need it to use elsewhere, not sure. If so just uncomment back)
Not sure with totalNotFiltered as I don't know how you are calculating this. Maybe you can work with that and this gives you an idea to work with.

JSON decode any value - $var1 = $data['val1']['anyvalue']['val2'];

I am pulling in JSON data for a mySQL import and in setting the variables after my JSON decode statements of my JSON file I am struggling with something. My variable setting looks like so
$name = $data['available_channels']['3']['name'];
and the relevant JSON like this
"available_channels": {
"3": {
"num": 152,
"name": "Sky Sports 3",
"stream_type": "live",
"type_name": "Live Streams",
"stream_id": "3",
"stream_icon": "http://www.tv-logo.com/pt-data/uploads/images/logo/sky_uk_sports3.jpg",
"epg_channel_id": "Sky Sports 3",
"added": "0",
"category_name": "Sports UK",
"category_id": "5",
"series_no": null,
"live": "1",
"container_extension": null,
"custom_sid": ":0:86:EEE:7F2:2:11A0000:0:0:0:",
"tv_archive": 0,
"direct_source": "",
"tv_archive_duration": 0
},
My problem is that each channel for the service begins with a new number. So i need my variables to be pulled in like so,
$name = $data['available_channels']['ANY VALUE HERE']['name'];
any thoughts? I know it must be simple and I am having a blonde moment here
Thanks
UPDATE 1
//convert json object to php associative array
$data = json_decode($jsondata, true);
//get the values and asign variables
$name = $data['available_channels']['3']['name'];
UPDATE 2
Full Code Now
$data = json_decode($jsonFile, true);
for($i = 0; $i <= count($data['available_channels']); $i++){
$name = $data['available_channels'][$i]['name'];
$num = $data['available_channels'][$i]['num'];
$epg_channel_id = $data['available_channels'][$i]['epg_channel_id'];
$category_name = $data['available_channels'][$i]['category_name'];
$stream_icon = $data['available_channels'][$i]['stream_icon'];
//insert into mysql table
$sql = "INSERT INTO channels(name, num, epg_channel_id, category_name, stream_icon)
VALUES('$name', '$num', '$epg_channel_id', '$category_name', '$stream_icon')";
if(!mysql_query($sql,$con))
{
die('Error : ' . mysql_error());
}
}
Gets about 117 of 234 rows in but the other rows are blank... any thoughts
$name = array_values($data['available_channels'])[0]['name'];
array_values returns a new array consisting of the values of the source array, renumbered from 0.
You can count the number of channels inside the array, then loop through each channel.
for($i = 0; $i <= count($data['available_channels']); $i++) {
$name = $data['available_channels'][$i]['name'];
// TODO: Do something with the name
}
Or you could do what #cske said:
$channels = [];
foreach($data['available_channels'] as $k => $v) {
// this will keep the key's the same
$channels[$k] = $v['name'];
}
Or you could choose a more OO styled approach, see it working at 3v4l:
class Channel {
private $_data;
public function __construct($json) {
$this->_data = json_decode($json, true);
}
public function parse() {
$parsed = [];
foreach($this->_data['available_channels'] as $k => $v) {
$parsed[$k] = $v['name'];
}
$this->_data['available_channels'] = $parsed;
return $this;
}
public function getByKey($key) {
return $this->_data['available_channels'][$key];
}
}
$c = new Channel($json_response);
echo 'Name for Channel 3 is: ' . $c->parse()->getByKey('3');
So after update 2, this will work
foreach($data['available_channels'] as $d) {
$name = $d['name'];
$num = $d['num'];
$epg_channel_id = $d['epg_channel_id'];
$category_name = $d['category_name'];
$stream_icon = $d['stream_icon'];
//insert into mysql table
$sql = "INSERT INTO channels(name, num, epg_channel_id, category_name, stream_icon)
VALUES('$name', '$num', '$epg_channel_id', '$category_name', '$stream_icon')";
if (!mysql_query($sql, $con)) {
die('Error : ' . mysql_error());
}
}
Or if with for loop #KDOT answer, but corrected by #Niet the Dark Absol code
$data['available_channels'] = array_values($data['available_channels']);
for($i = 0; $i <= count($data['available_channels']); $i++) {
$name = $data['available_channels'][$i]['name'];
...
}
That is simply not true if a php array has count()=5 then it's keys are 0,1,2,3,4 what couses missing rows with KDOT's answer

Php Mysql Nested Category Subcategories Json Response

I would like to display categories and subcategories as json response using php mysql. I have three level categories. I am running this query but results not coming as expected. please help me to solve this.
I need json response like below
[{
"id": "1",
"name": "Electronics",
"categorieslevelone": [{
"id": "2",
"name": "Mobiles",
"categoriesleveltwo": [{
"id": "3",
"name": "Samsung",
"parent_id": "2"
}, {
"id": "4",
"name": "Nokia",
"parent_id": "2"
}]
}]
My Code:
header('Content-Type: application/json');
$sql = "select * from category where category_id = 0";
$q = $this->db->conn_id->prepare($sql);
$q->execute();
$json_response = array();
while ($row = $q->fetch(PDO::FETCH_ASSOC)) {
$row_array = array();
$row_array['id'] = $row['id'];
$row_array['name'] = $row['name'];
$row_array['categorieslevelone'] = array();
$id = $row['id'];
$sqltwo = "select * from category where category_id = ? ";
$r = $this->db->conn_id->prepare($sqltwo);
$r->bindParam(1, $id);
$r->execute();
while ($data = $r->fetch(PDO::FETCH_ASSOC)) {
$id2 = $data['id'];
$row_array['categoriesleveltwo'] = array();
$row_array['categorieslevelone'][] = array(
'id' => $data['id'],
'name' => $data['name'],
);
$sql3 = "select * from category where category_id = ? ";
$s = $this->db->conn_id->prepare($sql3);
$s->bindParam(1, $id2);
$s->execute();
while ($list = $s->fetch(PDO::FETCH_ASSOC)) {
$row_array['categoriesleveltwo'][] = array(
'id' => $list['id'],
'name' => $list['name'],
);
}
}
array_push($json_response, $row_array); //push the values in the array
}
echo json_encode($json_response);
I'm getting a result like you mentioned above. Chenck this out. You have to convert procedural into Object oriented method.
$main_cat = array();
while($row = mysqli_fetch_assoc($query))
{
$query2 = mysqli_query($con,'Select category_id as id,category_name as name from category where parent_id = '.$row['id'].'');
$sub_cat = array();
while($row1 = mysqli_fetch_assoc($query2))
{
$query3 = mysqli_query($con,'Select category_id as id,category_name as name from category where parent_id = '.$row1['id'].'');
$sub_cat2 = array();
while($row2 = mysqli_fetch_assoc($query3))
{
array_push($sub_cat2, $row2);
}
$row1['categoriesleveltwo'] = $sub_cat2;
array_push($sub_cat, $row1);
}
$row['categorieslevelone'] = $sub_cat;
array_push($main_cat, $row);
}
echo json_encode($main_cat);
?>
Hope its will satisfy your requirement
I know this answer is already accepted, but I thought it would make nice code kata.
Code below will build tree structure from adjacency list that you have in db. There are more ways to maintain tree structures, but there's no easy way - all methods involve maintance/code efficiency trade offs.
I used references to build whole tree in one loop regardless of nested nodes number and order in which rows are fetched (would be much easier when parent node was already fetched, but would need extra attention to changes in db) - this way you could order categories alfabetically with db query.
Since it works for any nesting level all children are stored under subcategories key (opposed to categorieslevelxxx), but each subtree might be processed the same way.
...
$link = [];
$data = [];
while ($row = $q->fetch(PDO::FETCH_ASSOC)) {
$id = $row['id'];
$parent = $row['category_id'];
unset($row['category_id']);
empty($link[$id]) or $row += $link[$id];
isset($link[$parent]['subcategories']) or $link[$parent]['subcategories'] = [];
$link[$parent]['subcategories'][] = $row;
$last_idx = count($link[$parent]['subcategories']) - 1;
$link[$id] = & $link[$parent]['subcategories'][$last_idx];
}
$data = $link[1];
unset($link); //tree might be cached here.
$link[1] at the end means we want category 1 and all it's descendants, but you might take any other node. $link[0] would take entire tree when there's more root categories (category_id = 0 in db points to "virtual" root).

Json wont response my array in php

I am trying to fetch multiple rows from my database and then encode them with json so I can access them in my Android application. I've successfully encoded an object but I couldn't find a way to do the same with an array. My code looks like:
if ($tag == 'friends') {
$id = $_POST['id'];
$friends = $db->getMyFriends($id);
if ($friends != false) {
// friends found
$result[] = array();
while($row = mysql_fetch_assoc($friends)){
$response[ "error"] = FALSE;
$result[] = array(
$response["friends"]["unique_id"] = $row["unique_id"],
$response["friends"]["name"] = $row["name"],
$response["friends"]["email"] = $row["email"]);
}
echo json_encode($response);
}
The code from getMyFriends($id) I have already tested and it works fine. It returns :
$result = mysql_fetch_array($result);
return $result;
When using a rest client passing the parameters:
Tag: friends
id: $id
this is the json response that I get:
{
"tag": "myfriends",
"error": false
}
, but no actual database data.
If anyone knows what I'm doing wrong, I'd really appreciate it, I've been browsing the internet for hours now.
If getMyFriends already have a $result = mysql_fetch_array($result);you don't need to fetch again.
You could simply:
$friends = $db->getMyFriends($id);
echo json_encode($friends);
But that will only return one friend, if you want all remove $result = mysql_fetch_array($result); from getMyFriends and return the pure mysql_result, then do something like:
$result = array();
while($row = mysql_fetch_assoc($friends)){
array_push($result,$row);
}
echo json_encode($result);
I tried this and it worked.
if($tag=='friends'){
$id = $_REQUEST['id'];
$friends = $db->getMyFriends($id);
if ($friends != false) {
// friends found
$result[] = array();
while($row = mysql_fetch_assoc($friends)){
$response[ "error"] = FALSE;
$result[] = array(
$response["friends"]["unique_id"] = $row["id"],
$response["friends"]["name"] = $row["name"],
$response["friends"]["email"] = $row["email"]
);
}
echo json_encode($result);
}
}

Return In JSON Format, PHP

In a project, I have to return user_id, user_age from the database and the return format should be like
user object which contains user_id and user_age
average age of users
count of users
the return format should be in JSON format.
I have created user array and encoded to JSON by using the method
json_encode(user);
my code is like this :
while ($row = mysql_fetch_array($result)) {
$user["id"] = $row["id"];
$user["name"] = ucfirst($row["user_name"]);
$user["date"] = $row["date_of_treatment"];
$user["age"] = $row["age_of_user"];
// push single user into final response array
array_push($response, $user);
$count = $count+1;
$sum_of_age = $sum_of_age+$row["age_of_user"];
}
echo json_encode($response);
I have calculated the average age ($sum_of_age/$count) and count of returned users ($count), but I don't know how to return average age and count of users with the same json response.any help will be appreciated.
You can do like this:
$count=0;
$sum_of_age=0;
$response=array();
$response['users']=array();
while ($row = mysql_fetch_array($result)) {
$user["id"] = $row["id"];
$user["name"] = ucfirst($row["user_name"]);
$user["date"] = $row["date_of_treatment"];
$user["age"] = $row["age_of_user"];
// push single user into final response array
array_push($response['users'], $user);
$count = $count+1;
$sum_of_age = $sum_of_age+$row["age_of_user"];
}
$response['count']=$count;
$response['avg']=$sum_of_age/$count;
echo json_encode($response);
You can try this:
$users = array();
$sum_of_age = 0;
$count = 0;
$users = array();
while ($row = mysql_fetch_array($result))
{
$user["id"] = $row["id"];
$user["name"] = ucfirst($row["user_name"]);
$user["date"] = $row["date_of_treatment"];
$user["age"] = $row["age_of_user"];
// push single user into final response array
$users[] = $user;
$count++;
$sum_of_age += (int) $row["age_of_user"];
}
$response = array(
'users' => $users,
'averageAge' => $sum_of_age/$count,
'count' => $count
);
echo json_encode($response);
This should result in the following json response:
{
"users":[
{ "id" : "1", "name" : "John Doe" , "date" : "2014-03-22 15:20" , "age" : 42 },
{...},
...
],
"averageAge": 42,
"count": 1337
}
<?php
$response = array();
while ($row = mysql_fetch_array($result)) {
$user["id"] = $row["id"];
$user["name"] = ucfirst($row["user_name"]);
$user["date"] = $row["date_of_treatment"];
$user["age"] = $row["age_of_user"];
// push single user into final response array
array_push($response, $user);
$count = $count+1;
$sum_of_age = $sum_of_age+$row["age_of_user"];
}
$response["average_age"] = $sum_of_age / $count;
$response["count"] = $count;
echo json_encode($response);
}
This is the answer, thanks #Amal Murali (commented a link), the link you have provided is working.. :-)

Categories