首页 > 解决方案 > 如何在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
    {
        
    }
}

标签: phpmysqlsqlmysqli

解决方案


您需要检查有多少行受到影响,而不是查询是否成功执行。您还应该使用准备好的语句。

<?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 块中。


推荐阅读