How to check `if` statement from database column like '$a > $b' - php

How to check if statement from database column like $a > $b or $a == $b or $a != $b or $a < $b
I got data from database in $row['condition']
$row['condition'] = '$a == $b';
or
$row['condition'] = '100 == 10';
in if statement I want to check
if($row['condition']){
echo 'true';
}else{
echo 'false';
}
I want to output
false

A way to do so is using eval() function. But as the manual says, this is very dangerous:
Caution:
The eval() language construct is very dangerous because it allows execution of arbitrary PHP code. Its use thus is discouraged. If you have carefully verified that there is no other option than to use this construct, pay special attention not to pass any user provided data into it without properly validating it beforehand.1
That said, this code can be used:
$row['condition'] = '$a == $b';
$a=10;
$b=20;
// Evaluate the condition using "return your_condition;"
if (eval( 'return ' . $row['condition'] . ';' ))
{
echo "true";
}
else
{
echo "false";
}
Test it here.
1http://php.net/manual/en/function.eval.php

Related

Can ($a == 1 && $a == 2 && $a == 3) ever evaluate to true?

Similar to this question here which was intended for javascript, it has spawned off numerous spin-offs for various different languages. I'm curious if the following can ever evaluate to true in PHP:
($a == 1 && $a == 2 && $a == 3)
To follow up a bit more, it seems simply setting $a = true will yield the desired result (This was not the case for javascript, due to the way type casting works in both languages). A few answers (in javascript) worked with === as well, so in PHP with typechecking (===), can the following ever yield true?
($a === 1 && $a === 2 && $a === 3)
I just tried this:
$a = true;
echo ($a == 1 && $a == 2 && $a == 3);
and it echoed 1.
Because of the type casting and not type checking, 1, 2, 3 will be treated as true when compared to a boolean value.
Answer to the edit: No it can't be done.
Hackish method which #FrankerZ commented about:
Zero byte character = 0xFEFF
http://shapecatcher.com/unicode/info/65279
http://www.unicodemap.org/details/0xFEFF/index.html
$var  = "1";
$var = "2";
$ var = "3";
echo ($var  === "1" && $var === "2" && $ var === "3") ? "true" : "false";
This code runs with this character because the name $ var and $var  seems to be valid for the PHP compiler and with the appropiate font, it can be hidden. It can be achieved with Alt + 65279 on Windows.
Whilst not strictly in keeping with the question, this can be done if the ints are wrapped in quotes:
<?php
class A {
private static $i = 1;
public function __toString()
{
return (string)self::$i++;
}
}
$a = new A();
if($a == '1' && $a == '2' && $a == '3') {
echo 'yep';
} else {
echo 'nope';
}
I can't think of a case where strict comparison would ever yield true. === operator compares the types first, so there's no way to use any magic method wizardry.
For curiosity the closest i could get is to slightly modify the setting and hack the variable in a tick function. Since ticks are only incremeted per statement, we have to break the comparison to multiple statements for this to work.
$a = 1;
register_tick_function(function () use (&$a) {
++$a;
});
declare(ticks = 1) {
$a === 1 or exit(1);
$a === 2 or exit(1);
$a === 3 or exit(1);
}
echo "a = $a\n";
Try it online.

Using of the switch operator

