除以零错误(PHP设置cookie问题)


Division by Zero error (PHP set cookie issue)

我的php raty脚本结构如下,它一直显示"除以零"。输入结果似乎无法写入Mysql数据库。

我应该更改"$aver=$rs['total']/$rs['vorter']"中的内容吗?非常感谢!

原始脚本如下

include_once ('connect.php');
$score = $_POST['score'];
if (isset ($score)) {
$cookiestr = getip();
$time = time();
if (isset ($_COOKIE['person']) && $_COOKIE['person'] == $cookiestr) {
    echo "1";
}
elseif (isset ($_COOKIE['rate_time']) && ($time -intval($_COOKIE['rate_time'])) < 60) {
    echo "2";
    } else {
    $query = mysql_query("update raty set voter=voter+1,total=total+'$score' ");
    $query = mysql_query("select * from raty");
    $rs = mysql_fetch_array($query);
    $aver = $rs['total'] / $rs['voter'];
    $aver = round($aver, 1) * 10;
    // set COOKIE
    setcookie("person", $cookiestr, time() + 3600 * 365);
    setcookie("rate_time", time(), time() + 3600 * 365);
    echo $aver;
}
}
function getip() {
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) {
    $ip = getenv("HTTP_CLIENT_IP");
} else
    if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) {
        $ip = getenv("HTTP_X_FORWARDED_FOR");
    } else
        if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) {
            $ip = getenv("REMOTE_ADDR");
        } else
            if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
                $ip = $_SERVER['REMOTE_ADDR'];
            } else {
                $ip = "unknown";
            }
return ($ip);
}
?>
$aver = ($rs['voter'] == 0) ? 0 : $rs['total'] / $rs['voter']; 

为了避免被零除,您应该在计算平均评级之前进行额外检查

// we expect a positive number of voters
if ($rs['voter'] > 0) {
    $aver = $rs['total'] / $rs['voter'];
}
else {
    // TODO: handle the unexpected case according to your application's needs
    $aver = 0;
}

不过,代码中几乎没有其他潜在的问题。我不会在这里深究每一个细节,而只是指出一些。

由于您似乎得到了数据库返回的0,因此我假设voter=voter+1没有按预期增加值。请确保数据库中的原始/默认表字段值设置为0(或正整数),而不是NULL或"(空字符串)。

另一个问题是SQL注入的漏洞,因为您将用户/客户端提供的值(永远不应该信任)直接连接到SQL更新语句中。这是一个广泛的话题,所以我不会在这里深入研究,但你可以在so上搜索其他专门问这个问题的问题。