我最近在工作中继承了一个项目,我正在尝试在我的localhost上设置一个本地实例,这样我就可以使用它而不会影响实时网站。问题是一些ajax调用给了我响应错误。 id是用户标识,在工作实例中,它返回权限表中id与users表中的id匹配的任何行。这只是localhost上的一个问题。关于为什么会这样做的任何建议都表示赞赏。感谢。
$.ajax({
type: 'POST',
url: '../wwwroot/models/apm/CheckAdmin.php',
data: {
eid: id
},
dataType: 'json',
success: function (data) {
//console.log(data);
if (data[0].status == 2) {
ret = true;
$('#devTimeGrp').show();
$('#mngTab').show();
console.log("anAdmin............");
}
else {
ret = false;
$('#devTimeGrp').show();
$('#mngTab').hide();
console.log("notAdmin......");
//$('#mngTab').show();
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
}
});
<?php
include("../db-settings.php");
$eid = $_POST['eid'];
echo $eid;
$sql="call CheckAdmin('$eid')";
$result = $mysqli->prepare($sql);
$result->execute();
$result->bind_result($col1, $col2, $col3);
while($result->fetch()){
$out[] = array( 'id' => $col1,
'user' => $col2,
'status' => $col3);
}
echo json_encode($out);
$result->close();
?>
CREATE DEFINER=`myDB`@`%` PROCEDURE `CheckAdmin`(IN p_eid CHAR(36))
BEGIN
SELECT * FROM user_permission WHERE (SELECT id FROM users WHERE uid = p_eid) = user_id;
END
Warning: mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statement
答案 0 :(得分:1)
更改程序,使其仅返回您要绑定的3列。此外,我建议使用JOIN
而不是子查询,因为MySQL在优化语法方面非常差。
SELECT p.id, p.user, p.status
FROM user_permissions AS p
JOIN users AS u ON u.id = p.user_id
WHERE u.uid = p_eid\
如果您无法更改过程,则需要更改PHP,以便它绑定与user_permissions
表中的列数一样多的变量。
为避免SQL注入问题,请在进行查询时使用bind_param
:
$sql = "CALL CheckAdmin(?)";
$result = $mysqli->prepare($sql);
$result->bind_param("s", $eid);
$result->execute();
答案 1 :(得分:0)
SELECT id,user,status FROM user_permission
而不是SELECT *
如果第一个不能正常工作
var_dump($col1);
var_dump($col2);
var_dump($col3);
也许变量是数组。