$sql = "select node.id,node.name from ".
$table['role']." as role,".
$table['user']." as user,".
$table['access']." as access ,".
$table['node']." as node ".
"where user.user_id='{$authId}' and user.role_id=role.id and ( access.role_id=role.id or (access.role_id=role.pid and role.pid!=0 ) ) and role.status=1 and access.node_id=node.id and node.level=1 and node.status=1";发现sql里面的$table['user']." as user,"采用了别名为user,于是打印出实际运行时的语句放入SQLServer中运行,会发现SQLServer提示错误信息。错误信息如下:ErrorCode: -2146232060
[.Net SqlClient Data Provider]
Number: 156, Class: 15, State: 1, Line: 2
ErrorMessage: 关键字 'user' 附近有语法错误。
其中最后一行提到了错误原因,查了一下SQLServer的说明,似乎user是SQLServer中的一个关键字(也可能是已经被定义过的变量,具体深层次没去琢磨),当使用user作为别名使用时,会出现该问题。手动改写成非user变量后(如users等),则能获取到相应结果。
更改后:
$sql = "select node.id,node.name from ".
$table['role']." as role,".
$table['user']." as 这里自定义一个别名(如users),".
$table['access']." as access ,".
$table['node']." as node ".
"where 自定义别名.user_id='{$authId}' and 自定义别名.role_id=role.id and ( access.role_id=role.id or (access.role_id=role.pid and role.pid!=0 ) ) and role.status=1 and access.node_id=node.id and node.level=1 and node.status=1";补充:我从官网上下载了3.2.3的TP代码,发现Rbac.class.php文件中的sql语句还是和上面sql编写的一样,在SQLServer下依旧无法获取到结果。我在MySQL数据库中试了下,使用该sql获取应该是没问题,Oracle等其他数据库没试过,个人拙见,或许有什么纰漏也不一定,仅提供给跟我一样遇到无法获取权限的朋友们一点参考。
最佳答案