繁体   English   中英

为什么这个 PHP MySQL 注册表单不起作用?

[英]Why doesn't this PHP MySQL registration form work?

所以我写了一个非常基本的 PHP 注册表单,链接到一个 HTML 文件; 这是PHP中的代码:

 <?php
if( $_POST )
{
$con = mysql_connect("localhost","KyleHulse","(my password)", "csdb1082");

if (!$con)
{
    die('Could not connect: ' . mysql_error());
}

mysql_select_db("csdb1082", $Users);


$insert_query = "insert into feedback(
                user,
                password,
                email
                    ) 
                    values (
            '".$_POST['user']."',
            '".$_POST['password']."',
            '".$_POST['email']."')";

mysql_query($insert_query);

echo "<h2>Thanks for registering.</h2>";

mysql_close($con);
}
?>

这是相应的 HTML 代码:

  <head>
<meta charset="UTF-8">
<title>Registration</title>
</head>
<body>
<form action="register.php" method="post">
    <p>
        <label for="user">Username</label>
        <input type="text" name="user" id="user">
    </p>
    <p>
        <label for="password">Password:</label>
        <input type="text" name="password" id="password">
    </p>
    <p>
        <label for="email">Email:</label>
        <input type="text" name="email" id="email">
    </p>
    <input type="submit" value="Submit">
</form>
</body>

烦人的事情是我早些时候让它工作了,我改变的东西导致它坏了。

mysql_slect_db() - 使用$con而不是$Users ($Users 甚至未定义);

并使用mysqli ,不推荐使用和不安全的mysql函数:)

下面是使用 Prepared Statement 修改后的代码。

第一步是连接到数据库。 为此,我们需要定义访问详细信息。

// Define Database Credentials
$servername = "localhost"; //Server Name
$username = "KyleHulse"; //Username to the DB
$password = "(my password)"; //Password to the DB
$dbname = "csdb1082"; //Name of the Database

// Create Database Connection
$conn = new mysqli($servername, $username, $password, $dbname);

现在检查连接。

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

在此之后,您运行您的查询。 请注意,由于这是您的个人项目,因此我使用SHA1作为您密码的散列。 对于更大的项目,我建议进一步研究如何保护您的密码。

要运行查询,首先是准备它。 这就是你的做法。

$stmt = $conn->prepare("INSERT INTO feedback (user, password, email) VALUES (?, ?, ?)");

在这里,您将语句存储在$stmt变量中。 该查询具有INSERT INTO后跟表的名称。 在您的情况下,它是feedback

在此之后,您填写要保存在第一个括号中的表格字段。 在您的情况下,它将是(user, password, email)后跟VALUES

在此之后,您使用(?, ?, ?)为实际值添加占位符。 请注意总计数? 必须与前一个括号中的字段总数相匹配。

现在你必须将变量绑定到这些? . 这是由,

$stmt->bind_param("sss", $user, $password, $email);

请注意, "sss"是传递的值的格式。 以下是格式。

i - integer
d - double
s - string
b - BLOB

因此,您需要传递 3 个值,因此您有 3 个s ,然后是变量,您将在其中存储 HTML 表单中的值,

$user = $_POST["user"];
$password = sha1($_POST["password"]); //simplest way to use SHA1 hash.
$email = $_POST["email"];

现在你只需要执行准备好的语句。

$stmt->execute();

而已!

下面是完整的代码。

// Define Database Credentials
$servername = "localhost"; //Server Name
$username = "KyleHulse"; //Username to the DB
$password = "(my password)"; //Password to the DB
$dbname = "csdb1082"; //Name of the Database

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$stmt = $conn->prepare("INSERT INTO feedback (user, password, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $user, $password, $email);

$user = $_POST["user"];
$password = sha1($_POST["password"]); //simplest way to use SHA1 hash.
$email = $_POST["email"];

$stmt->execute();

希望这会有所帮助。

我知道这是你的个人项目,但如果你以正确的方式做事会很好。 代码中有很多需要改进的地方,但让我们跳到您真正需要的地方,还要确保在开发阶段的 php.ini 中启用了 php 错误报告。

// Create connection
$conn = new mysqli("localhost","KyleHulse","(your password)", "csdb1082");

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "INSERT INTO feedback(user,password,email) VALUES(
            '".$_POST['user']."',
            '".$_POST['password']."',
            '".$_POST['email']."'
        )";

if($conn->query($sql) === TRUE) 
{
    echo "<h2>Thanks for registering.</h2>";
} 
else 
{
    echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM