我正在尝试让我的函数返回用户名和roleid。这是我为此任务所拥有的代码:
session_start();
if($_SESSION['LoggedIn']){
$username = $_SESSION['username'];
function getUserRole($username, $roleid){
$con = dbConnect();
$query = "select * from user inner join userrole on user.id = userrole.userid inner join role on role.id = userrole.roleid where username = :username and roleid = :roleid";
$sql = $con->prepare($query);
$sql->bindValue(':username', $username);
$sql->bindValue(':roleid', $roleid);
$sql->execute();
$row = $sql->fetch();
$username = $row['username'];
$roleid = $row['roleid'];
if($row > 0){
return $username . $roleid;
} else {
return false;
}
}
print getUserRole($username, $roleid);
}
我有三个看起来像这样的表:
mysql> select * from role;
+---------------+----------------------------------+
| id | description |
+---------------+----------------------------------+
| administrator | add, remove and edit manuscripts |
| reviewer | review manuscripts |
| site user | read manuscripts |
+---------------+----------------------------------+
3 rows in set (0.00 sec)
mysql> select * from userrole;
+--------+---------------+
| userid | roleid |
+--------+---------------+
| 1 | administrator |
| 2 | revinothingewer |
| 3 | other |
+--------+---------------+
3 rows in set (0.01 sec)
mysql> select * from user;
+----+----------+----------------------------------+
| id | username | password |
+----+----------+----------------------------------+
| 1 | kamau | 80ce10e582e13ec085f13409c3add5a4 |
| 2 | admin | db43b86da58631629adada27f1db5841 |
| 3 | amaina | 7fc961ec5b6b5d51d2445e97775bfc0d |
+----+----------+----------------------------------+
roleid值来自以下脚本:
$query = "select * from user inner join userrole on user.id = userrole.userid inner join role on role.id = userrole.roleid";
$sql = $con->prepare($query);
$sql->execute();
$row = $sql->setFetchMode(PDO::FETCH_ASSOC);
while ($row = $sql->fetch()){
$roleid = $row ['roleid'];
}
我的问题是为什么var_dump (getUserRole($username,$roleid))
返回false?
答案 0 :(得分:2)
为什么var_dump(getUserRole($ username,$ roleid))返回false?因为
if($row > 0){
每次这种情况只会发生错误。如果你想获得用户名和角色。您必须执行以下步骤。 你知道用户名。
$username = $_SESSION['username'];
2。你需要知道roleid。因此,使用以下代码获取roleid值。
$con = dbConnect();
$query = "SELECT roleid FROM user JOIN userrole ON user.id = userrole.userid WHERE user.username = :username";
$sql = $con->prepare($query);
$sql->bindValue(':username', $username, PDO::PARAM_STR);
$sql->execute();
$row = $sql->fetch();
$roleid = $row['roleid'];
多数民众赞成。现在您知道用户名值和角色值。 保持简单的伙伴。欢呼声。
答案 1 :(得分:1)
...
问题编辑后1 OP
$roleid
的价值是多少?此时你还没有设置插入函数的roleid
的值是什么,所以函数没有运行,PHP返回错误(你无法检测到)。
通过OP进一步编写问题后
你需要考虑你的逻辑并思考你实际在做什么。在你走路之前,你似乎想要跑步。
getUserRole
采用两个参数,您只传递 一个 非null
参数,因此该函数中<{1}} 的值该函数始终为$roleid
。你的SQL:
null
阅读此查询,实际阅读并确定它正在做什么。您正在查找"SELECT * FROM user INNER JOIN userrole ON user.id = userrole.userid
INNER JOIN role on role.id = userrole.roleid WHERE username = :username
AND roleid = :roleid"
和username = <value>
,但表格中的值
因此,您正在寻找具有NULL roleid值的用户名值,并且您的表显示已填充每个roleid值,以便始终只返回任何值。
另外,因为您正在使用 INNER JOIN ,这意味着如果查询的任何部分什么都不返回,则整个查询将不会返回任何内容,因此这就是您的原因所在没有回应。
这是您的SQL返回false的主要原因
您还需要修改定义,因为您引用了多个表,每个表列应引用为roleid = <value>
,例如
<table_name>.<column_name>
整个SQL查询。
有几个选择:
使用 user.id = userrole.userid
代替LEFT JOIN
。
在函数或页面调用函数中将INNER JOIN
的值设置为非null。
从函数参数中删除roleid
,而是从函数开头的单独SQL查询中派生值。
选择权在你手中。请阅读您实际要求数据库执行的操作,以了解它为什么不这样做。还可以使用错误记录来获得有用的反馈!
有用的链接: