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

时间:2013-07-12 22:16:18

标签: php mysql mysql-error-1064

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

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

原始剧本如下

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);
}
?>

2 个答案:

答案 0 :(得分:2)

$aver = ($rs['voter'] == 0) ? 0 : $rs['total'] / $rs['voter']; 

答案 1 :(得分:0)

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

// 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或&#39;&#39; (空字符串)。

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