【问题标题】:My php code wont add users to the MySQL database我的 php 代码不会将用户添加到 MySQL 数据库
【发布时间】:2019-09-18 04:26:56
【问题描述】:

我正在尝试使用 php 创建即时消息服务,我能够启动并运行网站以将用户注册到 MySQL 数据库,但对于我来说,我无法理解为什么它不会添加用户

我已经在 phpMyAdmin 中为用户制作了表格,也重新制作了它们以防万一我搞砸了但没有任何效果

这是我注册新用户的主要网页

<!doctype html>
<html>

<head>
<style>
*{margin:0px; padding:0px;}
#main{ width:200px; margin:24px auto; }
</style>
</head>

<body>
<?Php

        require_once("connection.php") ;
    if(isset($_POST['Register'])){
        $first_name = $_POST['first_name'] ;
        $last_name = $_POST['last_name'] ;
        $user_name = $_POST['user_name'] ;
        $password = $_POST['password'] ;
    if ($first_name !="" and $last_name !="" and $user_name !="" and $password !=""  ){

    $q="INSERT INTO `user` ('id','first_name','last_name','user_name', 'password')
        VALUES('', '".$first_name."', '".$last_name."', '".$user_name."', '".$password."') 
        " ;
        if(mysqli_query($con, $q )){
        header("location:login.php") ; 
        }else{
        echo $q ;
        }

    }else{
        echo "please fill in all the boxes" ;

    }

    }


?>



<div id="main">
<h2 align="center">Registration</h2>
<form method="post">
First Name:<br>
<input type="text" name="first_name" placeholder="First Name" />
<br><br>
Last Name:<br>
<input type="text" name="last_name" placeholder="Last Name" /><br><br>
User Name:<br>
<input type="text" name="user_name" placeholder="User Name" /><br><br>
Password:<br>
<input type="password" name="password" placeholder="Password" /><br><br>
<input type="submit" name"register" value="Register" />


</form>
</div>


</body>

</html>

引用的是connection.php,即:

<?php

$con =  mysqli_connect("localhost","pmauser","root","chat application") ;

?>

输入所有文本并单击注册后,表单会清除但没有弹出消息,之后我去 phpMyAdmin 并检查用户并显示为空,应该发生的是它需要所有文本框中的信息并将它们添加到数据库中。

【问题讨论】:

  • 您是否进行过任何调试以试图缩小可能出错的地方?
  • PhpMyAdmin 不是数据库。这是一个用于管理 MySQL 数据库的 php 工具,例如 MySQL Workbench。
  • 在 SQL 查询中允许使用来自客户端的原始输入是一种不好的做法。这会使您的网站遭受 SQL 注入攻击。考虑使用 PHP PDO 来清理 SQL 输入。
  • 停止存储明文密码。使用密码哈希。你对 SQL 注入很开放,你应该使用参数化语句。
  • Patrick Q 我尝试制作不同的文件来尝试做同样的事情,但都失败了。

标签: php html mysql linux apache


【解决方案1】:

name"register" 更改为name"Register"

因为你的支票是这样的

