【问题标题】:Can't get form data to be submitted to database无法获取要提交到数据库的表单数据
【发布时间】:2017-11-01 05:11:22
【问题描述】:

尝试将表单数据发送到数据库,似乎正在这样做,但后来我检查了数据库,但什么也没有出现。有人可以告诉我哪里出错了吗?除了添加我自己的变量之外,我几乎完全按照 Youtube 教程进行操作,所以不太确定我哪里出错了。

HTML

<!doctype html>
<html>
<head>
    <title>Registration Page</title>
    <link rel="stylesheet" href="http://localhost/loginreg/css/styles.css" />
</head>
<body>
    <div id="wrapper">
    <div id="formDiv">
    <form method="POST" action="registration/connect.php">
    <label>First Name:</label><br>
    <input type="text" name="fname" /> <br/><br/>
    <label>Last Name:</label><br>
    <input type="text" name="lname" /> <br/><br/>
    <label>Email:</label><br>
    <input type="text" name="email" /> <br/><br/>
    <label>Password:</label><br>
    <input type="password" name="password" /> <br/><br/>
    <label>Confirm Password:</label><br>
    <input type="password" name="cpassword" /> <br/><br/>
    <input type="submit" name="submit" /> 
    </form>
    </div>
    </div>
</body>
</html>

PHP

<?php  

    $con = mysqli_connect("127.0.0.1","root","");
    if(!$con)
    {
        echo 'Not conneced to server';
    }

    if(!mysqli_select_db($con,'registration'))
    {
        echo 'Database not selected';
    }

        $firstName = $_POST['fname'];
        $lastName = $_POST['lname'];
        $email = $_POST['email'];
        $password = $_POST['password'];




    $sql = "INSERT INTO users (firstName,lastName,email,password) VALUES ('$firstName','$lastName','$email','$password')";



    header("refresh:2; url=http://localhost/loginreg/index.html");
?>

【问题讨论】:

  • $sql 只是一个变量。您需要使用 mysqli 函数来发送它。这也会让你接触到 SQL 注入。你应该参数化它。也请不要存储纯文本密码。 php.net/manual/en/function.password-hash.php 我也建议不要使用 youtube 教程(如果这是它给你的,那么它缺少很多最佳实践)
  • 就像您对这个问题的最后一次尝试一样,没有将值实际插入数据库的代码。这次你至少有一条 SQL 语句,但仍然没有代码实际执行该语句以将值插入数据库。
  • 警告:编写自己的访问控制层并不容易,而且有很多机会会严重错误。当任何现代development framework(如Laravel)带有强大的authentication system 内置时,请不要编写自己的身份验证系统。至少遵循recommended security best practices 并且永远不要将密码存储为纯文本
  • 警告:使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug切勿$_POST$_GET任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 注意:mysqli 的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query 接口混淆。在您对程序风格投入过多之前,值得转换一下。示例:$db = new mysqli(…)$db-&gt;prepare("…") 程序接口是 PHP 4 时代引入的mysqli API 的产物,不应在新代码中使用。

标签: php html mysql


【解决方案1】:

在你的 $sql 变量之后,添加如下内容:

if ($conn->query($sql) === TRUE) { echo 'success'; }

就像 Chris85 所说,这并不完全安全,并且会让您面临 SQL 注入。

【讨论】:

  • 在正确的轨道上,这有一个不幸的缺点,就是将查询武器化。这实际上是从根本上破坏了代码的绷带。
  • OP 使用程序,这是用于 oop
  • @nogad 两者可以一起工作。不推荐,但确实有效。
猜你喜欢
  • 2019-01-19
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2018-07-23
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
相关资源
最近更新 更多