create variable only once in php - php

I have been looking for a way to run one piece of code only once in php. I want to create and set a variable at the beginning of the webpage and whenever I call that file, the code will ignore that line.
I found this in which there are basically two suggestions: setting a session variable and creating a lock file which I don't want to since there might be many users at the same time and I need to have a lock file for each one of them.
I tried the first option but it doesn't work.
Here are my two files:
config.php
<?php
if (at the beginning){
$variable = something
echo 'hello';
}
else
do something
?>
second.php
<?php
require_once 'config.php'
//do some other stuff
?>
Whenever second.php is called, it prints 'hello' in the webpage, so if (at the beginning) returns true even though it is not at the beginning. Note that, I check whether at the beginning by if(!isset($_SESSION['done'])){ $_SESSION['done'] = 'done'; }
I wonder what is my mistake and how can I solve the problem. Any help is appreciated.

The program flow for config.php should be:
<?php
session_start();
if (!isset($_SESSION['done'])) {
$_SESSION['done'] = 1;
echo 'hello';
}
else {
// do something
}
?>

Related

PHP how does include work when using variables?

I'm fairly new to PHP and am having trouble with variables. When I put everything in one PHP file, it works but my question is should this work? I am under the impression that when you include a file then the variables are also included. Assuming that is true, when connecting to a DB, is it good practice to connect in a separate PHP file then include that into pages where you need to use the DB?
page1.php
<?php
$test = "true";
?>
page2.php
<?php
$test = "false";
?>
home.php
<?php
include 'page1.php';
include 'page2.php';
echo $test;
?>
Expected output false but I am getting true.
When you include a file, PHP compiler extends the code with code in included file.
Basically the code:
include 'page1.php';
include 'page2.php';
echo $test;
changes to:
$test = "true";
$test = "false";
echo $test;
And you overwriting the $test variable.
including files is one of the methods to split and order logic in your project.
In some matters it provides performance benefits, when you include files only when you need them, and saves you from code duplication.
As for databases, it doesn't matter when or how you connect to it, often database connection related logic is held by separate file, just because it's easier to edit and mantain, similar to config files.
Also consider this part of code:
$PRODUCTION = 0; // defines if we are at home computer or at work
if( $PRODUCTION == 0 )
include ("connect_home.php");
elseif( $PRODUCTION == 1 )
include ("connect_work.php");
else
die("Oops, something gone wrong."); //don't connect if we are in trouble!

Understanding PHP Script Return [duplicate]

in PHP, how would one return from an included script back to the script where it had been included from?
IE:
1 - main script
2 - application
3 - included
Basically, I want to get back from 3 to 2, return() doesn't work.
Code in 2 - application
$page = "User Manager";
if($permission["13"] !=='1'){
include("/home/radonsys/public_html/global/error/permerror.php");
return();
}
includeme.php:
$x = 5;
return $x;
main.php:
$myX = require 'includeme.php';
also gives the same result
This is one of those little-known features of PHP, but it can be kind of nice for setting up really simple config files.
return should work, as stated in the documentation.
If the current script file was include()ed or require()ed, then control is passed back to the calling file. Furthermore, if the current script file was include()ed, then the value given to return() will be returned as the value of the include() call.
I know that this has already been answered, but I think I have a nice solution...
main.php
function test()
{
$data = 'test';
ob_start();
include( dirname ( __FILE__ ) . '/included.php' );
return ob_get_clean();
}
included.php
<h1>Test Content</h1>
<p>This is the data: <?php echo $data; ?></p>
I just included $data to show that you can still pass data to the included file, as well as return the included file.
Hm, the PHP manual disagrees with you. return should bail you out of an included file. It won't work from within a function, of course.
See Example #5 in the documentation for include.
You can get the return value of the script when including it, like:
$foo = include 'script.php';

Copying a file content to a variable

I would like to copy a php file content to a variable and execute it, not print it!
I found out that there are 2 ways:
file_get_contents('http://YOUR_HOST/YOUR/FILE.php');
In that way the code is executed but not as I want to, I will explain:
a.php:
<?php
require 'file.php';
$output = file_get_contents('http://example.com/b.php');
echo $output;
?>
b.php:
<?php
$hello = get_welcome_text();
echo $hello;
?>
When I execute file a.php I get the Call to undefined function error, I have no idea why it doesn't recognize the require line it seems like it executes b.php separately.
The other method is:
file_get_contents('path/to/YOUR/FILE.php');
This method is just print the php script instead of executing it.
So I would like to know if there is a way to copy a php file content into a variable and execute it the same way as include/require does, and please don't suggest me to use include/require because it's not what I'm looking for. thanks!
Files can return a value, so yes, you can use include.
included.php:
<?php
return 2 + 2;
parent.php:
<?php
$number = include 'included.php';
echo $number;
In first 'method' server executes separare request for your file_get_contents, so no environment from calling script will be available inside it.
Use second 'method' to get contents of the script and then just eval it.
eval(file_get_contents('http://.../b.php.txt'));
File evaluated that way can define new functionality to be plugged in calling script so that you can call some method and/or pass parameters from it.
a.php
$r = eval(file_get_contents('http://.../b.php.txt'));
if ($r) b_foo($bar);
b.php
function b_foo($baz) {
return 42;
}
return true; // module loaded ok
Surely you know that executing unverified code from third parties in server context is a bad practice, but if you really need it... :)

