2013-09-13 3 views
-2

Два часа назад работал следующий скрипт. Теперь по какой-то причине я получаю сообщение об ошибке «Warning: Division by zero in _ on line 30». Вот сценарий. Может ли кто-нибудь сказать мне, что я делаю неправильно, и как исправить это?PHP Division by Zero?

В основном этот скрипт вытаскивает данные из двух элементов на другом веб-сайте, деля их, чтобы получить число, которое, в свою очередь, используется для установки ширины элемента. Некоторое время было устранено это. Большое спасибо заранее!

<?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>"; 

?>

+1

В целом это также помогает обеспечить линию кода. Очень мало будет идти и считать строки в вашем коде .... – Havelock

+0

Не могли бы вы отметить линию? Я не хочу считать ... –

+1

Я собираюсь выйти на конечность и сказать, что это единственная линия с делением. '$ diff = ($ total/$ total2) * 100;' По-видимому '$ total2' равно 0. –

ответ

0

$total2 является 0, потому что вы установили неправильный RegExp.

Во-первых, добавьте i после последнего / в обоих моделей в режим изменения в нечувствительны к регистру (у вас есть, например. Raised So Far на сайте, но вы используете Raised so far). Затем проверьте, что вы получаете в своих $matches.

+0

Elon, это исправлено! Thanks – Noah

5

Сообщение об ошибке полезно здесь. На этой линии:

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

переменной $ total2 может быть когда-нибудь равным 0, так что PHP не может выполнить расчет (это невозможно разделить на ноль). Таким образом, вы chould сделать Somthing так:

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

Кроме того, я могу видеть на своем коде, что $ общей и $ total2 струнные, преобразуется в поплавок. Это также может быть источником ошибок. Вы должны заставить преобразование плавать с помощью floatval:

if(floatval($total2)) 
    $diff = (floatval($total)/floatval($total2)) * 100; 
else 
    $diff = 0; 
+0

Спасибо за ответ. Если вы перейдете по адресу, stayclassy.org/fundraise?fcid=257739, «$ total2» потянет номер под «Моя цель» на этом веб-сайте, который составляет 1000 долларов США. Я не понимаю, почему я получаю значение 0.Вот производственный сайт: http://funforfreedom.com – Noah

+0

Перед '$ total2 = $ matches [1];' введите эту строку 'print_r ($ matches); die(); 'и вставьте здесь результат. – Scalpweb

+0

Я проверил вашу страницу. Вы должны добавить «i» в конец вашего RegExps, чтобы убедиться, что тест не чувствителен к регистру. И затем вы увидите с помощью print_r выше, если ваша переменная $ total2 содержит правильное значение. – Scalpweb

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 

В принципе, он будет отображаться как ноль. Это не самый лучший способ, но с точки зрения эффективности, если вы имеете дело с большим количеством данных, может быть лучше не отображать предупреждение по сравнению с выполнением проверки в каждой строке данных.

Возможно, это не то, что я сделал бы (хотя я сделал это один раз), но я думал, что предлагаю это как предложение.

+0

Эй, человек, спасибо за ответ. На самом деле это не выплевывает данные. Если вы пойдете сюда, вы можете увидеть это: http://www.funforfreedom.com/ – Noah

+0

@Noah, как это важно, если он выплевывает данные или нет? Вы можете использовать приведенное здесь предложение. – eis