public function genMenu($parent_id, $menu_type, $utype, $parent_token=0, $currentpage = 0) {
$stmt = $this->db->prepare("SELECT n.page_id, p.short_name, p.token FROM navigation AS n, pages AS p, user_page_restr AS r WHERE n.parent_id = ? AND r.pg_id=p.id AND n.menu=? AND (r.user_type=? OR r.user_type=0) AND n.page_id=p.id ORDER BY r.order") or die($this->db->error);
$stmt->bind_param("iii", $parent_id, $menu_type, $utype) or die($stmt->error);
$stmt->execute() or die($stmt->error);
$stmt->store_result();
$menu = array();
$stmt->bind_result($menu['id'], $menu['short_name'], $menu['token']) or die($stmt->error);
if ($stmt->num_rows > 0)
echo "\n<ul>\n";
while ($stmt->fetch()) {
echo "<li ";
if ($menu['token']==$currentpage) {
echo 'class="active"';
}
echo ">";
switch ($menu_type) {
case 2:
echo '<a href="?page=' . $parent_token;
echo '&subpage=' . $menu['token'];
echo '">' . $menu['short_name'] . '</a>';
break;
default:
echo '<a href="?page=' . $menu['token'] . '">' . $menu['short_name'] . '</a>';
break;
}
echo "</li>\n\n";
}
if ($stmt->num_rows > 0)
echo "</ul>\n";
$stmt->close();
}
看看这个
if ($menu['token']==$currentpage) {
echo 'class="active"';
}
即使$ menu ['token']是字符串且具有精确值且$currentpage
为0,如果condition返回结果为true并在if(echo 'class="active"';
)内执行表达式
有人可以解释为什么会这样吗?
答案 0 :(得分:3)
我猜测PHP正在隐式地将字符串转换为int
,这将导致比较0 == 0
,这总是正确的。尝试使用严格相等运算符:
$menu['token'] === $currentpage
严格相等运算符的作用是比较和类型的双方值。在您的情况下,由于0
不是字符串,因此比较会立即返回false
。
答案 1 :(得分:2)
您有投射问题。将整数与带有==
运算符的字符串进行比较时,字符串将转换为其等效整数,对于不以数字开头的字符串,该字符串为0。
答案取决于你想做什么。如果您只想将字符串与字符串匹配,请使用===
运算符。
如果您希望空字符串匹配0,则可以使用
if ((string)$currentpage === $menu['token'])
确保比较是按字符串完成的,而不是默认的int到int。
答案 2 :(得分:0)
'new_mail'被强制转换为整数进行比较;变为0。
"new_mail" == 0 equals true