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

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.

Related

PHP sessions acting weird, current object appears in _session

I have the following code:
<?php
session_start();
class Cinstaller {
function CInstaller() {
$this->templates["x"] = "";
}
function DoEvents() {
if ($_GET["x"]) {
$_SESSION["install"] = $_GET;
}
}
}
$install = new CInstaller();
$install->DoEvents();
print_r($_SESSION);
?>
On a certain server ( first time when i see something like this ) Php 5.2.17, running as CGI/FastCGI, it acts werid.
When i run test.php?x=y I get the following dump:
Array
(
[install] => Array
(
[x] => y
)
)
When I go back and I run test.php without any other parameters I get the following:
Array
(
[install] => Cinstaller Object
(
[templates] => Array
(
[x] =>
)
)
)
How the heck the string variable "install" from session turned into the object from current file ?
Note : OK..! Seems like you may be having some sort of other problem but as you said that changing names of variable and session solved your Problem so in order to consider this question solved..! Here I am going to post the same answer..!
Solution :
You should change your Variable and Session names to fix this problem there may be some sort of conflict at your server with use of same name for variable & Sessions..!
If you do:
$_SESSION["install"] = $_GET;
You will put on "install" session all content that you got by $_GET and the value of session will be an Array().
If you want jut the value of parameter "x" that was sent using GET method, try this:
$_SESSION["install"] = $_GET["x"];
And only the value of the "x" parameter will be in the session. Also, filter the value that you get by url:
$_SESSION["install"] = filter_var($_GET["x"], FILTER_SANITIZE_STRING);

accessing session array data, deleting or changing one of the variables within this array