PHP Include file but only first few lines

I am using PHP Include:
<?php include 'file1.php'; ?>
i want to only include the first few lines of file1.php - is this possible?
If you really want to include (run as PHP), then just pull those lines out into a new file:
new.php:
<?php
// line 1
// line 2
And include it in both files:
existing.php and other.php:
<?php
include('new.php');
...
<?php
$return_from_inc = include('file1.php');
?>
file1.php
<?php
if ($x === 1) { return 'A'; }
else { return 'B'; }
//... return ("break") running script wherever you want to
?>
Depending on the content of those first lines, why don't you use PHP Functions?
file1.php
<?php
function what_i_want_to_include(){
//"First lines" content
}
}
existing.php
<?php
include('file1.php');
what_i_want_to_include();
?>
Using functions it's the simplest way to do it.
You can simply use return on the line of your choice and control will be sent back to the calling file.
If called from within a function, the return statement immediately ends execution of the current function, and returns its argument as the value of the function call. return will also end the execution of an eval() statement or script file.
If called from the global scope, then execution of the current script file is ended. If the current script file was included or required, then control is passed back to the calling file. Furthermore, if the current script file was included, then the value given to return will be returned as the value of the include call. If return is called from within the main script file, then script execution ends. If the current script file was named by the auto_prepend_file or auto_append_file configuration options in php.ini, then that script file's execution is ended.
Source: PHP Manual
There are a few options to achieve this, but let me stress out that if this is necessary for your application to work you should really consider reviewing the app design.
If you want it programatically you can either grab the first x lines and use eval() to parse them. Example:
$file_location = '/path/to/file.php';
$number_of_lines = 5; //
$file_array = file($file_location);
if(!$file) {
return false; // file could not be read for some reason
}
$first_lines = array_slice($file_array, 0, $number_of_lines);
$to_be_evaluated = implode('', $first_lines);
eval($to_be_evaluated);
But you should take not that eval expects a string without the php opening tag (<?php), at least, not at the start. So you should search for it and delete it in the first line (if present):
if(strpos($first_lines[0], '<?php') !== false) {
$first_lines[0] = substr(strpos($first_lines[0], '<?php') + 5);
}
Another, and better option, and as suggested above, just pull out the required lines, save them to another file, and include them in both. You could also do this programatically, you could even extract the needed lines and save them to a temporary file on the fly.
Edit it is a 'weird' question, in the sense that it should not be necessary. Could you explain what exactly you are trying to do? Most probably we can come up with a nice alternative.
Edit
As I understand it correctly you have in the file-to-be-included a lot of stuff, but only the database settings are needed. In that case, put them elsewhere! Example:
settings.php
$connection = new mysqli($host, $user, $pass, $db);
if($connection->connect_error) {
die('This failed...');
}
header.php
<?php require_once('settings.php'); ?>
<html>
<head>
<title>My awesome website</title>
... other stuff
</head>
other_file.php
<?php
require_once('settings.php');
$r = $connection->query('SELECT * FROM `my_table` WHERE `random_field`=`random_value`');
etc. etc.
In settings.php you could also put everything in functions to ensure pieces are only executed when needed. You could in example create a get_connection() function, which checks if a database connection exists, otherwise creates it and returns it for usage.
No need for fancy eval() functions at all!
Please bear in mind that it isn't a crime to divide your application in a thousand files. It really isn't!

Return from include file

in PHP, how would one return from an included script back to the script where it had been included from?
IE:
1 - main script
2 - application
3 - included
Basically, I want to get back from 3 to 2, return() doesn't work.
Code in 2 - application
$page = "User Manager";
if($permission["13"] !=='1'){
include("/home/radonsys/public_html/global/error/permerror.php");
return();
}
includeme.php:
$x = 5;
return $x;
main.php:
$myX = require 'includeme.php';
also gives the same result
This is one of those little-known features of PHP, but it can be kind of nice for setting up really simple config files.
return should work, as stated in the documentation.
If the current script file was include()ed or require()ed, then control is passed back to the calling file. Furthermore, if the current script file was include()ed, then the value given to return() will be returned as the value of the include() call.
I know that this has already been answered, but I think I have a nice solution...
main.php
function test()
{
$data = 'test';
ob_start();
include( dirname ( __FILE__ ) . '/included.php' );
return ob_get_clean();
}
included.php
<h1>Test Content</h1>
<p>This is the data: <?php echo $data; ?></p>
I just included $data to show that you can still pass data to the included file, as well as return the included file.
Hm, the PHP manual disagrees with you. return should bail you out of an included file. It won't work from within a function, of course.
See Example #5 in the documentation for include.
You can get the return value of the script when including it, like:
$foo = include 'script.php';

Categories