我的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);
}
?>
答案 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更新语句中。这是一个广泛的主题,所以我不打算在这里深入研究,但是你可以在这里搜索其他问题,特别要问这个问题。