Populate JS array from returned PHP/JSON - php

I have a JSON encoded array, to which i am returning to an AJAX request.
I need to place the JSON array into a JS Array so i can cycle through each array of data to perform an action.
Q. How do i place the JSON array contents into a JS array efficiently?
The PHP/JSON Returned to the AJAX
$sql = 'SELECT *
FROM btn_color_presets
';
$result = mysqli_query($sql);
$array = array(); //
while($row = mysql_fetch_assoc($result)) //
{
$array[] = $row;
$index++;
}
header("Content-type: application/json");
echo json_encode($array);

You can use JSON.parse function to do so:
var myObject = JSON.parse(response_from_php);
// loop over each item
for (var i in myObject) {
if (myObject.hasOwnProperty(i)) {
console.log(myObject[i]);
}
}
You can also use jQuery.parseJSON() if you are using jQuery, however jQuery also uses same function under the hood as priority if available.

Adding to Safraz answer:
If you're using jQuery, there's another way to do that. Simply add json as last parameter to your ajax calls. It tells jQuery that some json content will be returned, so success function get already parsed json.
Below example shows you simple way to achieve this. There's simple json property accessing (result.message), as well as each loop that iterates through whole array/object. If you will return more structurized json, containing list of object, you can access it inside each loop calling value.objectfield.
Example:
//Assuming, that your `json` looks like this:
{
message: 'Hello!',
result: 1
}
$.post(
'example.com',
{data1: 1, data2: 2},
function(response){
console.log(response.message) //prints 'hello'
console.log(response.result) //prints '1'
//iterate throught every field in json:
$(response).each(function(index, value){
console.log("key: " + index + " value: " + value);
});
},
'json'
)

Related

How to use a foreach loop with AJAX call?