Here is my session array:
Array ( [username] => dog#dog.net [tmpPayment] => Array ( [mID] => 48 [item_1_amt] => 35.00 [description] => Student ) )
I created the ['tmpPayment'] array with the following code:
$tmpPayArr = array();
$tmpPayArr = array('mID'=>$mID,'item_1_amt'=>'35','description'=>'student');
$_SESSION['tmpPayment'] = $tmpPayArr;
I have looked for a simple answer to three questions: (1)how do I add a variable to the [tmpPayment] array (2)how do I change the value of [amount] variable within the [tmpPayment] array (3)how do I remove/delete the [tmpPayment] array altogether. (4)how do I assign the value of ['tmpPayment']['mID'] to a new variable $memberID. For (3) I have unsuccessfully tried:
unset($_SESSION['tmpPayment']);
I think my main problem is not understanding how to REFERENCE the array and its variables properly.
UPDATE:
I have successfully added and change my SESSION variable with the following:
$_SESSION['tmpPayment']['item_1_amt'] = $x_amount;
$_SESSION['tmpPayment']['description'] = $x_invoice_num;
Is this best practice?
Still need help with (3)...removing the session variable ['tmpPayment'] from the above session array.
Here are the answers. If they aren't working, be sure you're calling session_start(); before you try to modify the $_SESSION array.
$_SESSION['tmpPayment']['new_key_name'] = 'new value';
$_SESSION['tmpPayment']['item_1_amt'] = 12324;
unset($_SESSION['tmpPayment']);
1: $_SESSION["tmpPayment"]["newVariable"] = "value";
2: $_SESSION["tmpPayment"]["amount"] = "$1.78";
3: To do this, you can set ["tmpPayment"] to an empty array like so:
$_SESSION["tmpPayment"] = array();
or set it to null
$_SESSION["tmpPayment"] = null;
I borrowed a bit from this answer: PHP $_SESSION variable will not unset
and as that answer, and the other poster on this question mention, make sure to call session_start(); before doing anything with the session variables.

Php array_rand() printing variable name

I have an array that is filled with different sayings and am trying to output a random one of the sayings. My program prints out the random saying, but sometimes it prints out the variable name that is assigned to the saying instead of the actual saying and I am not sure why.
$foo=Array('saying1', 'saying2', 'saying3');
$foo['saying1'] = "Hello.";
$foo['saying2'] = "World.";
$foo['saying3'] = "Goodbye.";
echo $foo[array_rand($foo)];
So for example it will print World as it should, but other times it will print saying2. Not sure what I am doing wrong.
Drop the values at the start. Change the first line to just:
$foo = array();
What you did was put values 'saying1' and such in the array. You don't want those values in there. You can also drop the index values with:
$foo[] = 'Hello.';
$foo[] = 'World.';
That simplifies your work.
You declared your array in the wrong way on the first line.
If you want to use your array as an associative Array:
$foo=Array('saying1' => array (), 'saying2' => array(), 'saying3' => array());
Or you can go for the not associative style given by Kainaw.
Edit: Calling this on the not associative array:
echo("<pre>"); print_r($foo); echo("</pre>");
Has as output:
Array
(
[0] => saying1
[1] => saying2
[2] => saying3
[saying1] => Hello.
[saying2] => World.
[saying3] => Goodbye.
)
Building on what #Answers_Seeker has said, to get your code to work the way you expect it, you'd have to re-declare and initialise your array using one of the methods below:
$foo=array('saying1'=>'Hello.', 'saying2'=>'World.', 'saying3'=>'Goodbye.');
OR this:
$foo=array();
$foo['saying1'] = "Hello.";
$foo['saying2'] = "World.";
$foo['saying3'] = "Goodbye.";
Then, to print the contents randomly:
echo $foo[array_rand($foo)];

PHP Fatal error: Cannot use string offset as an array

Facing a weird situation with arrays..
I am using LinkedIn API to get profile info which returns data in two formats..
If user has just one educational item
educations=>education=>school-name
educations=>education=>date
...
If more than one education item
educations=>education=>0=>school-name
educations=>education=>0=>date
...
educations=>education=>1=>school-name
educations=>education=>1=>date
...
Now I am trying to make it consistent and convert
educations=>education=>school-name
to
educations=>education=>0=>school-name
But getting error in code that i believe should work
if(empty($educations['education'][0]['school-name']))
{
$temp = array();
$temp['education'][0]=$educations['education'];
$educations = $temp;
}
This fails for "just one educational item", generates error on the first line for (isset,is_array and empty)
PHP Fatal error: Cannot use string offset as an array in ...
print_r returns
[educations] => Array
(
[education] => Array
(
[id] => 109142639
[school-name] => St. Fidelis College
[end-date] => Array
(
[year] => 2009
)
)
)
Usually you'd write the assignment like this:
$temp = array(
"education" => array($educations['education'])
);
To avoid any issues with indexes. This might also fix yours.
If you're unsure about the contents of $educations['education'][0]['school-name'] you can simply check each part:
if(isset($educations['education'], $educations['education'][0], $educations['education'][0]['school-name']))
This works because isset doesn't behave like a normal function. It takes multiple arguments in a lazy manner.
You want:
if(array_key_exists('school-name',$educations['education']))
{
$educations['education'] = array($educations['education']);
}
Today I experienced the same problem in my application. Fatal error: Cannot use string offset as an array in /home/servers/bf4c/bf4c.php on line 2447
line 2447
if (!isset($time_played[$player]["started"])) {
$time_played[$player]["started"] = $time;
}
$time_played was overwritten elsewhere and defined as a string. So make sure you do use unique variable names.
Here's a tip if you're running through a loop, and it breaks:
if( $myArray != "" ){
// Do your code here
echo $myArray['some_id'];
}

PHP in_array not returning expected results

When I attempt to determine if a user is in an array of users, for some reason it is only returning true when the user is in the 0th position.
For the life of me I cannot figure out what I am doing wrong.
This does not echo "True"
echo $usersign; // RDW
print_r($these_analysts[0]); // Array ( [0] => JKB [1] => RDW )
if(in_array($usersign,$these_analysts[0])){
echo "True";
}
This echoes "True"
echo $usersign; // RDW
print_r($these_analysts[0]); // Array ( [0] => RDW [1] => CLM )
if(in_array($usersign,$these_analysts[1])){
echo "True";
}
EDIT:
vardump gives a much more comprehensive view of the array, whereas print_r did show the trailing spaces, it didn't catch my eye.
For some reason the first element of each array was giving string3, and all others were giving string4.
You have a lot of syntax errors.
When you use strings, it is always better prace to put strings in single or double quotes. It doesn't matter which one (as far as speed is concerned).
Also, you need commas between the elements.
I entered the following code and it works.
$usersign = 'RDW';
$these_analysts[0] = array( 'JKB', 'RDW' );
print_r( $these_analysts );
if(in_array($usersign,$these_analysts[0])) echo "True";
Try:
$usersign = 'RDW';
$these_analysts[1] = Array ( 0 => 'RDW', 1 => 'CLM' );
if(in_array($usersign,$these_analysts[1])){
echo "True";
}
That should work.
This is happening (at least in my testing) if you specify RDW as a constant without defining these constants before using them. If you put your initials in double-quotes (i.e. use explicit strings) then everything works fine. If you want to use them as constants, then define these constants first:
define("RDW","RDW");
define("JKB","JKB");
And then your code works as expected again.
You're missing ; on half of your lines, you're using base strings instead of " around them, and your Array syntax is invalid (should be Array("JKB","RDW");). Maybe if these are fixed it might have a chance of working.
You have punctuation errors:
$these_analysts[0] = Array ( [0] => JKB [1] => RDW )
should be
$these_analysts = Array ( 0 => "JKB", 1 => "RDW" );
*This is the actual way you need to do *
$usersign = 'RDW';
$these_analysts = array ( 0 => 'RDW', 1 => 'CLM' );
if(in_array($usersign,$these_analysts)){
echo "True";
}

Categories