Is it legitimate to use the switch operator in such way, if I want to print the first not empty var in order a,b,c.
The only problem i see is result in case when some conditions will be true.
I've tested it on 5.6 and 7 versions of php
But will it not be depend on the version of php?
$a = '';
$b = '';
$c = 'c';
switch (true) {
case (!empty($a)) :
echo $a;
break;
case (!empty($b)) :
echo $b;
break;
default:
echo $c;
};
You are not relying on any undocumented behaviour here, and it is unlikely this will change in any future version of PHP.
The trick of using switch(true) is sometimes discussed as though it was an extra operator, but it's actually just a consequence of how switch statements work - each case condition is compared with the value in the switch with ==, so you're effectively checking $condition == true each time.
Your code:
switch (true) {
case (!empty($a)) :
echo $a;
break;
case (!empty($b)) :
echo $b;
break;
default:
echo $c;
}
It's equivalent to:
if (true == !empty($a)) {
echo $a;
goto end;
}
if (true == !empty($b)) {
echo $b;
goto end;
}
// fallback
echo $c;
// goto target
end:
Since you're not using any fall through, we can rewrite the goto parts with elseand elseif:
if (true == !empty($a)) {
echo $a;
}
elseif (true == !empty($b)) {
echo $b;
}
else {
echo $c;
}
And of course the true == is redundant as well:
if (!empty($a)) {
echo $a;
}
elseif (!empty($b)) {
echo $b;
}
else {
echo $c;
}
As long as every case has a corresponding break, these different pieces of code are guaranteed to be identical based on the fundamental definition of a switch statement. The last is by far the most common, and thus easiest for other people to read your code.
The big difference with switch is that you can "fall through" and combine cases in different ways. If you need to do this, then the switch (true) form may be useful. If you don't need it, you should probably avoid the risk of accidentally falling through by using a normal if-elseif chain.
$a = '';
$b = '';
$c = 'c';
if(!empty($a)){
echo $a;
}elseif (!empty($b)){
echo $b;
}else{
echo $c;
}
elseif is the best and general Way!

Some Confusion in IF Condition of PHP

This is the code
$a = 'Rs 15.25';
if ( $a != '' && $a! = 0 ) {
echo "Inside If";
} else {
echo "Outside If";
}
actually I want to Print "Inside If" so that's why I put $a='Some String Value'. But it always prints "Outside If". Then I changed my code to
$a = 'Rs 15.25';
if ( $a != '' && $a != '0' ) {
echo "Inside If";
} else {
echo "Outside If";
}
I have just added single quotes to 0. Then i got the exact output as i want. But I didn't understand why this happens.
So please help me with this.
PHP does weak type comparison, that is, it converts both operands to the same type before doing the actual comparison.
If one of the operands is a number, the other one is converted to a number as well. If the second operand is a string and contains no digits, it is silently converted to the number 0.
To avoid this whole issue, use string type checking with the operator !== (=== for equality).
if($a !== '' && $a !== 0) {
echo "Inside If";
} else {
echo "Outside If";
}
First of all you when you have multiple conditions on an if statement you should always enclose each of them within brackets
So first thing you should do is to change your code to
$a='Rs 15.25';
if(($a!='') && ($a!='0'))
{
echo "Inside If";
}else
{
echo "Outside If";
}
In PHP 0 = FALSE, 1 = TRUE.
if($a != 0) -> if($a != FALSE)
if $a = 'Rs 15.25', $a != false and $a not empty, then you have echo "Outside If";

Wordpress QR Code Widget

