【问题标题】:How to get the return value for the sql execution in php如何在php中获取sql执行的返回值
【发布时间】:2021-01-28 14:54:04
【问题描述】:

我创建了以下代码来更新用户表单中的密码。 但是当我尝试使用不正确的详细信息更新密码时,数据库不会更新而是返回成功消息

<?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
    {
        
    }
}

【问题讨论】:

  • 您可能需要检查 UPDATE 语句是否确实影响了任何行。 $sql 变量无论如何都会为真,即使 UPDATE 语句影响 0 行。
  • 确保您已启用 mysqli 错误报告 How to get the error message in MySQLi?
  • 什么是“不正确的细节”以及它是怎么可能的?可能只是不要使用任何“不正确的细节”执行查询?

标签: php mysql sql mysqli


【解决方案1】:

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

<?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 令牌形式。

重要

您将密码存储在纯文本中,这是非常不安全且非常鲁莽的。您应该使用password_hash() 对您的密码进行哈希处理,并在尝试登录时使用password_verify()

还建议启用 MySQLi 在失败时抛出异常,以便您可以捕获并记录这些异常 - 这可以让您在编写代码时更加精简;您不必检查每个单独的操作或查询,但您可以将它们全部包装在 try/catch 块中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2021-12-08
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多