两个小时前,以下脚本有效。现在由于某种原因,我收到一个错误“警告:在第30行的_中除以零”。这是脚本。谁能告诉我我做错了什么以及如何纠正它?
这个脚本基本上是从另一个网站上的两个元素中提取数据,将它们分成一个数字,然后用它来设置一个元素的宽度。对此进行了一段时间的故障排除非常感谢提前!
<?php
define("FFF_SIXDEGREES", "http://www.stayclassy.org/fundraise?fcid=257739");
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, FFF_SIXDEGREES);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
if(!($results = curl_exec($curl))) {
print("{ \"total\": \"$0.00\" }");
return;
}
$pattern = '/<li class="goalTitle">Raised so far:<\/li>\s*<li>\$([\d\.,]+)<\/li>/';
preg_match($pattern, $results, $matches);
$total = $matches[1];
$total = str_replace(",", "", $total);
// printf("<h2 class=\"raised-total\">$%s</h2>", formatMoney($total, true));
$pattern2 = '/<li class="goalTitle">My goal:<\/li>\s*<li>\$([\d\.,]+)<\/li>/';
preg_match($pattern2, $results, $matches);
$total2 = $matches[1];
$total2 = str_replace(",", "", $total2);
// printf("<h2 class=\"goal-total\">$%s</h2>", formatMoney($total2, true));
$diff = ($total/$total2) * 100; // THIS IS THE LINE OF CODE IN QUESTION
function formatMoney($number, $fractional=false)
{
if ($fractional) {
$number = sprintf('%.2f', $number);
}
while (true) {
$replaced = preg_replace('/(-?\d+)(\d\d\d)/', '$1,$2', $number);
if ($replaced != $number) {
$number = $replaced;
} else {
break;
}
}
return $number;
}
echo "<div class=\"progress-header\" style=\"width:$diff%;\"><span class=\"raised-amount\">$$total</span><span class=\"goal-amount\">$$total2</span></div>";
&GT;
答案 0 :(得分:5)
错误消息在这里很有帮助。在那一行:
$diff = ($total/$total2) * 100;
if($total2) // This condition will be true if $total2 != 0
$diff = ($total/$total2) * 100;
else
$diff = 0;
另外,我可以在你的代码中看到$ total和$ total2是字符串,转换为float。这也可能是错误的根源。你应该使用floatval强制转换浮动:
if(floatval($total2))
$diff = ( floatval($total) / floatval($total2) ) * 100;
else
$diff = 0;
答案 1 :(得分:0)
$total2
为0
,因为您设置了错误的RegExp。
首先,在两个模式中的最后i
之后添加/
以将模式更改为不区分大小写(您在网站上有例如。Raised So Far
,但您正在使用{{1} })。接下来,检查两个Raised so far
中的内容。
答案 2 :(得分:0)
鉴于它实际上只是一个警告并且不会导致脚本停止,您还可以使用以下内容简单地隐藏该行上的消息:
<?php
$var=4;
$diff = (100/$var) * 100;
echo $diff."<br><br>";
$var=0;
$diff = (100/$var) * 100;
echo $diff."<br><br>";
$var=0;
$diff = @(100/$var) * 100; // Note the @ symbol before the possible wanring
echo $diff."<br><br>";
?>
输出:
2500
Warning: Division by zero in C:\Server\www\test1.php on line 8
0
0
基本上,它将呈现为零。这不是最好的方法,但就效率而言,如果您处理大量数据,与对每行数据执行验证相比,最好不显示警告。
这可能不是我会做的(虽然我已经做了一次)但我认为我会提供它作为建议。