Can't access fetched data from PDO query [closed] - php

Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 7 years ago.
Improve this question
I am trying to create a dropdown-list with options (genres) from my database. For example if I have comedy, thriller and action in my database, these genres will be available as options on my dropdown-list. Basically what happens is that I get a blank list with no options and I was wondering if there is any problem with my code. Thanks in advance.
<?php
$sql = 'SELECT DISTINCT Genre.name FROM (Genre JOIN Movie2Genre ON Genre.id = Movie2Genre.idGenre)';
$stmt = $db3->prepare($sql);
$stmt->execute();
$allGenre = $stmt->fetchAll();
echo "<select>";
foreach ($allGenre as $val){
echo "<option value='{$val["name"]}'>{$val["name"]}</option>";
}
echo "</select>";
?>

As it turned out in the comments you set your default fetch mode with setAttribute(). So you fetch your data as an object and not as an array as it would be normal, with this:
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
Also a quote from the manual where it says which mode is default:
PDO::FETCH_BOTH (default): returns an array indexed by both column name and 0-indexed column number as returned in your result set
So instead of this structure:
Array
(
[0] => Array
(
[id] => 1
[0] => 1
[number] => 3234
[1] => 3234
[text] => sdfdsf
[2] => sdfdsf
[texttext] => sdfsdf
[3] => sdfsdf
)
//...
You have a structure like this:
Array
(
[0] => stdClass Object
(
[id] => 1
[number] => 3234
[text] => sdfdsf
[texttext] => sdfsdf
)
//...
So you need to use -> to access the object property like this:
$val->name
Side Notes:
Also if you would have added error reporting (only while staging, never in production!):
<?php
ini_set("display_errors", 1);
error_reporting(E_ALL);
?>
You would have received an error like this:
Fatal error: Cannot use object of type stdClass as array
And I would recommend you to enable error mode for your PDO connection (just put it right after the connection statement):
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Then you can also put your db stuff in a try & catch block to catch PDOExceptions:
try {
//db stuff
} catch(PDOException) {
echo $e->getMessage();
}

Given your current code we can state that
you are not doing anything with $genre - you are outputting the <option> elements
there might not be any genres (i.e. $genre is not set)
If 1 is true, Consider putting the explode'd/joined value of $genre in an enclosing <select>docs tag.
In case of 2, the select will be empty. Because your question does not include the specific code for outputting the select, it's hard to say what is really the problem. Your question states "I can't select (drop)" so there might even be JavaScript changing the enabled-attribute of the (if any) outputted select.

Related

how to decode utf-8 string to actual text?

I am using codeigniter with php 5.6 and mysql db for this specific purpose. I want to store strings from different languages to database and retrieve them later.
Problem I am facing here is when I am trying to grab the value, instead of giving out exact text, it shows something in the following format.
%E0%A4%A8%E0%A4%AE%E0%A4%B8%E0%A5%8D%E0%A4%A4%E0%A5%87
Here's some test code
function charset($get = NULL){
$direct = "नमस्ते";
$this->load->database();
if($get != NULL){
$this->db->insert('test', array("name"=>"get", "value"=>$get));
$this->db->insert('test', array("name"=>"direct", "value"=>$direct));
}
$results = $this->db->get('test')->result_array();
echo "<pre>";
print_r($results);
}
and Here are the results
Array
(
[0] => Array
(
[id] => 16
[name] => get
[value] => %E0%A4%A8%E0%A4%AE%E0%A4%B8%E0%A5%8D%E0%A4%A4%E0%A5%87
)
[1] => Array
(
[id] => 17
[name] => direct
[value] => नमस्ते
)
)
how would you get (or convert) the exact word instead of ut8 encoded string?
I have checked your code like below and it is returning value proper:
$variable = '%E0%A4%A8%E0%A4%AE%E0%A4%B8%E0%A5%8D%E0%A4%A4%E0%A5%87';
echo urldecode($variable);
Hope I understood your code properly.
There are multiple things at play here
MySQL
In MySQL you need to configure the connection/client to use it:
SET NAMES 'utf8'
In PHP it might be something similar to this:
$this->db->query("SET NAMES 'utf8'");
HTML
When outputting to HTML, you'll also have to tell the client (browser) what data you're passing:
header('Content-Type: text/html; charset=utf-8');
And/or in your HTML body:
<html>
<head>
<meta charset="utf-8" />

What is wrong with how I create this variable for summoner from the Riot API? [duplicate]

This question already has an answer here:
How to extract and access data from JSON with PHP?
(1 answer)
Closed 5 years ago.
enter code hereThe error this code returns is
"Trying to get property of non-object" or "Message: Undefined property: stdClass::$name".
The variable $summoner is what does not work. Assume the variables sID, $lcaseregion and $APIkey (etc.) are all properly set.
<?php
$summonerURL = "https://$lcaseRegion.api.pvp.net/api/lol/$lcaseRegion/v1.4/summoner/" . $sID . "?api_key=9" . $APIkey;
$responseSummoner = #file_get_contents($summonerURL);
$summoner = #json_decode($responseSummoner);
echo print_r($summoner); //this works and prints things
echo $summoner->name; //this does not work
echo $summoner->profileIconId; //this also does not work.
//please find print_r results below...
?>
print_r results;
stdClass Object ( [41245441] => stdClass Object ( [id] => 41245441 [name] => Bubbalubagus [profileIconId] => 558 [revisionDate] => 1488775287000 [summonerLevel] => 30 ) )
Any other advice and tips you can give me on how the arrays work would also be appreciated.
Try this:
$summoners = #json_decode($responseSummoner);
foreach($summoners as $summoner){
echo $summoner->name;
echo $summoner->profileIconId;
}
As it was pointed out already, you need to loop through the found summoners (although it is only one)
//EDIT: saw an object that wasnt there, this works now

PHP print_r num_rows => 9 but blank page

Previously I use the PHP file from my own hosting, but the problem occurred when I moved to my client's (GoDaddy).
I have two inputs - Automotive and Education (I have more but for this question, I just use two as example)
In my own, both input will print the output without problem. But in GoDaddy, only Education can produce output, while Automotive produce blank page. So I add this code:
echo '<pre>';
print_r($res);
echo '</pre>';
For input Automotive, I got:
<pre>mysqli_result Object
(
[current_field] => 0
[field_count] => 1
[lengths] =>
[num_rows] => 9
[type] => 0
)
</pre>
For input Edication, I got:
<pre>mysqli_result Object
(
[current_field] => 0
[field_count] => 1
[lengths] =>
[num_rows] => 4
[type] => 0
)
</pre>
[{"subcategory":"Adult & Continuing Education"},{"subcategory":"Early Childhood Education"},{"subcategory":"Educational Resources"},{"subcategory":"Other Educational"}]
What I have done so far:
Check the query - No problem. The query return the desired result in phpmyadmin
Increase memory limit - Done but in PHP setting, still stated as Default even after refresh the Dedicated IIS Application Pool
I have other input with its output/num rows more than 9 but it return the result without problem
PHP code:
<?php
if($_SERVER['REQUEST_METHOD']=='GET') {
require_once('dbConnect.php');
$category = $_GET['category'];
$sql = "SELECT subcategory FROM wg_categories WHERE category = '$category'";
$res = mysqli_query($con,$sql);
$result = array();
while($row = mysqli_fetch_array($res)){
array_push($result,
array('subcategory'=>$row[0]
));
}
echo json_encode($result);
mysqli_close($con);
}
?>
Is there something I have missed?
error_reporting - E_ALL
display_errors - on
log_errors - on
After reviewing php.net, the problem maybe at $row[0]. because the first element returned maybe $row[1]; to match the row id's in MySQL. So that maybe where the break is happening because it's accessing an element that may not exist.
http://php.net/manual/en/function.array.php
It may also be an issue with how MySQL is returning the array. Look at the below link for help, MySQLi driver maybe returning the array, as an Array of arrays or as an associative array, which is where the issue is coming from.
http://php.net/manual/en/mysqli-result.fetch-assoc.php
You may need to do the rows as associative. So using the actual column names. Like id, firstname, lastname etc. IE, $row['id']; $row['table_name'];
You may also want to try adding a try catch block, and then var dumping to see what is actually being returned or what everything looks like at that particular time. Then removing it once you have figured out what is going wrong.
http://php.net/manual/en/language.exceptions.php

PHP - Undefined offset (0) even though it holds a value

I'm trying to work in a CodeIgniter environment and while trying to collect and gather some information into variables I'm getting some PHP NOTICE errors that don't seem right.
Here's the chunk of code where the error(s) occur:
if (empty($events['user'][$user_id])) {
unset($events['user'][$user_id]);
} else {
foreach ($events['user'][$user_id] as $event) {
$events['user'][$user_id]['events']['event_id'] = $event_id = $event['event_id'];
$events['user'][$user_id]['event']['date'] = $this->events_model->getEventDates($event_id);
$events['user'][$user_id]['event']['date'] = $events['user'][$user_id]['event']['date'][0]['date'];
$events['user'][$user_id]['event']['request_title'] = $event['request_title'];
$events['user'][$user_id]['event']['event_status_text'][] = $this->events_model->getEventStatusFromSectionStatuses($event_id);
$request_data = $this->requests_model->getRequestInfo($event['request_id']);
$events['user'][$user_id]['event']['ministry'] = $this->ministries_model->getMinistryTitle($request_data[0]['requesting_ministry']);
// more stuff will go here...
}
$content_data['event_status_text'] = $events['user'][$user_id]['event_status_text'];
$content_data['events'] = $events['user'][$user_id]['complete_events'];
$content_data['totals'] = $events['user'][$user_id]['totals'];
$content_data['updated_events'] = $events['user'][$user_id]['updated_events'];
}
The specific line of the first error is the third line inside the foreach loop that ends with ['date'][0]['date']. It's the [0] that PHP is telling me is undefined. However, if I echo that exact same variable like this:
echo $events['user'][$user_id]['event']['date'][0]['date'];
...it outputs a value as would be expected, which also tells me that the [0] is NOT undefined after all. I'm not actually changing the variable. The only difference is that I'm echoing it instead of assigning it to another variable.
If I use # to ignore it in here, it happens again a few lines later on the line ending with getMinistryTitle($request_data[0]['requesting_ministry']).
Can you see what I'm doing wrong? Let me know if you need to see more of the code.
Here's the getEventDates() code as requested (note this is not my code):
function getEventDates($event_id)
{
$sql = "SELECT date FROM `event_dates` WHERE event_id=? ORDER BY date";
$res = $this->db->query($sql, array($event_id));
return $res->result_array();
}
if I print out $this->events_model->getEventDates($event_id) I get the following:
Array
(
[0] => Array
(
[date] => 2014-05-01
)
[1] => Array
(
[date] => 2014-05-08
)
[2] => Array
(
[date] => 2014-05-15
)
[3] => Array
(
[date] => 2014-05-22
)
[4] => Array
(
[date] => 2014-05-29
)
[5] => Array
(
[date] => 2014-06-05
)
[6] => Array
(
[date] => 2014-06-12
)
)
Hmmm... is it possible that this error is happening because there isn't a direct value contained in [0], but rather another array level? Please note that I did not structure this output. Someone else coded this and it's just my job to come in and work with it.
Without seeing the rest of your code this is confusing:
$events['user'][$user_id]['event']['date'] = $this->events_model->getEventDates($event_id);
$events['user'][$user_id]['event']['date'] = $events['user'][$user_id]['event']['date'][0]['date'];
Why would you be setting $events['user'][$user_id]['event']['date'] in one line and then in the next overriding it again?
My best advice would be to set the first assignment in a variable independent of the array, and then calling that variable for the data:
$event_dates_temp = $this->events_model->getEventDates($event_id);
$events['user'][$user_id]['event']['date'] = $event_dates_temp[0];
And perhaps adding a conditional check to ensure you are setting things that exist:
$event_dates_temp = $this->events_model->getEventDates($event_id);
if (array_key_exists(0, $event_dates_temp)) {
$events['user'][$user_id]['event']['date'] = $event_dates_temp[0];
}
Also, it’s unclear at what point you are doing this:
echo $events['user'][$user_id]['event']['date'][0]['date'];
And what is the output when you do dump like this:
echo '<pre>';
print_r($events['user'][$user_id]['event']['date']);
echo '</pre>';
It happens when you are trying to access a value which is not set for that index, please read this link for more information.
There are two options available:
Ignore these notices by telling the PHP error_reporting to not show notices error_reporting(E_ALL ^ E_NOTICE); but it is a good practice to fix this error by adding a check if a value exists.
Fix the values by isset function to see if the value/index contains any data.
If You hide notice set error_reporting(E_ALL ^ E_NOTICE);
Solution is use isset() to solved this issue.

Retrieve value from a Json Array

I'm having difficulty in retrieving values from a Json array. I have a Json dataset that has been created using json_encode. This is how it appears after using json_decode and displaying using print_r:
Array ( [0] => stdClass Object ( [postID] => 1961 [postTitle] => Kiss My Fairy [previewThumb] => 2011/09/Kiss-My-Fairy-Ibiza-essentialibiza-2011_feature.jpg [blogContent] => Ibiza has always had a flair for the extravagant, inhibitions are checked in at the airport when the floods of tourists arrive and the locals have embraced a freedom of partying that has turned the quiet Mediterranean island into the Mecca... ) ) a_post_data_array = 1
The code that achieves this is as follows:
$post_data_URL = "http://myurl.com/news/scrape/facebook-like-chart-ID.php?post_name=kiss-my-fairy";
$post_data_response = file_get_contents($post_data_URL);
$a_post_data_array=json_decode($post_data_response);
I now simply need to retrieve some of the values from this array to use as variables. The array will only ever have 1 set of values. I'm using the following code but it isn't working.
echo "**** -- " . $a_post_data_array[post_title] . "<br>";
Can anyone please help? I'm sorry this is so basic. I've been searching online but can't find any examples of this.
There are multiple issues with your code:
First you should instruct json_decode to give you a pure array with $data = json_decode($response, TRUE);
Then the result array is a list, and you have to access the first element as $data[0]
The entry you want to access has the key postTitle, not post_title as your example code showed. (And unless that's a predefined constant won't work.)
And you need to put those array keys in quotes, like print $data[0]["postTitle"];
Turn up your error_reporting level for some development help.
echo "** -- " . $a_post_data_array[0]['post_title'];
try this PHP code:
//$post_data_response = file_get_contents("https://raw.github.com/gist/1245028/80e690bcbe6f1c5b46676547fbd396ebba97339b/Person_John.json");
//$PersonObject = json_decode($post_data_response);
// Get Person Object from JSON Source
$PersonObject = json_decode('{"ID":"39CA2939-38C0-4C4E-AE6C-CFA5172B8CEB","lastname":"Doe","firstname":"John","age":25,"hobbies":["reading","cinema",{"sports":["volley-ball","snowboard"]}],"address":{}}');
// Get data from Object
echo "Person ID => $PersonObject->ID<br>";
echo "Person Name => $PersonObject->firstname<br>";
echo "Person Lastname => $PersonObject->lastname<br>";
echo "Person Age => $PersonObject->age<br>";
echo "Person Hobbies => " . $PersonObject->hobbies[0] . "<br>";

Categories