Unexpected token in JSON at position 43 - php

Im trying to Fetch Data From a PHP Server Running MySQL. In my angular controller I do $http.get("dbconnection.php")
In my dbconnection.php I have this code which just Selects everything from the database and sends it back.
$conn = new mysqli......
$result = $conn->query("SELECT * FROM ...");
$outp = "";
while ($rs = $result->fetch_array(MYSQLI_ASSOC)) {
if ($outp != "") {
$outp .= ",";
}
$outp .= '{"id":"' . $rs["id"] . '",';
$outp .= '"name":"' . $rs["name"] . '",';
$outp .= '"price":"' . $rs["price"] . '"}';
$outp .= '"created":"' . $rs["created"] . '"}';
$outp .= '"img":"' . $rs["img"] . '"}';
}
$outp = '{"records":[' . $outp . ']}';
$conn->close();
echo $outp;
When I visit my site to see take a look at the Data under
Network Tab > XHR > dbconnection.php > Preview
I see the data but its weird formatted.
See picture of weird formatted json
I think thats the reason for why I get the
Unexpected token in JSON at position 43 ERROR
when I am trying to fetch the data.

To got well formatted JSON outputs, use json_encode function.
In your case :
$conn = new mysqli......
$result = $conn->query("SELECT * FROM ...");
$json = ["records" => []];
while ($rs = $result->fetch_array(MYSQLI_ASSOC)) {
$json["records"][] = $rs;
}
$conn->close();
echo json_encode($json);

Related

Fetching all columns of Inner Join

I need to fetch all the columns in the two tables. But i cant seem to fetch the data is there anything wrong with my php or is it my javascript.
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
header("Content-Type: application/json; charset=UTF-8");
include("global.php");
$conn = new mysqli(server, dbuser, dbpw, db);
$userid = $_GET['userid'];
$result = $conn->query("SELECT * FROM profiles INNER JOIN StudentProfile ON profiles.userid = StudentProfile.userid");
$outp = "[";
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
if ($outp != "[") {$outp .= ",";}
$outp .= '{"userid":"' . $rs["userid"] . '",';
$outp .= '"parentname":"' . $rs["parentname"] . '",';
$outp .= '"profilepic":"' . $rs["profilepic"] . '",';
$outp .= '"contact":"' . $rs["contact"] . '",';
$outp .= '"address":"' . $rs["address"] . '",';
$outp .= '"studentid":"' . $rs["studentid"] . '",';
$outp .= '"studentname":"' . $rs["studentname"] . '",';
$outp .= '"sclass":"' . $rs["sclass"] . '"}';
$outp .= '"sprofilepic":"' . $rs["sprofilepic"] . '",';
}
$outp .="]";
$conn->close();
echo($outp);
?>
studentprofile
profiles
1. you can do it with fetch_all. for this you must have mysqlnd driver
$result = $conn->query("SELECT * FROM profiles INNER JOIN StudentProfile ON profiles.userid = StudentProfile.userid");
$output = $result->fetch_all(MYSQLI_ASSOC);
$jsonOutput = json_encode($output);
2. with loop
$result = $conn->query("SELECT * FROM profiles INNER JOIN StudentProfile ON profiles.userid = StudentProfile.userid");
$output = [];
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
$output[] = $rs;
}
$jsonOutput = json_encode($output);
Problem is with your JavaScript in your code ...
check out last 2 lines of code inside while loop
just replace
$outp .= '"sclass":"' . $rs["sclass"] . '"}';
$outp .= '"sprofilepic":"' . $rs["sprofilepic"] . '",';
With
$outp .= '"sclass":"' . $rs["sclass"] . '",';
$outp .= '"sprofilepic":"' . $rs["sprofilepic"] . '"},';

Converting SQL to JSON and keeping the null values?

