-2

两个小时前,以下脚本有效。现在由于某种原因,我收到一个错误“警告:第 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>";

?>

4

3 回答 3

5

错误消息在这里很有帮助。在那条线上:

$diff = ($total/$total2) * 100;

$total2 变量有时可能等于 0,因此 php 无法执行计算(不可能除以零)。所以你应该做这样的事情:

if($total2) // This condition will be true if $total2 != 0
    $diff = ($total/$total2) * 100;
else
    $diff = 0;

另外,我可以在您的代码中看到 $total 和 $total2 是字符串,转换为浮点数。这也可能是错误的来源。您应该使用 floatval 强制转换为浮动:

if(floatval($total2))
    $diff = ( floatval($total) / floatval($total2) ) * 100;
else
    $diff = 0;
于 2013-09-13T06:25:34.503 回答
0

$total20因为你设置了错误的正则表达式。

首先,在两种模式中添加ilast/以将模式更改为不区分大小写(例如,Raised So Far在网站上,但您正在使用Raised so far)。接下来,检查你的两者都得到了什么$matches

于 2013-09-13T06:29:01.207 回答
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

基本上,它将呈现为零。这不是最好的方法,但就效率而言,如果您正在处理大量数据,与对每行数据执行验证相比,不显示警告可能会更好。

这可能不是我会做的(尽管我做过一次),但我认为我会提供它作为建议。

于 2013-09-13T06:32:23.633 回答