I'm trying to print the value of empty variables as "Not available" with a specific style (class = 'not-available'). The data will be taken from multiple custom fields and some of them may have an empty value. I'm already doing this with the following code in PHP. My question: is there any alternative way to do the same more efficiently without checking each variable separately?
$na = "<span class='not-available'>Not available</span>";
$prog_auth_id = get_field('prog_auth_id');
if(empty($prog_auth_id)) $prog_auth_id = $na;
$prog_entity_cat = get_field('prog_entity_cat');
if(empty($prog_entity_cat)) $prog_entity_cat = $na;
$prog_assoc_entity = get_field('prog_assoc_entity');
if(empty($prog_assoc_entity)) $prog_assoc_entity = $na;
You can use variable variables in a loop to identify the variables that are empty or not and style them as desired:
$fields = ['prog_auth_id', 'prog_entity_cat', 'prog_assoc_entity'];
foreach($fields as $value) {
$$value = (empty($$value)) ? $na : $$value;
}
working demo
I'm designing a semi-basic tool in php, I have more experience server side, and not in php.
My tool contains 10-15 pages, and I am doing the navigation between them with the $_GET parameter.
I would like to check if the query string is empty (to know if I'm in the home page). Is there any php function for this ? Of course I can do it manually, but still?
EDIT: My question is if there is a function that replaces
if(! isset("param1") && .....&& ! isset("paramN")){
...
}
Try below
if(isset($_GET['YOUR_VARIABLE_NAME']) && !empty($_GET['YOUR_VARIABLE_NAME'])) {
}
isset() is used to check whether there is any such variable or not
empty() to check whether the variable is not empty or not
As per your comment, assume your URL as below
http://192.168.100.68/stack/php/get.php?id=&name=&action=delete&type=category
And your PHP script as below
<?php
$qs = $_GET;
$result = '';
foreach($qs as $key=>$val){
if(empty($val)){
$result .= 'Query String \''.$key.'\' is empty. <br />';
}
}
echo '<pre>'; print_r($result);
?>
In my above URL I passed id and name as empty.
Hence, Result will be like below
id is empty.
name is empty.
but I dont think its standard way.
If you want to process something only if all parameters are having some values, they you can move those process inside a if as below
if(empty($result)) {
// YOUR PROCESS CODE GOES HERE
} else {
echo 'Some Required Parameters are missing. Check again';
}
I have a script which includes a double-quoted string (used to make an html table, if it makes a difference) that incorporates about a dozen variables. Each of those variables is modified by a while loop. I would like to push each set of values to a multidimensional array on each iteration of the loop. Right now I could do
array_push($my_array, $var1, $var2, $var3, ...);
but that is awkward.
Is there a way to just dump all the variables in this string into my array, something like:
array_push($my_array, get_vars_from_string($string));?
(Obviously it would have been wonderful if the variables used in the script were in an array to begin with, but I didn't write the original and changing that would require too many changes to the structure of the program.)
By "variables inside a string" I mean: $table = "<td>$var1</td><td>$var2</td><funky stuff with subheadings> stuff..."
function get_vars_from_string($param)
{
$arrfromstring=explode('$',$param);//or tokenize here
$ret=array();//return value
//then do the formatting and get the names of the variables,this can be done by some other functions too
foreach($arrayfromstring as $key)
array_push($ret,${$key});//this is the part you are looking for.
}
You will understand what i mean by the the tokenizing part I think. The interesting part is the ${$key}. An example.
To get variables from string, you can use token_get_all(), but you have to use string not processed by php, but raw line of code that assigns this string to variable.
Proof of concept code with bad practices:
<?php
$string_vars = array();
$double_quote_started = false;
$all_vars = array();
$table = "";
$var1 = 5;
$var2 = -5;
while($var1-- && $var2++) {
// note single quotes, this does not evaluate variables but treats everything as string
$table_str = <<<'EOT'
$table .= "<td>$var1</td><td>$var2</td><td>funky stuff</td>";
EOT;
//evaluate the line as it was earlier
eval($table_str);
// since this is is first iteration, let's search our string for them
if (empty($string_vars)) {
foreach(token_get_all("<?php " . $table_str) as $token) {
if (is_array($token) && $token[0] == T_VARIABLE && $double_quote_started) {
$string_vars[] = substr($token[1],1);
} elseif ($token === '"') {
$double_quote_started = !$double_quote_started;
}
}
}
$this_iteration = array();
foreach($string_vars as $var){
// variable variable to get content of variable
$this_iteration[$var] = $$var;
}
// save this iteration vars
$all_vars[] = $this_iteration;
}
I have one variable that comes from a database.
I then want to check whether that value is the same of one of the values in an array.
If the variable matches one of the array values, then I want to print nothing, and if the variable does not match one of the array values, then I want to print something.
This is the code I have been trying without luck, I know that contains is not valid code, but that is the bit I cannot find any info for:
<?php
$site = getStuff();
$codes = array('value2', 'value4');
if ($codes contains $site)
{
echo "";
}
else
{
echo "something";
?>
So if the database would return value1 for $site, then the code should print "something" because value1 is not in the array.
The function you are looking for is in_array.
if(in_array($site, array('value2', 'value4')))
if(!in_array($site,$codes)) {
echo "something";
}
To provide another use way to do what the other answers suggest you can use a ternary if
echo in_array($site, $codes)?"":"something";
What is the "less code needed" way to get parameters from a URL query string which is formatted like the following?
www.mysite.com/category/subcategory?myqueryhash
Output should be: myqueryhash
I am aware of this approach:
www.mysite.com/category/subcategory?q=myquery
<?php
echo $_GET['q']; //Output: myquery
?>
$_SERVER['QUERY_STRING'] contains the data that you are looking for.
DOCUMENTATION
php.net: $_SERVER - Manual
The PHP way to do it is using the function parse_url, which parses a URL and return its components. Including the query string.
Example:
$url = 'www.mysite.com/category/subcategory?myqueryhash';
echo parse_url($url, PHP_URL_QUERY); # output "myqueryhash"
Full documentation here
The function parse_str() automatically reads all query parameters into an array.
For example, if the URL is http://www.example.com/page.php?x=100&y=200, the code
$queries = array();
parse_str($_SERVER['QUERY_STRING'], $queries);
will store parameter values into the $queries array ($queries['x']=100, $queries['y']=200).
Look at documentation of parse_str
EDIT
According to the PHP documentation, parse_str() should only be used with a second parameter (array). Using parse_str($_SERVER['QUERY_STRING']) on this URL will create variables $x and $y, which makes the code vulnerable to attacks such as http://www.example.com/page.php?authenticated=1.
If you want the whole query string:
$_SERVER["QUERY_STRING"]
I will recommend the best answer as:
<?php
echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!';
?>
Assuming the user entered http://example.com/?name=Hannes
The above example will output:
Hello Hannes!
Programming Language: PHP
// Inintialize a URL to the variable
$url = 'https://www.youtube.com/watch?v=qnMxsGeDz90';
// Use parse_url() function to parse the URL
// and return an associative array which contains its various components
$url_components = parse_url($url);
// Use the parse_str() function to parse the
// string passed via the URL
parse_str($url_components['query'], $params);
// Display result
echo 'v parameter value is ' . $params['v'];
This worked for me.
Also if you are looking for current file name along with the query string, you will just need following
basename($_SERVER['REQUEST_URI'])
It would provide you info like following example
file.php?arg1=val&arg2=val
And if you also want full path of file as well starting from root, e.g. /folder/folder2/file.php?arg1=val&arg2=val then just remove basename() function and just use fillowing
$_SERVER['REQUEST_URI']
This code and notation is not mine. Evan K solves a multi value same name query with a custom function ;)
is taken from:
http://php.net/manual/en/function.parse-str.php#76792
Credits go to Evan K.
It bears mentioning that the parse_str builtin does NOT process a query string in the CGI standard way, when it comes to duplicate fields. If multiple fields of the same name exist in a query string, every other web processing language would read them into an array, but PHP silently overwrites them:
<?php
# silently fails to handle multiple values
parse_str('foo=1&foo=2&foo=3');
# the above produces:
$foo = array('foo' => '3');
?>
Instead, PHP uses a non-standards compliant practice of including brackets in fieldnames to achieve the same effect.
<?php
# bizarre php-specific behavior
parse_str('foo[]=1&foo[]=2&foo[]=3');
# the above produces:
$foo = array('foo' => array('1', '2', '3') );
?>
This can be confusing for anyone who's used to the CGI standard, so keep it in mind. As an alternative, I use a "proper" querystring parser function:
<?php
function proper_parse_str($str) {
# result array
$arr = array();
# split on outer delimiter
$pairs = explode('&', $str);
# loop through each pair
foreach ($pairs as $i) {
# split into name and value
list($name,$value) = explode('=', $i, 2);
# if name already exists
if( isset($arr[$name]) ) {
# stick multiple values into an array
if( is_array($arr[$name]) ) {
$arr[$name][] = $value;
}
else {
$arr[$name] = array($arr[$name], $value);
}
}
# otherwise, simply stick it in a scalar
else {
$arr[$name] = $value;
}
}
# return result array
return $arr;
}
$query = proper_parse_str($_SERVER['QUERY_STRING']);
?>
Here is my function to rebuild parts of the REFERRER's query string.
If the calling page already had a query string in its own URL, and you must go back to that page and want to send back some, not all, of that $_GET vars (e.g. a page number).
Example: Referrer's query string was ?foo=1&bar=2&baz=3 calling refererQueryString( 'foo' , 'baz' ) returns foo=1&baz=3":
function refererQueryString(/* var args */) {
//Return empty string if no referer or no $_GET vars in referer available:
if (!isset($_SERVER['HTTP_REFERER']) ||
empty( $_SERVER['HTTP_REFERER']) ||
empty(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY ))) {
return '';
}
//Get URL query of referer (something like "threadID=7&page=8")
$refererQueryString = parse_url(urldecode($_SERVER['HTTP_REFERER']), PHP_URL_QUERY);
//Which values do you want to extract? (You passed their names as variables.)
$args = func_get_args();
//Get '[key=name]' strings out of referer's URL:
$pairs = explode('&',$refererQueryString);
//String you will return later:
$return = '';
//Analyze retrieved strings and look for the ones of interest:
foreach ($pairs as $pair) {
$keyVal = explode('=',$pair);
$key = &$keyVal[0];
$val = urlencode($keyVal[1]);
//If you passed the name as arg, attach current pair to return string:
if(in_array($key,$args)) {
$return .= '&'. $key . '=' .$val;
}
}
//Here are your returned 'key=value' pairs glued together with "&":
return ltrim($return,'&');
}
//If your referer was 'page.php?foo=1&bar=2&baz=3'
//and you want to header() back to 'page.php?foo=1&baz=3'
//(no 'bar', only foo and baz), then apply:
header('Location: page.php?'.refererQueryString('foo','baz'));
Thanks to #K. Shahzad.
This helps when you want the rewritten query string without any rewrite additions. Let’s say you rewrite the /test/?x=y to index.php?q=test&x=y and you only want the query string.
function get_query_string(){
$arr = explode("?", $_SERVER['REQUEST_URI']);
if (count($arr) == 2){
return "";
}
else{
return "?" . end($arr) . "<br>";
}
}
$query_string = get_query_string();
For getting each node in the URI, you can use function explode() for $_SERVER['REQUEST_URI']. If you want to get strings without knowing if they are passed or not, you may use the function I defined myself to get query parameters from $_REQUEST (as it works both for POST and GET parameters).
function getv($key, $default = '', $data_type = '')
{
$param = (isset($_REQUEST[$key]) ? $_REQUEST[$key] : $default);
if (!is_array($param) && $data_type == 'int') {
$param = intval($param);
}
return $param;
}
There might be some cases when we want to get query parameters converted into Integer type, so I added the third parameter to this function.