The issue:
I'm converting some SQL tables into JSON format and I have some null values which aren't being presented in the format I would like. When there's a null value in my table, it turns into " " when converted to JSON, but I want it to just say null instead of double quotation marks.
The code:
$conn = new mysqli($servername, $username, $password, $dbname);
$result = $conn->query("SELECT firstname, middlename, lastname FROM nametable");
$outp = "[";
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
if ($outp != "[") {$outp .= ",";}
$outp .= '{"firstname":"' . $rs["firstname"] . '",';
$outp .= '"middlename":"' . $rs["middlename"] . '",';
$outp .= '"lastname":"' . $rs["lastname"] . '"}';
}
$outp .="]";
$conn->close();
echo($outp);
The JSON format that I am getting:
[
{"firstname":"John", "middlename": "Timothy", "lastname":"Doe"} ,
{"firstname":"Mary", "middlename":"", "lastname":"Jane"}
]
The JSON format that I want: (the different part is the null after middlename)
[
{"firstname":"John", "middlename":"Timothy", "lastname":"Doe"} ,
{"firstname":"Mary", "middlename": null, "lastname":"Jane"}
]
Edit: I don't want this: (because null will be treated as a string)
[
{"firstname":"John", "middlename":"Timothy", "lastname":"Doe"} ,
{"firstname":"Mary", "middlename":"null", "lastname":"Jane"}
]
What I have tried:
I tried editing my query to
SELECT firstname, middlename, lastname
FROM nametable
WHERE (nametable->>'middlename') is null
but it gets buggy and won't run.
I've also tried
SELECT firstname, middlename, lastname
FROM nametable
FOR JSON AUTO, INCLUDE_NULL_VALUES
but it also won't run.
Final edit: I played around with everyone's suggestions and I made it work with an if/else statement in the middle:
$conn = new mysqli($servername, $username, $password, $dbname);
$result = $conn->query("SELECT firstname, middlename, lastname FROM nametable");
$outp = "[";
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
if ($outp != "[") {$outp .= ",";}
$outp .= '{"firstname":"' . $rs["firstname"] . '",';
if (is_null($rs['middlename']) == true)
$outp .= '"middlename":null,';
else
$outp .= '"middlename":"' . $rs["middlename"] . '",';
$outp .= '"lastname":"' . $rs["lastname"] . '"}';
}
$outp .="]";
$conn->close();
echo($outp);
Convert your null field to string if you want to want JSON to print NULL instead of blank
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
if ($outp != "[") {$outp .= ",";}
$outp .= '{"firstname":"'. $rs["firstname"] == null ?"null":$rs["firstname"]. '",';
$outp .= '"middlename":"'. $rs["middlename"] == null ?"null":$rs["middlename"]. '",';
$outp .= '"lastname":"'. $rs["lastname"] == null ?"null":$rs["lastname"]. '"}';
}
Since having null inside the database causes problem, why not store "null" string instead, and when creating the JSON format, use conditional operator to select the real null .This is a sample, how your code suppose look like:
$outp = "[";
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
if ($outp != "[") {$outp .= ",";}
$outp .= '{"firstname":"' . $rs["firstname"] == "null" ? null : $rs["firstname"].'",';
$outp .= '"middlename":"' . $rs["middlename"] == "null" ? null : $rs["middlename"].'",';
$outp .= '"lastname":"' . $rs["lastname"] == "null" ? null : $rs["lastname"].'"}';
}
$outp .="]";
Here is an example with some dummy data
$db_results = array(
array('fname'=>'john', 'lname'=>'doe', 'property'=>''),
array('fname'=>'john', 'lname'=>'doe', 'property'=>''),
array('fname'=>'john', 'lname'=>'doe', 'property'=>NULL)
);
$output='';
$rowStr = '';
foreach($db_results as $i=>$row) {
$rowStr="{";
$rowStr.= '"fname":'.((is_null($row['fname']) || empty($row['fname'])) ? 'null' : '"'.$row['fname'].'"');
$rowStr.= ',"lname":'.((is_null($row['lname']) || empty($row['lname'])) ? 'null' : '"'.$row['lname'].'"');
$rowStr.= ',"property":'.((is_null($row['property']) || empty($row['property'])) ? 'null' : '"'.$row['property'].'"');
$rowStr.='}'; //add a comma here when a condition is met
$output.= $rowStr;
}
echo '['.$output.']';