I have a foreach loop that is called from my AJAX code. It appears that the foreach loop is being skipped right over. I would ultimately like to make it so that the foreach loop will execute a query using each value in the array, but I am first trying to test the the foreach loop works (which it does not). The alert (from my AJAX) that I am receiving is just the original array and not the one with the added items.
PHP:
$data = array();
if(isset($_POST['myArray']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']){
$data = $_POST['myArray'];
foreach ($data as $item) {
$data[] = $item;
}
echo json_encode($data);
die();
}
AJAX:
$(document).ready(function(){
$('#btn-addkegs').click(function() {
var arr = kegs;
var myArray = JSON.stringify(arr);
$.ajax({
url: "addkegs.php",
method: "POST",
dataType: "json",
data: {myArray: myArray},
success: function (result) {
alert("Your kegs have been added! These include: " + result);
textarea.value = "";
kegs = [];
}
});
});
});
As for the line var arr = kegs;, the value of the array 'kegs' is set through an input field and other AJAX, but all that works fine. I think that my problem is with my PHP code.
If you are send via post only values... like in comments : 1,2,3
your $_POST['myArray'] was receive literaly what you sent to.
So, data variable will receive the array that seems like this ['1','2','3']
Well... Since you are not creating a variable $data as an Array, and yes, only putting an array inside it.
The PHP doesnt consider the $data[] variable as same as $data.
So, the PHP was magicaly overwriting the values from each same values.
So, I think if you want to repeat the values in the same array, you must reference the array with the array_push
$data = $_POST['myArray'];
foreach ($data as $item) {
array_push($data, $item);
}
Now when you return this array, you will have a response like {1,2,3,1,2,3}
Answer from a comment by #David:
In your browser's debugging tools, take a look at the network requests. Examine the AJAX request and its response. If the result is entirely wrapped in quotes, then it's just a string and not an array. You may need to JSON-decode $_POST['myArray'] server-side to interpret it as an array.
I needed to change $data = $_POST['myArr']; to $data = json_decode($_POST['myArr']);.

Why is this giving an "undefined" status

I am trying to echo some JSON with PHP. My array which I am echoing is part static and part of it has multiple records in the array.
Code
$return_output = array();
$return_output['error'] = false;
while (($serverLog_line=fgets($fopen_serverLog))!==false) {
$return_output[] = array(
"line" => $serverLog_line,
);
}
echo json_encode($return_output);
And the Jquery echoing it
$.getJSON("https://oasis-hosting.net/panel/handlers/server_functions/get.serverLog.php?service_id=22",
function(result){
var json = result;
$.each(json, function(i, data) {
$("#gameTerminal_content").append("" + data.line + "");
})
});
Now, it does echo the results, however it will echo one result which says "undefined". Screenshot: https://gyazo.com/47d2fbef749b94585c78a79b207fa65f
Thank you
It's because you have your actual data list mixed in with the error element.
Change the structure such that the data is in its own array:
$return_output['error'] = false;
$return_output['data'] = array();
In the while:
$return_output['data'] = array(
"line" => $serverLog_line,
);
In the JavaScript, iterate only over the data list not the error element:
var json = result.data;
it is written on the command console, it writes:
"Can not read the property 'line' of null"
this means, $return_output returns null. I am not so good at php, but i think you return $return_output but you modify $return_output[].
these are looking like two different variables. this should be the reason.

Can't get it working: jQuery AJAX array to PHP

I've been experiencing a lot of trouble with my issue all afternoon. Endless searches on Google and SO haven't helped me unfortunately.
The issue
I need to send an array to a PHP script using jQuery AJAX every 30 seconds. After constructing the array and sending it to the PHP file I seemingly get stuck. I can't seem to properly decode the array, it gives me null when I look at my console.
The scripts
This is what I have so far. I am running jQuery 1.11.1 and PHP version 5.3.28 by the way.
The jQuery/Ajax part
$(document).ready(function(){
$.ajaxSetup({cache: false});
var interval = 30000;
// var ids = ['1','2','3'];
var ids = []; // This creates an array like this: ['1','2','3']
$(".player").each(function() {
ids.push(this.id);
});
setInterval(function() {
$.ajax({
type: "POST",
url: "includes/fetchstatus.php",
data: {"players" : ids},
dataType: "json",
success: function(data) {
console.log(data);
}
});
}, interval);
});
The PHP part (fetchstatus.php)
if (isset($_POST["players"])) {
$data = json_decode($_POST["players"], true);
header('Content-Type: application/json');
echo json_encode($data);
}
What I'd like
After decoding the JSON array I'd like to foreach loop it in order to get specific information from the rows in the database belonging to a certain id. In my case the rows 1, 2 and 3.
But I don't know if the decoded array is actually ready for looping. My experience with the console is minimal and I have no idea how to check if it's okay.
All the information belonging to the rows with those id's are then bundled into a new array, json encoded and then sent back in a success callback. Elements in the DOM are then altered using the information sent in this array.
Could someone tell me what exactly I am doing wrong/missing?
Perhaps the answer is easier than I think but I can't seem to find out myself.
Best regards,
Peter
The jQuery.ajax option dataType is just for the servers answer. What type of anser are you expexting from 'fetchstatus.php'. And it's right, it's json. But what you send to this file via post method is not json.
You don't have to json_decode the $_POST data. Try outputting the POST data with var_dump($_POST).
And what happens if 'players' is not given as parameter? Then no JSON is returning. Change your 'fetchstatus.php' like this:
$returningData = array(); // or 'false'
$data = #$_POST['players']; // # supresses PHP notices if key 'players' is not defined
if (!empty($data) && is_array($data))
{
var_dump($data); // dump the whole 'players' array
foreach($data as $key => $value)
{
var_dump($value); // dump only one player id per iteration
// do something with your database
}
$returningData = $data;
}
header('Content-Type: application/json');
echo json_encode($returningData);
Using JSON:
You can simply use your returning JSON data in jQuery, e.g. like this:
// replace ["1", "2", "3"] with the 'data' variable
jQuery.each(["1", "2", "3"], function( index, value ) {
console.log( index + ": " + value );
});
And if you fill your $data variable on PHP side, use your player id as array key and an array with additional data as value e.g. this following structure:
$data = array(
1 => array(
// data from DB for player with ID 1
),
2 => array(
// data from DB for player with ID 2
),
...
);
// [...]
echo json_decode($data);
What I suspect is that the data posted is not in the proper JSON format. You need to use JSON.stringify() to encode an array in javascript. Here is an example of building JSON.
In JS you can use console.log('something'); to see the output in browser console window. To see posted data in php you can do echo '<pre>'; print_r($someArrayOrObjectOrAnything); die();.
print_r prints human-readable information about a variable
So in your case use echo '<pre>'; print_r($_POST); to see if something is actually posted or not.

json dataType is not working in jquery ajax method

i'm just trying to query the database and display the result the jquery's ajax method but if i put the dataType property as json it is only logging the result which has only one object the following is my code:
//this is a method is an object which will be triggered after a selection was made
lister: function () {
//this is to target the object as it is inside an event
var self = users;
//the ajax call
$.ajax({
url: 'index.php',
type: 'POST',
data: self.config.form.serialize(),
//this is the dataType
dataType: 'json',
success: function (results) {
//this for logging the result
console.log(results);
}
});
}
the php code
if(isset($_POST['q']) && !empty($_POST['q'])){
$na = $_POST['q'];
$query = mysql_query("SELECT id,first_name, last_name
FROM users WHERE users.first_name LIKE '$na%'");
$num=mysql_num_rows($query);
if($num >= 1){
while($row = mysql_fetch_array($query)){
//encoding the result as json
echo json_encode($row);
}
} else{
echo "no results found ";
}
//here we return so it won't display all of the pages
return;
}
You are generating invalid JSON. You are encoding every row of your table independently, which generates something like this:
{"foo": "bar"}{"foo": "bar"}{"foo": "bar"}
This is isn't valid. It's just a concatenation of objects. What you need is an array of objects:
[{"foo": "bar"}, {"foo": "bar"}, {"foo": "bar"}]
You can achieve that by creating an array first, add each row to it and encode the array:
$data = array();
while(...) {
$data[] = $row;
}
echo json_encode($data);
Another problem is that in case no results are found, you are simple returning plain text, not JSON. This will probably result in an error on the client side. If you tell jQuery to expect JSON, then every possible response must be JSON. So you might want something like:
echo json_encode(array('error' => 'no results found'));
or even better, return an empty array:
echo json_encode(array());
It should be fairly obvious to the client that no results have been found if an empty array is returned.

php json_encode doesn't result in real object / make array string into real object / turn php array into json

Here is my PHP code, it's getting a listing of collections from mongodb
$list = $db->dbname->listCollections();
$result = array();
$i=0;
foreach ($list as $thiscollection) {
$result[$i++] = $thiscollection->getName();
}
echo json_encode( $result );
I do console.log in the callback and this is what I see.
["fruits", "dogs", "cars", "countries"]
The problem is that this is a string, not an array. I need to iterate through these values. How an I make this into a real object or get php to give me json rather than php array so I can use parseJSON on it.
Thanks.
js:
$.post('/ajax-database.php', function (data) {
console.log($.parseJSON(data));
$.each(data, function (key, value) {
console.log(value);
});
});
I see you are using jquery, if you want data to come back to you as a json object you need to do 1 of 2 things.
add header("Content-Type: application/json") to your php file, this will tell jquery to convert it to a json object instead of as text
Add a forth parameter to your $.post,
$.post('/ajax-database.php', function (data) {
console.log($.parseJSON(data));
$.each(data, function (key, value) {
console.log(value);
});
}, "json");
that will tell jquery to call your error handler if its NOT json, like if your php code fails and outputs html instead. You really should use $.ajax, i have no idea why anyone uses $.post, you can't do ANY meaningful error handling.
JSON is strings. If you want to be able to iterate over it then you need to decode it.

Categories