PHP $ _GET变量在函数中不起作用,除非它是硬编码的?

PHP $ _GET变量在函数中不起作用,除非它是硬编码的?

问题描述:

这是一个疯狂的...

我有一个来自$ _GET请求的var。它回声良好,但无论我做什么,我都无法将它传递给一个函数,而无需对该值进行硬编码。

$txAmount = strip_tags($_GET['amt']); 

相呼应$ txAmount返回如下:23.28684804(因为它应该)

// Running some validation to ensure it's only digits and a period 
if(preg_match_all('/^[0-9,.]*$/', $txAmount) && strpos($txAmount, '.') !== false) { 

// then some other functions run, nothing that uses or affects $txAmount 

// Then I call a class to run the function, all other variables being passed in are working fine 
$findTX = $client->findTx($payment_address, $txAmount, $listTransactions); 

// This is the function 
function findTx($address, $txAmount, $array) 
    { 
     foreach ($array as $key => $val) { 
      if ($val['address'] === $address && $val['amount'] === $txAmount) { 

       return $val['txid']; 
      } 
     } 
     return null; 
    } 

而这正是它去山雀起来......

它只是拒绝匹配$ txAmount到$ val ['amount'],尽管它们完全相同,应该返回true。

我可以使它发挥作用的唯一途径是通过硬编码(在脚本其他地方)的值所有这些都将工作得很好:

$txAmount = 23.28684804; 

$findTX = $client->findTx($payment_address, 23.28684804, $listTransactions); 

if ($val['address'] === $address && $val['amount'] === 23.28684804) 

我甚至尝试了微调可变只是情况下有一些隐藏的空白有,但仍然没有喜悦:

$txAmount = trim($txAmount); 

我是不是要疯了这里还是有一些疯狂的怪癖其中PHP只是讨厌这个变量?可能与小数点后8位有什么关系?

+1

尝试打印使用'的var_dump($ txAmount)'变量。也许这是一个对象?如果是这样,尝试将其转换为浮动? (例如'floatval($ txAmount)== floatval($ val ['amount'])' –

+0

啊,我们正在某处......它倾倒了字符串(11)“23.28684804”'但在我要搜索的数组中它被标记为'float(23.28684804)'。我怎样才能改变$ txAmount的格式来使它工作? – user3717922

+0

使用'floatval'。我给出了上面的例子。 –

简单的回答,在findTx函数if条件下,用$val['amount'] == $txAmount代替$val['amount'] === $txAmount

原因:在PHP中,===要求比较的两个值属于同一类型,而==将尝试忽略类型差异。您可以使用gettype()来检查txAmount$val['amount']的类型。当$txAmount来自$_GET时,类型可能有所不同,并且与===进行比较将要求您找到一种将它们转换为相同类型的方法 - 如注释中所示或使用类型转换运算符(例如$txAmount = (float) $txAmount等)。

但是,使用==,PHP将理解正在比较的内容,并且在此情况下从=====的更改将比处理使用不同数据类型的细节更容易,因为这只是一个比较操作这不会以任何方式改变数据。

您可能会发现在PHP数据类型杂耍有趣以下参考:http://php.net/manual/en/language.types.type-juggling.php