Basically, I've been trying to make a simple Wordpress widget that displays a QR code with the URL of the current page. I'm using a modififed version of the simple text widget that parses PHP too.
function the_qrcode($permalink = '', $title = '') {
if($permalink && $title == '') {
$permalink = 'http://eternityofgamers.com/forums';
$title = 'Forums';
}
echo '<img src="http://api.qrserver.com/v1/create-qr-code/?data=' .$permalink. '" alt="QR: ' .$title. '"/>;
}
Can someone tell me what's wrong with this? I get a 500 error when I add it to functions.php.
You will need to use the urlencode() function. Generally as a rule of thumb all querystring values should be url encoded.
function the_qrcode( $permalink = '' ) {
if($permalink == '') {
$permalink = 'http://eternityofgamers.com/forums';
}
echo '<img src="http://api.qrserver.com/v1/create-qr-code/?data='.urlencode($permalink);
}
Now you can create your QR code with:
the_qrcode(the_permalink());
Also, you had a very bad missing equals sign. It is very important to understand the difference between = and ==. If you don't, no matter the context = and == mean two different things. = assigns the right hand side to the left. == returns true or false whether the left and right hand side are loosely equal (loosely because casting will be used if the sides are not of the same type).
Look at this example (Codepad demo):
$a = 5;
$b = 10;
if($a = 6) {
echo "This always appears because when you assign a truthy (all non-zero numbers are true) to a variable, true is returned.\n";
echo "Also a should now equal six instead of five: " . $a . "\n";
}
if($b == 10) {
echo "This will work as expected because == is a comparison not an assignment.\n";
echo "And b should still be 10: " . $b;
}
Try with:
<?php
function the_permalink( $permalink ) {
if ($permalink == '') {
echo '<img src="http://api.qrserver.com/v1/create-qr-code/?data=http://eternityofgamers.com/forums" alt="QR Code">';
} else {
echo '<img src="http://api.qrserver.com/v1/create-qr-code/?data='.$permalink;
}
}
?>
(I've corrected a bunch of syntax errors)

Checking if isset and is true?

Is there a function to check both
if (isset($var) && $var) ?
The empty() function will do the job.
Use it with the not operator (!) to test "if not empty", i.e.
if(!empty($var)){
}
You may use the ?? operator as such:
if($var ?? false){
...
}
What this does is checks if $var is set and keep it's value. If not, the expression evaluates as the second parameter, in this case false but could be use in other ways like:
// $a is not set
$b = 16;
echo $a ?? 2; // outputs 2
echo $a ?? $b ?? 7; // outputs 16
More info here:
https://lornajane.net/posts/2015/new-in-php-7-null-coalesce-operator
there you go. that should do it.
if (isset($var) && $var)
if (! empty($var))
It seems as though #phihag and #steveo225 are correct.
Determine whether a variable is considered to be empty. A variable is
considered empty if it does not exist or if its value equals FALSE.
empty() does not generate a warning if the variable does not exist.
No warning is generated if the variable does not exist. That means
empty() is essentially the concise equivalent to !isset($var) || $var
== false.
So, it seems !empty($var) would be the equivalent to isset() && $var == true.
http://us2.php.net/empty
Try the empty function:
http://us2.php.net/empty
isset($a{0})
isset AND len is not 0 seems more reliable to me, if you run the following:
<?php
$a=$_REQUEST['a'];
if (isset($a{0})) { // Returns "It's 0!!" when test.php?a=0
//if (!empty($a)) { // Returns "It's empty!!" when test.php?a=0
echo 'It\'s '.$a;
} else { echo 'It\'s empty'; }
?>
$a = new stdClass;
$a->var_false = false;
$a->var_true = true;
if ($a->notSetVar ?? false) {
echo 'not_set';
}
if ($a->var_true ?? false) {
echo 'var_true';
}
if ($a->var_false ?? false) {
echo 'var_false';
}
This way:
if (($var ?? false) == true) {
}
I am amazed at all these answers. The correct answer is simply 'no, there is no single function for this'.
empty() tests for unset or false. So when you use !empty(), you test for NOT UNSET (set) and NOT FALSE. However, 'not false' is not the same as true. For example, the string 'carrots' is not false:
$var = 'carrots'; if (!empty($var)){print 1;} //prints 1
in fact your current solution also has this type problem
$var = 'carrots'; if (isset($var) && $var){print 1;} //prints 1
as does even this
$var = '1.03'; if (isset($var) && $var == true){print 1;} //prints 1
in fact... if you want to do as you described exactly, you need:
$var = 'carrots'; if (isset($var) && $var === true){print 1;} //Note the 3 Equals //doesn't print 1
I suppose the shortest valid way to test this case is :
if (#$var === true){ print 1;}
But suppressing errors for something like this is pretty awful practice.
Don't know if an exact one already exists, but you could easily write a custom function to handle this.
function isset_and_true($var) {
return (isset($var) && $var == true) ? true : false;
}
if (isset_and_true($a)) {
print "It's set!";
}
Check if the variable is set, and true. Ignore warning message
if(#!empty($foo))

Categories