how can i make a json with category in mysql?

i need to make a page which show all the items and when clicked bring me all the places where it is available.
i need to make this in mysql
app.controller('namesCtrl', function($scope) {
$scope.items = [
{name: 'item1', place: ['place1', 'place2']},
{name: 'item2', place: ['place2', 'place3']},
{name: 'item3', place: ['place1', 'place2', 'place3']},
{name: 'item4', place: ['place1']},
{name: 'item5', place: ['place1', 'place2']}
];
});
my php is
<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
$conn = new mysqli("localhost", "user", "pass", "table");
$result = $conn->query("SELECT * FROM `especialidades`");
$outp = "";
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
if ($outp != "") {$outp .= ",";}
$outp .= '{"id":"' . $rs["id"] . '",';
$outp .= '"nombre_especialidad":"' . $rs["nombre_especialidad"] . '",';
$outp .= '"aguadilla":"' . $rs["aguadilla"] . '",';
$outp .= '"arecibo":"' . $rs["arecibo"] . '",';
$outp .= '"bayamon":"' . $rs["bayamon"] . '",';
$outp .= '"caguas":"' . $rs["caguas"] . '",';
$outp .= '"carolina":"' . $rs["carolina"] . '",';
$outp .= '"guayama":"' . $rs["guayama"] . '",';
$outp .= '"hato_rey":"' . $rs["hato_rey"] . '"}';
}
$outp ='{"especialidades":['.$outp.']}';
$conn->close();
echo($outp);
?>
im getting a lot of error.
how is the correct whay to make this in mysql and get it in json.
Your code should be like this
<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
$conn = new mysqli("localhost", "user", "pass", "table");
$result = $conn->query("SELECT id, nombre_especialidad,aguadilla,arecibo, bayamon,caguas,carolina,guayama,hato_rey FROM `especialidades`");
$outp = "";
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
$outArray["especialidades"][] = $rs;
}
$conn->close();
$outp = json_encode($outArray);
echo $outp;
?>
Hope this will help you!!

JSON formatting errors for two files

