【问题标题】:MySQL Insert query returning falseMySQL插入查询返回false
【发布时间】:2017-03-03 15:33:04
【问题描述】:

这可能是这里被问到最多的问题。我制作了一个简单的用户注册表单。这些值不会插入到数据库中。我使用了 echo 并且查询返回 false。该表格之前运行良好,但后来我将名称分为名字和姓氏,并删除了以前的表格并制作了一个新表格。这是注册页面代码:

    <!DOCTYPE html>
    <?php 
        session_start();
        include('includes/connect.php');
    ?>

<html>
<head>
    <?php
        if(isset($_POST['register_ok'])){
                global $con;

                $user_first_name = $_POST['user_first_name'];
                $user_last_name = $_POST['user_last_name'];
                $email = $_POST['email'];
                $password = $_POST['password'];
                echo "<script type='text/javascript'>alert(\"$user_first_name\");</script>"; //This echo is returning username successfully!

                $query = "insert into user(user_first_name, user_last_name, user_email, password) values('$user_first_name', '$user_last_name', '$email', '$password')";

                if(mysqli_query($con, $query)){
                        $_SESSION['user'] = 'user';
                        $_SESSION['user_first_name'] = $user_first_name;
                        echo "header('Location:index.php')";

                } else {
                    echo "<script type='text/javascript'>alert(\"Values not inserted\");</script>"; //This is running which means query is not successfull.
                }
        } else {
            echo "<script type='text/javascript'>alert(\"Page didn't receive post values\");</script>";
        }
    ?>

    <link rel="stylesheet" type="text/css" href="styles/register_style.css">

    <title>New User Registration</title>
</head>
<body>
    <div class="wrapper">
        <header></header>
        <div class="form_div">
            <div class="form">
                <form id="register_form" method="post" action="" autocomplete="autocomplete">
                    <table>
                        <tr>
                            <td id="label">First Name: </td>
                            <td id="input"><input type="text" name="user_first_name" required="required" id="input_box"></td>
                        </tr>
                        <tr>
                            <td id="label">Last Name: </td>
                            <td id="input"><input type="text" name="user_last_name" required="required" id="input_box"></td>
                        </tr>
                        <tr>
                            <td id="label">Email: </td>
                            <td id="input"><input type="text" name="email" required="required" id="input_box"></td>
                        </tr>
                        <tr>
                            <td id="label">Password: </td>
                            <td id="input"><input type="password" name="password" id="input_box"></td>
                        </tr>
                        <tr>
                            <td id="label">Confirm Password: </td>
                            <td id="input"><input type="password" name="confirm_password" id="input_box"></td>
                        </tr>
                        <tr id="button_row">
                            <td colspan="2"><input type="reset" value="Reset" id="button">
                            <input type="submit" value="Register" id="button" name="register_ok"></td>
                        </tr>
                    </table>
                </form>
            </div>
        </div>
    </div>
</body>
</html>

这是桌子: 该表为空,第一个警报返回用户名,第二个警报在查询返回 false 时运行。它返回错误。 我认为这可能是一个错字,但不能缩小范围。欢迎任何帮助。

【问题讨论】:

  • 会议有什么用?
  • 在你的 else 语句中添加 echo("Errormessage: %s\n", mysqli_error()); 看看出了什么问题。
  • 会话用于存储登录用户的信息。
  • 你没有登录用户这里你注册用户
  • 检查mysqli_error()你的代码是否对SQL注入开放

标签: php html mysql sql


【解决方案1】:

在我的情况下,严格模式设置导致了问题。它需要在 INSERT 命令中指定所有列的值。禁用严格模式设置后一切正常。

检查严格模式(这应该是空白):

SHOW VARIABLES LIKE 'sql_mode';

关闭严格模式:

SET GLOBAL sql_mode = '';

开启严格模式:

SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES';

信用:this post

