Hello I recently created a database using this tutorial: https://www.digitalocean.com/community/tutorials/a-basic-mysql-tutorial
I need to convert my sql database to a json array (like the one shown below) I am making my first mobile app using phone gap, this question isn't about phone gap but i doubt providing some context can't hurt.
I want the app (which can only use html, css and js) to make requests to a sql database the best way to do this for me is to convert the whole database to a json array once a phone makes one request for the json the new json database will be cached on the phone for that day.
(even if caching like this isn't possible or practical it doesn't matter in regards to this question)
I have added three "listings" to the database with via the following method:
INSERT INTO anime
(id
,category
,genre
,title
,description
,image_link
,date_added
) VALUES
(NULL
,"Mainstream"
,"Action"
,"the title"
,"the name"
,"200 word description"
,"imagename.png"
,'2012-04-14'
);
I am unsure whether this method has created the database the way I wanted, as I have tried making multiple requests for the full information and only one way has worked that being said my PHP skills are rubbish.
I was hoping to generate something along the lines of this (any better ways to format it would be greatly appreciated and how to grab and use information from it easily ) i have been looking at json_encode(); and have read: How to build a JSON array from mysql database and other stacks..
categories: [
{
"category-name" : "Mainstream",
"category-description" : "Everyones watching them for a reason",
"category-link" : "#mainstream",
"Mainstream" : [
{
"genres" : [
{
"genre-name" : "Action",
"genre-description" : "Mainstream: Fight them off",
"list" : [
{
"img" : "www.ActionimglinkMainstream1.com",
"name" : "ActionMainstreamname1",
"description" : "this Action is Mainstream name 1"
},
{
"img" : "www.ActionimglinkMainstream2.com",
"name" : "ActionNewname2",
"description" : "this Action is Mainstream name 2"
},
{
"img" : "www.FantasyimglinkMainstream3.com",
"name" : "FantasyMainstreamname3",
"description" : "this Action is Mainstream name 3"
}
]
},
{
"genre-name" : "Fantasy",
"genre-description" : "Mainstream: I put a spell on you",
"list" : [
{
"img" : "www.FantasyimglinkMainstream1.com",
"name" : "FantasyMainstreamname1",
"description" : "this Fantasy is Mainstream name 1"
},
{
"img" : "www.ActionimglinkMainstream2.com",
"name" : "FantasyNewname2",
"description" : "this Fantasy is Mainstream name 2"
},
{
"img" : "www.FantasyimglinkMainstream3.com",
"name" : "FantasyMainstreamname3",
"description" : "this Fantasy is Mainstream name 3"
}
]
}
]
}
]
}]
Thanks for your time, information and insight! please understand I am new to PHP, mysql and JavaScript but not google/stackoverflow I have googled and searched and tried to do this myself but it's just not working..
Just to be clear I want to know how to covert a mySQL database to a json array that I can make requests to from a html + js mobile app.
To confirm how the database was set up:
I recommend to put answers (right or wrong, doesn't matter, the vote will determine it) into the answer section. Because it is easier to read
Anyway, try this. This is using PDO (an alternative to mysqli)
Connect to database and do a SELECT you can make it as complicated as you want with INNER JOINS, LEFT JOINS, UNIONS, etc
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT * FROM anime");
$stmt->execute();
// set the resulting array to associative
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
Then you want to convert it to JSON, via json_encode which you already know
$output = json_encode($result)
You want to output it (as a JSON). You can use echo and don't forget to set the header to be JSON
header('Content-Type: application/json');
echo (output);
Note that this PHP returns you the JSON, and not injecting it into javascript as what #user1871802 suggested
Related
I'm currently using node-ews in a project to access an Exchange Web Server via node.js. Now i ran into a weird problem. To run for example a "CreateItem" request, which can be an E-Mail or Appointment for example, I'm giving the function the arguments as a json similar to this
var args = {
"attributes" : {
"SendMeetingInvitations" : "SendToAllAndSaveCopy"
},
"SavedItemFolderId": {
"DistinguishedFolderId": {
"attributes": {
"Id": "calendar"
}
}
},
"Items" : {
"CalendarItem" : {
"Subject" : "",
"Body" : {
"attributes" : {
},
"$value" : ""
},
"ReminderIsSet" : "true",
"ReminderMinutesBeforeStart" : "30",
"Start" : "",
"End" : "",
"IsAllDayEvent" : "false",
"LegacyFreeBusyStatus" : "Busy",
"Location" : ""
}
}
};
As the REST-API I'm writing will receive Attributes like Subject, Start, End etc. I initially stripped out those out of the JSON and would define them later like
args.Items.CalendarItem.Subject = req.body.Subject;
Oddly this will make the internal validation of node-ews fail and tell me that CalendarItem has an invalid Child Subject. If i leave Subject als an empty string in the initial args and later change it set it to req.body.Subject it works just fine.
My question is this: Is the Object somewhat different if I later add attributes and if yes is there a way to do it right? Because I don't think its the best way to have a bunch of empty Attributes in my Object if they aren't used and define standard values for all of them even if api won't require them to be sent.
Would great if someone knew the answer. Hope i could clarify what the problem is
Ok,
so the problem seems to be this. Internally the JSON "object" seems to have an order based on the order the variable is defined. in JavaScript this is no problem. But when the xml is parsed, the tag that was defined last will also be at the end of the xml so if you had
<someTag>
<variable2 />
<variable3 />
</someTag>
and you add variable1 to your json by someTag.variable1 = x in the end the xml will look like this after beeing parsed by node-ews
<someTag>
<variable2 />
<variable3 />
<variable1 >x</variable1>
</someTag>
Now unfortunately the exchange web server seems to be picky about the order of the xml tags. so when you build your json be sure to use the direct order. Changing content of the json later will not affect the order.
I seem to have run into a rather unusual problem. Using a form builder I am able to store and render an admin created form in JSON format like so:
EDIT: this is my pulled data from MongoDB hence the id, i directly push my generated JSON into Mongo, i eliminate the ID part on fetching the data.
{
"_id" : ObjectId("5985608427f8510788b468ab"),
"fdata" : [
{
"type" : "header",
"subtype" : "h1",
"label" : "Date Of Commencement"
},
{
"type" : "paragraph",
"subtype" : "p",
"label" : "The partnership business shall be deemed to have commenced on and from <div><br></div>"
},
{
"type" : "date",
"required" : true,
"label" : "Date Field",
"description" : "Date Of Commencement",
"className" : "form-control",
"name" : "date-1501913203863"
}
]
}
Once it is rendered and values are filled in by a user i receive the values at the back end like so: (NODEJS)
{"date-1501913203863":"2017-08-12"}
Now I have to render the form back but with the filled values and it should look like a filled form. Is there a native way in JSON to do this? I was planning to go ahead with a python script to match the values to the fields but that seemed like overkill for this problem.
I hope to get some advise on this topic and not code. Your help is greatly appreciated!
rookie here. I've searched and searched and still remain ignorant.
I am making an array of markers/info windows for a Google Maps API. Currently, I have succeeded in loading my markers from an external JSON file. JSON data looks like this: https://codedump.io/share/5XUwRzOFvREi/1/json-array
pathway ./json/Markers
{"Markers": [
{
"title" : "Meow Monestary",
"position" : {
"lat" : 40.5178,
"lng" : -122.6438
},
"posterContact" : {
"name" : "Mr Meowser",
"email" : "MrMeow#Couch.com",
"phone" : "(555)-202-3040",
"private" : true
},
"type" : "myResidence",
"ownerContact" : {
"name" : false,
"email" : false,
"phone" : false,
"private" : true
},
"description" : "Meow meow purrrrr. Dogs are not my favorite but they are my second favorite.",
"private" : true
},
I want users to be able to fill out a form containing all of this data and then push the new marker object into the JSON array. So far I have collected the form, created a Javascript object, and converted it to a JSON string like this...
function submitForm(){
//place form data into array
var formData = $("#shelterForm").serializeArray();
//build the javascript object using the values in the array
var shelter = {
title:formData[0].value,
position:{
lat:formData[1].value,
lng:formData[2].value
},
posterContact:{
name:formData[3].value,
email:formData[4].value,
phone:formData[5].value,
private:formData[6].value
},
type:formData[7].value,
ownerContact:{
name:formData[8].value,
email:formData[9].value,
phone:formData[10].value,
private:formData[11].value
},
description:formData[12].value,
private:formData[13].value
};
shelterString = JSON.stringify(shelter);
}
I'm sure there was an easier way to do this. If you feel inclined to go into this... GREAT!! My main issue though is that now I have my JSON string, but can't figure out how to push it into my array. I'm thinking maybe pass the string to PHP and write to file, or possibly ajax allows this?
Whether or not you use AJAX, you will still need a script on the server to save the data server side. Doing an AJAX request is more advanced than just a regular form POST, so I would recommend against it for a beginner.
Once the data is sent to PHP, you will need to store it. The most common way this would be done is with a database, typically MySQL. When the form is posted, you would get the data from the $_POST variable and store it as a new row in the database. Then, for the JSON file, rather than using a static file, you would point the maps to a PHP script for the external JSON file. That script would then query the database, assemble the data into an associative array with code very much like your javascript submitForm() function, and then call json_encode() to convert that array into a JSON string that it would then print. On the client side, you would not need your submitForm() function anymore.
If you don't want to mess around with a database, you can use a regular file on your server and have the PHP script modify that file. It is a little messier, though, and if you have an error in your script or the server loses power while writing the file, you could lose all your data, so I would recommend also setting up a daily backup if you have important data in the file. Also, you will have to take special precaution to not allow two different people to submit their updates at the same time, since having two processes writing to the same file concurrently will cause garbage data. Databases are built to be more resilient to these problems out of the box.
If you want to go the file route, you would probably still want to move the creation of the JSON into PHP. Your javascript relies on the exact indicies of the form elements, and is hard to read and maintain. In PHP, you would have something like:
$shelter = [
'title' => $_POST['shelter_title'],
'position' => [
'lat' => $_POST['shelter_latitude'],
'lng' => $_POST['shelter_latitude']
],
The $_POST keys are the name attributes from your form elements, which makes it much easier to maintain than using index numbers, which would have to be renumbered if you added or removed a form field.
Then, you would need to lock the json file to make sure that two processes don't try to update it at the same time
if (!flock($json_filename,LOCK_EX)) {
die('We are having trouble updating our records. Please try again later.');
}
//Now nobody else can write to the file until the script finishes or calls flock($json_filename, LOCK_UN) to release the lock
Then, we load the old JSON file, and update it with our new record:
$old_json = file_get_contents($json_filename); //get JSON data as string
$old_data = json_decode($old_json); //convert JSON data into PHP array
$new_data = array_push($old_data['Markers'], $shelter); //add the new shelter to PHP array
$new_json = json_encode($new_data); //convert the PHP array back to a JSON string
file_put_contents($json_filename, $new_json); //write the string to the file
//json file is updated, so now you can display a message, or redirect the user to a new page with header('Location: foo')
I haven't tested this code, so back up your JSON before trying this.
What you should be doing here, is to have a local json file to which the google map api would be pointed to and to add to that file using the html form with a php action where you would ingest the form data and add it to the json file.
<form action="addJson.php" method="post">
addJson.php (to get the general idea)
<?php
$localFile = 'json/Markers.json';
$data = [$_POST]; // reformat if required
$existing = json_decode(file_get_contents($localFile));
$all = array_merge($existing,$data);
file_put_contents($localFile,json_encode($all));
echo 'thanks for addition';
?>
And you can totally omit the javascript submitForm function.
My database is formatted like this:
{
"latitude" : 41.884629,
"longitude" : -87.648764,
"name" : "Bar Siena",
"placeID" : "ChIJf3h_t9osDogReehZO7Hgk50",
"vibes" : {
"LGpswrvLgfYppcBG4bpmNzXQVoU2" : {
"rating" : 1,
"timestamp" : 1.477961061358844E9
},
"OSzA2KhTBWS3pxVnCZ6eScAuNDG3" : {
"rating" : 5,
"timestamp" : 1.477955566836665E9
}
}
}
I want to pull both the names of each bar, and every rating corresponding to it in the vibes table. My code looks like this:
firebase = pyrebase.initialize_app(config)
db = firebase.database()
for i in range(1,100):
venues = db.child("venues").child(i).get()
dict = (venues.val())
print(dict['name'])
So far i'm only able to get the names, but i'm not sure how to go deeper and get the ratings. My database is managed using Firebase, and I'm using a python library called Pyrebase that's just a wrapper for the javascript api. I'm having trouble because each vibe has a generated hash key so i'm not sure how to go deeper. Any thoughts?
vibes probably comes as a dictionary. What you want are the ratings of each hash key, so you can do something like
for hashkey, vibe_dict in dict['vibes'].items(): # dict is a Python keyword, so it's a bad choice for a variable!
print(hashkey, vibe_dict['rating'])
I am not sure about firebase, but in plain python you may do it like:
>>> for vibe in my_json['vibes'].values():
... print vibe['rating']
...
1 # Rating of item 1
5 # Rating of item 2
where my_json is the dict build from your json:
{
"latitude":41.884629,
"longitude":-87.648764,
"name":"Bar Siena",
"placeID":"ChIJf3h_t9osDogReehZO7Hgk50",
"vibes":{
"LGpswrvLgfYppcBG4bpmNzXQVoU2":{
"rating":1,
"timestamp":1.477961061358844E9
},
"OSzA2KhTBWS3pxVnCZ6eScAuNDG3":{
"rating":5,
"timestamp":1.477955566836665E9
}
}
}
If your venues variable is a JSON-like object as in example, you can use the standart json library to work with it:
import json
dict_data = json.loads(venues)
print dict_data['latitude']
Btw, it's a bad style of development - to overwrite built-in Python funuctions. In your example you're overwriting dict(dict is a default Python type-object)
I have a website that has a front-end view for non-registered users and then a portal view for registered users.
I am trying to re-vamp the product navigation, wanting to make it easily maintainable for adding/removing links I want this to be in JSON format.
I am using Mura CMS with ColdFusion.
Probably a fairly simple thing I am trying to do but cannot find any examples online.
I have my JSON data as below:
{
"category" : [
{
"name" : "digital stickers",
"products" : [
{
"name" : "round digital stickers",
"urlPublic" : "index.cfm/digital-stickers/round-stickers",
"urlPortal" : "tab=round digital stickers"
},
{
"name" : "square digital stickers",
"urlPublic" : "index.cfm/digital-stickers/square-stickers",
"urlPortal" : "tab=square digital stickers"
}
]
},
{
"name" : "Litho stickers",
"products" : [
{
"name" : "round litho stickers",
"urlPublic" : "index.cfm/litho-stickers/round-stickers",
"urlPortal" : "tab=round litho stickers"
},
{
"name" : "square litho stickers",
"urlPublic" : "index.cfm/litho-stickers/square-stickers",
"urlPortal" : "tab=square litho stickers"
}
]
}
]
}
As you can see I have the category name, which I will use to determine the 'Digital Stickers' and 'Litho Stickers'. I will then loop through the data to pull out the different products names and depending if portal user or public user will take the data to insert into the URL.
To get started I just need to know how to link this into my ColdFusion application. Not a massive ColdFusion Guru yet, more into my JavaScript languages, so any help here would be highly appreciated.
From there I should be good to go.
Just in case that is a bit vague, like html documents link the stylesheet with a tag - how do you link the JSON to the ColdFusion document? Is it like including a ?
After searching around for a while I found a good example on the help.adobe website.
This line of code accesses the JSON data and pulls it in for use
<!--- Get the JSON Feed --->
<cfhttp url="http://localhost:8500/project/JSON_FILE.json">
After that I Deserialized it with
<cfset cfData=DeserializeJSON(theData)>
Then to test I had everything coming back correctly I used a cfdump
<cfdump var="#theData#">
I wanted to spit out only specific data so I did a cfloop to loop through the data array
<h2>Categories</h2>
<cfloop array="#dataArray#" index="elem">
<!--- print out value for demo purposes --->
<cfoutput>
<h3>#elem.name#</h3>
</cfoutput>
</cfloop>
This printed out 'Digital Stickers' and 'Litho Stickers' as expected.
My resources were Adobe Help - getting and deserializing the JSON and Experts Exchange - Loop over deserialized JSON.