if(isset($_POST['Register'])){

将其设置为(如果您不想更改 html)

 if(isset($_POST['register'])){

您传递参数的方式会导致SQL 注入。请阅读here

【讨论】:

  • 问题在于提交输入类型中的值定义了按钮上的文本,并且实际上并没有以这样的形式提交(与输入框中的其他值一样)。
  • 这与@JimGrant 的价值无关,而与名称有关。这里的答案是正确的,但忽略了你的帖子中关于 SQ 注入、密码哈希等的所有内容。
【解决方案2】:

我注意到你给寄存器的输入框赋值了,因为输入框是提交类型,所以值只是为了显示的目的,并没有在表单中提交。我已经包含了一个隐藏的输入框来代替它。

重构您的代码并对其进行修改以防止 SQL 注入攻击,您将获得以下结果:

HTML 文档

<!doctype html>
<html>

    <head>
        <style>
            *{margin:0px; padding:0px;}
            #main{ width:200px; margin:24px auto; }
        </style>
    </head>

<body>

    <?php
        require_once("connection.php");

        if($_POST['register'] == 'Register')
        {
            $first_name = $_POST['first_name'];
            $last_name = $_POST['last_name'];
            $user_name = $_POST['user_name'];
            $password = password_hash($_POST['password'], PASSWORD_DEFAULT);

            if( ($first_name <> "") && ($last_name <> "") && ($user_name <> "") && ($password <> "")  )
            {
                $sql = "INSERT INTO `user` ('id', 'first_name', 'last_name', 'user_name', 'password') VALUES('', ?, ?, ?, ?);";
                if( $pdo->prepare($sql)->execute([$first_name, $last_name, $user_name, $password]) )
                    header("location:login.php"); 
                else
                    echo $sql->debugDumpParams();;
            }
            else
                echo "please fill in all the boxes";
        }
    ?>

    <div id="main">
        <h2 align="center">Registration</h2>

        <form method="post">
            First Name:<br>
            <input type="text" id="first_name" name="first_name" placeholder="First Name" />
            <br><br>
            Last Name:<br>
            <input type="text" id="last_name" name="last_name" placeholder="Last Name" /><br><br>
            User Name:<br>
            <input type="text" id="user_name" name="user_name" placeholder="User Name" /><br><br>
            Password:<br>
            <input type="password" id="password" name="password" placeholder="Password" /><br><br>
            <input type="hidden" id="register" name"register" value="Register" />
            <input type="submit" value="Register" />
        </form>
    </div>

</body>

</html>

连接 PHP 文件。

$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

【讨论】:

  • 我已经完成了您列出的所有更改,但仍然无法正常工作。再次感谢您的帮助。
  • 在我看到这个之前你真的做得很好:if($_POST['register'] == 'Register')
  • 隐藏的输入元素名为register,值为Register,与原OP不同。
【解决方案3】:

我怀疑 USER 信息数据没有存储在您的数据库中,因为 AUTOCOMMIT 已关闭。要验证这一点,请运行: 选择@@自动提交; 在插入之前。如果结果为 0,则 AUTOCOMMIT 确实已关闭。如果它关闭,除非您在 INSERT 后发出 COMMIT,否则您的 INSERT 将不会被保存。或者,打开 AUTOCOMMIT(对于会话或整个数据库),即 SET 自动提交 = 1;

【讨论】:

  • 请详细说明。
  • 当输入名称命名为register 时,OP 正在测试isset($_POST['Register']。除此之外,代码非常不安全。
【解决方案4】:

以下内容非常适合我。我改变了一些东西,但它有效:)。

require_once("connection.php") ;
if(isset($_POST['register']))
{
        $first_name = $_POST['first_name'] ;
        $last_name = $_POST['last_name'] ;
        $user_name = $_POST['user_name'] ;
        $password = $_POST['password'] ;
    if (!empty($first_name) and !empty($last_name) and !empty($user_name) and !empty($password))
    {
                $q="INSERT INTO `user` (id,first_name,last_name,user_name, password) VALUES ('', '$first_name', '$last_name', '$user_name', '$password')";
                if(mysqli_query($con, $q )){
                        header("location:login.php");
                }else{ echo "ERROR: Could not execute $q. " . mysqli_error($con);}
     }
}
?>

<div id="main">
<h2 align="center">Registration</h2>
<form method="post">
First Name:<br>
<input type="text" name="first_name" placeholder="First Name" />
<br><br>
Last Name:<br>
<input type="text" name="last_name" placeholder="Last Name" /><br><br>
User Name:<br>
<input type="text" name="user_name" placeholder="User Name" /><br><br>
Password:<br>
<input type="password" name="password" placeholder="Password" /><br><br>
<input type="submit" name="register" value="Register" />

</form>
</div>
</body>
</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多