Php 使用准备好的语句检查用户覆盖凭据、用户覆盖权限和删除MySQL表记录
我正在尝试构建一个覆盖特性,以便用户可以在拥有正确权限的情况下手动删除MySQL表行。系统将提示用户输入用于程序登录的相同凭据以及需要删除的行的唯一ID。点击“Submit”函数后,我运行了一系列if语句/MySQL SELECT语句来检查凭证、用户权限,最后是行删除,结果输出作为警报 但是,我的警报显示为空白,并且该行未被删除,因此我知道我的if语句存在问题。经过测试,我认为问题在于我试图使用前一个查询的结果来运行下一个if语句逻辑 如何正确确定MySQL查询是否使用预处理语句返回了一行 感谢您的帮助!谢谢大家! 我的代码:Php 使用准备好的语句检查用户覆盖凭据、用户覆盖权限和删除MySQL表记录,php,mysql,prepared-statement,Php,Mysql,Prepared Statement,我正在尝试构建一个覆盖特性,以便用户可以在拥有正确权限的情况下手动删除MySQL表行。系统将提示用户输入用于程序登录的相同凭据以及需要删除的行的唯一ID。点击“Submit”函数后,我运行了一系列if语句/MySQL SELECT语句来检查凭证、用户权限,最后是行删除,结果输出作为警报 但是,我的警报显示为空白,并且该行未被删除,因此我知道我的if语句存在问题。经过测试,我认为问题在于我试图使用前一个查询的结果来运行下一个if语句逻辑 如何正确确定MySQL查询是否使用预处理语句返回了一行 感谢
if ((isset($_POST['overrideUsername'])) and (isset($_POST['overridePassword'])) and (isset($_POST['overrideUniqueID']))) {
$overridePasswordInput = $_POST['overridePassword'];
$overrideUsername = $_POST['overrideUsername'];
$overridePassword = ENCODE(($overridePasswordInput).(ENCRYPTION_SEED));
$roleID = '154';
$overrideUniqueID = $_POST['overrideUniqueID'];
//connect to the database
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if(mysqli_connect_errno() ) {
printf('Could not connect: ' . mysqli_connect_error());
exit();
}
$conn->select_db($dbname);
if(! $conn->select_db($dbname) ) {
echo 'Could not select database. '.'<BR>';
}
$sql1 = "SELECT users.id FROM users WHERE (users.login = ?) AND (users.password = ?)";
$stmt1 = $conn->prepare($sql1);
$stmt1->bind_param('ss', $overrideUsername, $overridePassword);
$stmt1->execute();
$stmt1->bind_result($userID);
//$result1 = $stmt1->get_result();
if ($stmt1->fetch()) {
$sql2 = "SELECT * FROM rolestousers WHERE (rolestousers.userid = ?) AND (rolestousers.roleid = ?)";
$stmt2 = $conn->prepare($sql2);
$stmt2->bind_param('ss', $userID, $roleID);
$stmt2->execute();
$stmt2->store_result();
if ($stmt2->fetch()) {
$sql3 = "DELETE * FROM locator_time_track_out WHERE locator_time_track_out.uniqueid = ?";
$stmt3 = $conn->prepare($sql2);
$stmt3->bind_param('s', $overrideUniqueID);
$stmt3->execute();
$stmt3->store_result();
if ($stmt3->fetch()) {
echo 'Override Successful! Please scan the unit again to close it out.';
} else {
echo 'Could Not Delete Record from the table.';
}//End $sql3 if.
} else {
echo 'User does not have override permission. Please contact the IT Department.';
}//End $sql2 if.
} else {
echo 'Your login information is incorrect. Please try again. If the issue persists, contact the IT Department.';
}//End $sql1 if.
//Free the result variable.
$stmt1->free();
$stmt2->free();
$stmt3->free();
$stmt1->close();
//Close the Database connection.
$conn->close();
}//End If statement
所以我的问题是,我需要正确地比较密码和加密种子信息。但是,前面的程序员使用以下行执行相同的过程(这显然是不安全的):
我需要先解决这个问题,然后才能使用准备好的语句测试if逻辑的功能。您为delete查询传递了错误的变量
$stmt3 = $conn->prepare($sql3);
请参考[]是否检查了错误日志?是,我在日志中没有发现任何错误,在检查过程中检查页面时也没有收到任何错误。如果您进行检查,则可能会发现您无法将
bind_result
与*SELECT语句一起使用,但仅当您出于测试目的传递列的特定名称时,我注释掉了所有嵌套的if语句,并执行了以下测试语句:“从用户中选择users.id(users.login='[myfirstname.mylastname]'”;
(我使用了我知道存在的登录名)我仍然无法获得结果警报。感谢您捕捉到这一点,因为一旦实际到达代码的这一部分,这将导致问题。但是,我仍然有相同的问题。我的警报不应该为空,因为if语句逻辑应该显示成功或失败的响应。这就好像程序无法读取“if”($stmt1->fetch()){…}。您正在使用$stmt3=$conn->prepare($sql2);
使用上述代码执行删除查询//使用exec()
或rowCount()
,因为delete不返回任何值。因为fetch()
不会用于删除。因此它会跳过if语句。我也加入了该语句,但我的代码仍然无法到达该if语句。它仍然卡在第一个if语句上。在if语句之前打印$\u POST
。检查值是否存在
$querystatement = "SELECT id, firstname, lastname, email, phone, department, employeenumber, admin, usertype FROM users WHERE login=\"".mysql_real_escape_string($user)."\" AND password=ENCODE(\"".mysql_real_escape_string($pass)."\",\"".mysql_real_escape_string(ENCRYPTION_SEED)."\")";
$queryresult = $this->db->query($querystatement);
$stmt3 = $conn->prepare($sql3);