I would like to know, I have just created my datatables, but two of them are giving JSON formatting errors. I am doing a join of two tables in these two. I tried running the query in phpmyadmin, and it works just fine Here is one example of my server-side files:
<?php
$username="drup197";
$password="*****";
$database="census";
$server="localhost";
$link = mysqli_connect($server,$username,$password,$database);
//#mysql_select_db($database,$link) or die( "Unable to select database");
$query = "
SELECT *
FROM national_age_gender_demographics INNER JOIN arizona_age_gender_demogrpahics
WHERE national_age_gender_demographics.age_group = arizona_age_gender_demogrpahics.age_group
ORDER BY national_age_gender_demographics.index_number";
$result = mysqli_query($link,$query);
if(!$result) die( "Query: " . $query . "\nError:" . mysql_error() );
//print_r($row);
$tableData = '{"aaData": [[';
$numRows = $result->num_rows;
$row = mysqli_fetch_array($result);
for ($i = 0; $i < $numRows; $i++) {
if ($i != 0) {
$tableData .= ",[";
}
$tableData .= '"' . $row['age_group'] . '",';
$tableData .= '"' . $row['national_age_gender_demographics.both_pop'] . '",';
$tableData .= '"' . $row['national_age_gender_demographics.male_pop'] . '",';
$tableData .= '"' . $row['national_age_gender_demographics.female_pop'] . '",';
$tableData .= '"' . $row['national_age_gender_demographics.male_percent'] . '",';
$tableData .= '"' . $row['national_age_gender_demographics.female_percent'] . '",';
$tableData .= '"' . $row['national_age_gender_demographics.both_percent'] . '",';
$tableData .= '"' . $row['national_age_gender_demographics.males_per_100_females'] . '",';
$tableData .= '"' . $row['arizona_age_gender_demographics.both_pop'] . '",';
$tableData .= '"' . $row['arizona_age_gender_demographics.male_pop'] . '",';
$tableData .= '"' . $row['arizona_age_gender_demographics.female_pop'] . '",';
$tableData .= '"' . $row['arizona_age_gender_demographics.male_percent'] . '",';
$tableData .= '"' . $row['arizona_age_gender_demographics.female_percent'] . '",';
$tableData .= '"' . $row['arizona_age_gender_demographics.both_percent'] . '",';
$tableData .= '"' . $row['arizona_age_gender_demographics.males_per_100_females'] . '"]';
if ($i != $numRows - 1) {
$row = mysqli_fetch_array($result);
}
}
$tableData .= ']}';
echo $tableData;
?>
Does anyone know what is wrong here?
Firstly Steven is right, its better to use the json encode (or at least neater) to create your json, save you from the messy ifs and bracket business.
I would also recommend using mysqli_fetch_assoc rather than using mysqli_fetch_array, which as you currently specified should return both associative and numbered results (see here http://php.net/manual/en/mysqli-result.fetch-array.php), which probably messes up your results.
eg:
...
$row = mysqli_fetch_assoc($result);
$json_data = json_encode($row);
echo $json_data;
?>
Try that and see how you get on?

receiving newline inside a json object

i am trying to bring a set of texts from a PostgreSQL database (field type is text) with ajax into my webpage. The problem i encouter is the newline, it works great when there is no newlines into the text in database, but when i use new lines in the text inside database, the json doesnt give me the data it stored.
function selectCalendarEvents(user_id, event_datestart, event_datestop, callback) {
var request;
if(window.XMLHttpRequest)
request = new XMLHttpRequest();
else
request = new ActiveXObject("Microsoft.XMLHTTP");
request.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200) {
if(request.responseText.substr(0, 6) == "error ")
alert(errorName[request.responseText.substr(6)]);
else {
jsonCalendarEvents = $.parseJSON(request.responseText);
selectEvents(user_id, event_datestart, event_datestop, callback);
}
}
}
request.open("GET", "php/calendar.php?action=selectCalendarEvents&user_id=" + user_id + "&event_datestart=" + event_datestart + "&event_datestop=" + event_datestop, true);
request.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
request.send();
}
this is my javascript function which requests the data set
if($action == "selectCalendarEvents") {
$user_id = $_GET["user_id"];
$event_datestart = "'" . $_GET["event_datestart"] . "'";
$event_datestop = "'" . $_GET["event_datestop"] . "'";
require_once("connect.php");
$query = "SELECT event_id, event_name, event_datestart, event_datestop, event_timestart, event_timestop, calendar_events.calendar_group, calendar_color, event_info FROM calendar_events LEFT JOIN calendar_calendars ON calendar_events.calendar_group = calendar_calendars.calendar_group WHERE user_id = " . $user_id . " AND calendar_show = true AND event_datestart <= ". $event_datestop . " AND event_datestop >= " . $event_datestart;
$result = pg_query($connect, $query);
if(!$result)
die("error 1"); // query error
$comma = '';
$json = '{"events":[';
while ($row = pg_fetch_row($result)) {
$json .= $comma . '{';
$json .= '"event_id":"' . $row[0] . '",';
$json .= '"event_name":"' . $row[1] . '",';
$json .= '"event_datestart":"' . $row[2] . '",';
$json .= '"event_datestop":"' . $row[3] . '",';
$json .= '"event_timestart":"' . $row[4] . '",';
$json .= '"event_timestop":"' . $row[5] . '",';
$json .= '"calendar_group":"' . $row[6] . '",';
$json .= '"calendar_color":"' . $row[7] . '",';
$json .= '"event_info":"' . $row[8] . '"';
$json .= '}';
$comma = ',';
}
$json .= ']}';
echo $json;
}
this is my php which returns the dataset. If row[8] aka event_info stores text with newlines in it .. when i try to populate my calendar with the events, it seems the json doesnt store any data in it or smt like that.
I found out that i should replace \r\n with <br/> and it will work. im using like this replace(/\r\n/g, "<br/>") when i give the response string to json
jsonCalendarEvents = $.parseJSON(request.responseText.replace(/\r\n/g, "<br/>"));

Categories