This question already has answers here:
Creating default object from empty value in PHP?
(18 answers)
Closed 7 years ago.
I have a PHP file on my website that is producing errors after upgrading from PHP 5.3 to PHP 5.4. This is the error it produces:
Warning: Creating default object from empty value in (removing this
part of the error)/arcade.php on line 60
This is what the code looks like after like 60:
{
$this->arcade->version = '';
}else
{
$this->arcade->version = '3.4.0';
}
I'm assuming it has to do with the blank value there. I researched some similar fixes, but I'm still having trouble figuring out exactly what I should add to the php file to fix it.
Thank you very much for any help ahead of time!
Edit: Here's the rest of the code I'm not sure where it intializes. I'm pretty ignorant of these things.
if ( ! defined( 'IN_IPB' ) )
{
print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files. <br /> <b>File Version 3.3.0</b>";
exit();
}
class component_public
{
var $ipsclass = '';
var $arcade = '';
function run_component()
{
$this->ipsclass->load_language( 'lang_Arcade' );
if( !$this->ipsclass->cache['arcade_settings']['allow_user_skin'] )
{
if( $this->ipsclass->cache['arcade_settings']['skin'] == 0 ) {
$this->ipsclass->load_template('skin_Arcade1');
}
if( $this->ipsclass->cache['arcade_settings']['skin'] == 1 ) {
$this->ipsclass->load_template('skin_Arcade2');
}
if( $this->ipsclass->cache['arcade_settings']['skin'] == 2 ) {
$this->ipsclass->load_template('skin_Arcade3');
}
}else
if( $this->ipsclass->cache['arcade_settings']['allow_user_skin'] && !$this->ipsclass->member['id'] )
{
if( $this->ipsclass->cache['arcade_settings']['skin'] == 0 ) {
$this->ipsclass->load_template('skin_Arcade1');
}
if( $this->ipsclass->cache['arcade_settings']['skin'] == 1 ) {
$this->ipsclass->load_template('skin_Arcade2');
}
if( $this->ipsclass->cache['arcade_settings']['skin'] == 2 ) {
$this->ipsclass->load_template('skin_Arcade3');
}
}else
if( $this->ipsclass->cache['arcade_settings']['allow_user_skin'] && $this->ipsclass->member['id'] )
{
$this->ipsclass->DB->query("SELECT arcade_skin FROM ".$this->ipsclass->vars['sql_tbl_prefix']."members WHERE id=".intval($this->ipsclass->member['id']));
$this->arcade->lib->user = $this->ipsclass->DB->fetch_row();
if( $this->arcade->lib->user['arcade_skin'] == 0) {
$this->ipsclass->load_template('skin_Arcade1');
}
if( $this->arcade->lib->user['arcade_skin'] == 1) {
$this->ipsclass->load_template('skin_Arcade2');
}
if( $this->arcade->lib->user['arcade_skin'] == 2) {
$this->ipsclass->load_template('skin_Arcade3');
}
}
if( !$this->ipsclass->cache['arcade_settings']['build'] )
{
$this->arcade->version = '';
}else
{
$this->arcade->version = '3.4.0';
}
$this->ipsclass->vars['arcade_dir'] = 'arcade';
$component_copyright = '<div class="copyright" align="center">ibProArcade '.$this->arcade->version.' © '.date('Y').'</div>';
$this->ipsclass->skin['_wrapper'] = str_replace("<% COPYRIGHT %>", $component_copyright . "<% COPYRIGHT %>", $this->ipsclass->skin['_wrapper']);
require ROOT_PATH.$this->ipsclass->vars['arcade_dir'].'/db/arcade_mysql.php';
$this->arcade->db = new arcade_db;
$this->arcade->db->ipsclass =& $this->ipsclass;
require ROOT_PATH.$this->ipsclass->vars['arcade_dir'].'/modules/arcadelib.php';
$this->arcade->lib = new arcadelib;
$this->arcade->lib->ipsclass =& $this->ipsclass;
$this->arcade->lib->arcade =& $this->arcade;
$this->arcade->lib->init();
require ROOT_PATH.$this->ipsclass->vars['arcade_dir'].'/modules/scoreboard.php';
$this->arcade->sb = new scoreboard;
$this->arcade->sb->ipsclass =& $this->ipsclass;
$this->arcade->sb->arcade =& $this->arcade;
require ROOT_PATH.$this->ipsclass->vars['arcade_dir'].'/modules/arcadeskin.php';
$this->arcade->skin = new arcadeskin;
$this->arcade->skin->ipsclass =& $this->ipsclass;
$this->arcade->skin->arcade =& $this->arcade;
require_once ROOT_PATH.'sources/api/api_topics_and_posts.php';
$this->arcade->api = new api_topics_and_posts();
$this->arcade->api->ipsclass =& $this->ipsclass;
if( $this->arcade->lib->settings['arcade_status'] )
{
$this->arcade->lib->arcade_error( array( LEVEL => 1, MSG => 'arcade_offlinemsg' ) );
}
$page = (isset($this->ipsclass->input['p'])) ? $this->ipsclass->txt_alphanumerical_clean( $this->ipsclass->input['p'] ) : 'default';
$code = (isset($this->ipsclass->input['code'])) ? $this->ipsclass->input['code'] : '';
// Backwords compatibility with older games
if( isset($this->ipsclass->input['do']) && ($this->ipsclass->input['do'] == 'newscore') )
{
$code = 'newscore';
}
if( isset($this->ipsclass->input['do']) && ($this->ipsclass->input['do'] == 'verifyscore') )
{
$code = 'verifyscore';
}
if( isset($this->ipsclass->input['do']) && ($this->ipsclass->input['do'] == 'savescore') )
{
$code = 'savescore';
}
$file = ROOT_PATH.$this->ipsclass->vars['arcade_dir'].'/modules/page_'.$page.'.php';
if( file_exists($file) )
{
require $file;
}
else
{
require ROOT_PATH.$this->ipsclass->vars['arcade_dir'].'/modules/page_default.php';
}
$runme = new arcade_page;
$runme->ipsclass =& $this->ipsclass;
$runme->arcade =& $this->arcade;
$runme->exec_page( $code );
}
}
You got that error if trying to access properties of unexistent objects, like this:
$arcade = null;
$arcade->version = '3.4.0';
In order to fix it, yours $this->arcade property should not be empty.
Upd.
First, remove the line with arcade definition/initialization entirely:
class component_public
{
var $ipsclass = '';
function run_component()
{
$this->ipsclass->load_language( 'lang_Arcade' );
Next, add this piece of code:
class SilentAssasin {
public function __get($property) {
return $this->{$property} = new static();
}
}
class component_public extends SilentAssasin
{
instead of this:
class component_public
{
That must fix that creating from empty error.
Ah, forgot to mention... That SilentAssasin is just a name for custom class, you actually can name it anything you like, like PathosErrorSuppressor or OversizedBanHammerForThatStupidError etc.
Related
i tried assigning a value to a variable in an if condition
if ($hotel = Hotel::whereCode($this->hotelCode)->first() && $room = Room::whereRoomCode($value)->first()) {
if ($hotel->room_id == $room->id) {
return true;
}
}
I get this error
Attempt to read property "room_id" on bool
meanwhile $hotel variable is not a boolean
Your code can be processed by the compiler as
if ( $hotel = (
Hotel::whereCode($this->hotelCode)->first() && $room = Room::whereRoomCode($value)->first()
)
) {
//...
}
in that case you can see $hotel is a bool result from the && operator.
You should add parenthesis to counter the issue
if (
($hotel = Hotel::whereCode($this->hotelCode)->first()) &&
($room = Room::whereRoomCode($value)->first())
) {
if ($hotel->room_id == $room->id) {
return true;
}
}
or in a more clear way
$hotel = Hotel::whereCode($this->hotelCode)->first();
$room = Room::whereRoomCode($value)->first();
return $hotel && $room && ($hotel->room_id == $room->id);
Or using relation and using way less performance (using only a count query)
public function hasRoomByRoomCode($value)
{
return $this->room()->whereRoomCode($value)->count();
}
//this is the relation function if you did not set it yet inside Hotel::class
public function room()
{
return $this->belongsTo(Room::class);
}
I just looking for solution to load content using file_get_contents
My script works fine, but sometimes file are not load, i know how to check if file_get_contents fails but how to try get it again without page reload?
$url = file_get_contents('url.to.file');
if ( $url === false )
{
// code to do it again, how?
}
Ok, i found my own solution with for loop.
it will try 5 times to load file if will load for loop will be break
$url = file_get_contents('File');
if ( $url === false ) {
for ($x = 0; $x <= 5; $x++) {
$url = file_get_contents('File');
if ( $url === true ) {
break;
}
}
}
Then you could try runnning the get in a loop
$max_loop = 5;
while (FALSE == $url = file_get_contents('url.to.file') ) {
$cur_loop++
if ( $cur_loop >= $max_loop )
// indicate an error so can be put on page
break;
}
}
Written in a function it might look like this
function get_url($the_url, $max_try)
$cur_loop = 0;
while (FALSE == $url = file_get_contents($the_url) ) {
$cur_loop++
if ( $cur_loop >= $max_try )
break;
}
}
return $url;
}
//called like this
$data = get_url('the.url',5);
if ( $data === false ) {
// error message
exit;
}
In php/wordpress I have made a function. I want to pass some parameteres inside the function so that it will show result according to that. So far now my function code is like this
$user_id = get_current_user_id();
function check_user_access($role, $action = NULL ) {
if( $role == 'subscriber') {
if( $action = 'check_customer' ) {
$check_customer = $wpdb->get_var("SELECT COUNT(id) FROM `table1` WHERE `user_id` = $user_id");
return $check_customer;
}
if( $action = 'check_users' ) {
$check_users = $wpdb->get_var("SELECT COUNT(id) FROM `table2` WHERE `user_id` = $user_id");
return $check_users;
}
}
}
Now I am using this function like this
$role = 'subscriber';
$check_customers = check_user_access($role, $action = 'check_users' );
if( $check_users <=1 ) {
//do something;
}
if( $check_users > 1 ) {
//do something other;
}
But its showing the result of $action = 'check_customer'. Means its working for the first block condition. Can someone tell me how to solve this? Am I doing something wrong?
change your
if( $action = 'check_customer' ) {}
to
if( $action == 'check_customer' ) {}
= means Assignment Operator
== means Comparison Operator
refer - from here
I'm trying to find a smarter way to validate my inputs with PHP. If the array finds an empty field, it has to add a new element to the array and display an error message.
So far, I haven't succeeded.
The code behind
$felter = array();
if(isset($_POST['submit'])) {
$produktnavn = $_POST['produktnavn'];
$kategori = $_POST['kategori'];
if( !empty( $felter ) ) {
foreach ($felter as $felt) {
if ($felter == '') {
$fejl = true;
}
}
}
else {
$sql = "UPDATE produkt SET produkt_navn = '$produktnavn', fk_kategori_id = '$kategori' WHERE produkt_id=$id";
mysqli_query($db, $sql);
echo "Produktet blev opdateret";
}
Input form
<input type="text" class="form-control" name="produktnavn" value="<?php echo $produktnavn; ?>">
The code starts with $felter = array(); which initializes an empty array.
Then, without changing the array itself, you're checking for non-emptiness of $felter
if( !empty( $felter ) ) {
foreach ($felter as $felt) {
if ($felter == '') {
$fejl = true;
}
}
}
You're trying to iterate over an array that has not gotten any elements pushed into it. And the logic statement if( !empty ($felter)) will also not work as expected either.
As a test, before the check for !empty, put something in the array with $felter[] = 'Test word'; and then, underneath it... (if you're looking for a non-empty array, the logical checker could be if(count($felter)) { before iterating over the array with foreach ($felter as $felt) { if ($felt == '')
$felter = array();
$felter[] = 'Test word';
if(isset($_POST['submit'])) {
$produktnavn = $_POST['produktnavn'];
$kategori = $_POST['kategori'];
if( count( $felter ) ) {
foreach ($felter as $felt) {
if ($felt == '') {
$fejl = true;
}
}
}
I'm trying to convert some old code by converting to mysqli. Unfortunately I can't figure out what part of the code is trying to do, so I don't know how to change it. It seems to be a standard safety check that everyone who uses the original mysql extension used, but I can't find anyone who explains why. Here is the original code:
function query($query = "", $transaction = FALSE)
{
//
// Remove any pre-existing queries
//
unset($this->query_result);
if( $query != "" )
{
$this->num_queries++;
if( $transaction == BEGIN_TRANSACTION && !$this->in_transaction )
{
$result = mysql_query("BEGIN", $this->db_connect_id);
if(!$result)
{
return false;
}
$this->in_transaction = TRUE;
}
$this->query_result = mysql_query($query, $this->db_connect_id);
}
else
{
if( $transaction == END_TRANSACTION && $this->in_transaction )
{
$result = mysql_query("COMMIT", $this->db_connect_id);
}
}
if( $this->query_result )
{
unset($this->row[$this->query_result]);
unset($this->rowset[$this->query_result]);
if( $transaction == END_TRANSACTION && $this->in_transaction )
{
$this->in_transaction = FALSE;
if ( !mysql_query("COMMIT", $this->db_connect_id) )
{
mysql_query("ROLLBACK", $this->db_connect_id);
return false;
}
}
return $this->query_result;
}
else
{
if( $this->in_transaction )
{
mysql_query("ROLLBACK", $this->db_connect_id);
$this->in_transaction = FALSE;
}
return false;
}
}
I can't figure out what they're doing with
if( $transaction == BEGIN_TRANSACTION && !$this->in_transaction )
Can anybody explain this to me?
The tokens BEGIN_TRANSACTION and END_TRANSACTION are arbitrary constants defined eslewhere to make the code more readable. Basically, this entire function is an implementation of MySQL Transactions in mysql, which doesn't directly support them. Much of the code is there just to work out whether or not a transaction has been started, and whether to commit it, or roll it back.
You can supprt the same functionality by using mysqli::begin_transaction(), mysqli::commit(), and mysqli::rollback()
The PHP reference ishere