php - 如何在php中获取sql执行的返回值
问题描述
我创建了以下代码来更新用户表单中的密码。但是当我尝试使用不正确的详细信息更新密码时,数据库不会更新而是返回成功消息
<?php
if (isset($_POST['create']))
{
$m_number = $_POST['user_mobile_number'];
$u_nic = $_POST['user_nic'];
$u_lname = $_POST['user_login_name'];
$u_password = $_POST['user_password'];
$sql = "UPDATE `user` SET `user_password` = '$u_password' WHERE `user_login_name` = '$u_lname' && `user_mobile_number` = '$m_number' && `user_nic` = '$u_nic'";
if (mysqli_query($db, $sql))
{
if ($sql)
{
?>
<script type="text/javascript">
Swal.fire(
'WooHoo!',
'Your password change successfully!',
'success'
).then((result) => {
if (result.value) {
window.location="login.php";
}
})
</script>
<?php
}
else
{
echo "Error";
}
}
else
{
}
}
解决方案
您需要检查有多少行受到影响,而不是查询是否成功执行。您还应该使用准备好的语句。
<?php
if (isset($_POST['create'])) {
$m_number = $_POST['user_mobile_number'];
$u_nic = $_POST['user_nic'];
$u_lname = $_POST['user_login_name'];
$u_password = $_POST['user_password'];
$sql = "UPDATE `user`
SET `user_password` = ?
WHERE `user_login_name` = ?
AND `user_mobile_number` = ?
AND `user_nic` = ?";
$stmt = $db->prepare($sql);
$stmt->bind_param("ssss", $u_password, $u_lname, $m_number, $u_nic);
$stmt->execute();
$affectedRows = $stmt->affected_rows;
$stmt->close();
if ($affectedRows) {
?>
<script type="text/javascript">
Swal.fire(
'WooHoo!',
'Your password change successfully!',
'success'
).then((result) => {
if (result.value) {
window.location = "login.php";
}
})
</script>
?>
} else {
echo "Error";
}
}
请记住,用户必须通过手机号码、登录名和昵称的精确匹配才能匹配标准。如果有人伪造请求,则可能会更改其他用户的密码 - 因此您应该考虑添加更多验证或 CSRF 令牌形式。
重要的
您将密码存储在 PLAIN TEXT 中,这是非常不安全且非常鲁莽的。您应该使用password_hash()
散列密码,并password_verify()
在尝试登录时使用。
还建议让 MySQLi 在失败时抛出异常,以便您可以捕获并记录这些异常 - 这可以让您在编写代码时更加精简;您不必检查每个单独的操作或查询,但您可以将它们全部包装在 try/catch 块中。
推荐阅读
- flutter - heightFactor 和 widthFactor 是如何工作的?
- php - 如何覆盖 woocommerce 自定义面板文件(包含在文件夹中)
- java - 如何在应用程序上下文之前评估 spring ApplicationArguments?
- wordpress - “阅读更多”和“提交”按钮的 Wordpress Polylang 翻译
- javascript - 在 php echo javascript 中使用 onclick
- email - 验证电子邮件地址的最佳方法
- javascript - Swift:WKWebview JavaScript 执行返回了不支持类型的结果
- kibana - 在kibana中获取绝对日期范围的值
- java - 如何使用 sharedpreference 将 favorite_List Activity 添加到 android 中的 ListView 活动
- javascript - Select2 未正确渲染