【讨论】:

    【解决方案2】:

    首先,

    使用此查询将列名从 INT 更改为 VARCHAR

    "ALTER TABLE `user`
          MODIFY COLUMN `user_first_name` VARCHAR(225),
          MODIFY COLUMN `user_last_name` VARCHAR(225),
          MODIFY COLUMN `user_email` VARCHAR(225),
          MODIFY COLUMN `password` VARCHAR(225);";
    

    其次,

    您将idinput&lt;td&gt; 在每一行中都保持不变。 ID 不能相同。

    改成。

    <table>
          <tr>
              <td id="label1">First Name: </td>
              <td id="input1"><input type="text" name="user_first_name" required="required" id="input_box1"></td>
          </tr>
          <tr>
              <td id="label2">Last Name: </td>
              <td id="input2"><input type="text" name="user_last_name" required="required" id="input_box2"></td>
          </tr>
          <tr>
              <td id="label3">Email: </td>
              <td id="input3"><input type="text" name="email" required="required" id="input_box3"></td>
          </tr>
          <tr>
              <td id="label4">Password: </td>
              <td id="input4"><input type="password" name="password" id="input_box4"></td>
          </tr>
          <tr>
              <td id="label5">Confirm Password: </td>
              <td id="input5"><input type="password" name="confirm_password" id="input_box5"></td>
          </tr>
          <tr id="button_row">
              <td colspan="2"><input type="reset" value="Reset" id="button">
              <input type="submit" value="Register" id="button" name="register_ok"></td>
          </tr>
      </table>
    

    【讨论】:

      【解决方案3】:

      您需要了解 sql 注入以及如何保护您的密码,使用 mysqli 准备好的语句 / PDO 任何您觉得容易学习的东西

       <!DOCTYPE html>
          <?php 
              session_start();
              include('includes/connect.php');
          ?>
      
      <html>
      <head>
          <?php
              if(isset($_POST['register_ok'])){
      
                      $user_first_name = $_POST['user_first_name'];
                      $user_last_name = $_POST['user_last_name'];
                      $email = $_POST['email'];
                      $password = $_POST['password'];
      
                      // Lets encrypt the password;
      
                      $hash = pasword_hash($password,PASSWORD_DEFAULT);
      
      
                      // lets insert then
      
                      $query = $con->prepare("INSERT INTO user (user_id,user_first_name, user_last_name, user_email, password) VALUES(?,?,?,?)");
                      $query->bind_param("ssss", $user_first_name, $user_last_name, $email,$hash);
                      $query->execute();
      
                     if ($query->execute()) { 
      
                          echo "<script type='text/javascript'>alert(\"$user_first_name\");</script>"; //This echo is returning username successfully!
                      } else {
                          echo "<script type='text/javascript'>alert(\"Values not inserted\");</script>"; //This is running which means query is not successfull.
                      } 
      
      
      
      
              }
      
          ?>
      
          <link rel="stylesheet" type="text/css" href="styles/register_style.css">
      
          <title>New User Registration</title>
      </head>
      <body>
          <div class="wrapper">
              <header></header>
              <div class="form_div">
                  <div class="form">
                      <form id="register_form" method="post" action="" autocomplete="autocomplete">
                          <table>
                              <tr>
                                  <td id="label">First Name: </td>
                                  <td id="input"><input type="text" name="user_first_name" required="required" id="input_box"></td>
                              </tr>
                              <tr>
                                  <td id="label">Last Name: </td>
                                  <td id="input"><input type="text" name="user_last_name" required="required" id="input_box"></td>
                              </tr>
                              <tr>
                                  <td id="label">Email: </td>
                                  <td id="input"><input type="text" name="email" required="required" id="input_box"></td>
                              </tr>
                              <tr>
                                  <td id="label">Password: </td>
                                  <td id="input"><input type="password" name="password" id="input_box"></td>
                              </tr>
                              <tr>
                                  <td id="label">Confirm Password: </td>
                                  <td id="input"><input type="password" name="confirm_password" id="input_box"></td>
                              </tr>
                              <tr id="button_row">
                                  <td colspan="2"><input type="reset" value="Reset" id="button">
                                  <input type="submit" value="Register" id="button" name="register_ok"></td>
                              </tr>
                          </table>
                      </form>
                  </div>
              </div>
          </div>
      </body>
      </html>
      

      注意:您需要在插入之前检查用户名是否不存在。

      【讨论】:

        【解决方案4】:

        将列类型从 int 更改为 varchar。我说的是字符串列(名称和电子邮件)。 Mysql 有一个选项可以检查您尝试插入的数据类型,如果不匹配则失败。

        【讨论】:

        • 谢谢。就是这样。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-21
        • 1970-01-01
        相关资源
        最近更新 更多