我从终端在 mysql
中创建了一个 users
表,我正在尝试创建一个简单的任务:从表单中插入值。这是我的 dbConfig 文件
<?php
$mysqli = new mysqli("localhost", "root", "pass", "testDB");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
?>
这是我的 Index.php
。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="description" content="$1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="style.css">
<title>test</title>
<?php
include_once 'dbConfig.php';
?>
</head>
<body>
<?php
if(isset($_POST['save'])){
$sql = "INSERT INTO users (username, password, email)
VALUES ('".$_POST["username"]."','".$_POST["password"]."','".$_POST["email"]."')";
}
?>
<form method="post">
<label id="first"> First name:</label><br/>
<input type="text" name="username"><br/>
<label id="first">Password</label><br/>
<input type="password" name="password"><br/>
<label id="first">Email</label><br/>
<input type="text" name="email"><br/>
<button type="submit" name="save">save</button>
<button type="submit" name="get">get</button>
</form>
</body>
</html>
点击我的保存按钮后,没有任何反应,数据库仍然是空的。我尝试了 echo'ing
INSERT
查询,它按照预期从表单中获取所有值。在我尝试从终端检查这是否有效后,我登录到我的 sql
尝试从用户表返回所有数据,但我得到空集。
最佳答案
以下代码只是声明了一个包含 MySQL 查询的字符串变量:
$sql = "INSERT INTO users (username, password, email)
VALUES ('".$_POST["username"]."','".$_POST["password"]."','".$_POST["email"]."')";
它不执行查询。为此,您需要使用一些函数,但让我先解释一下其他内容。
永远不要相信用户输入:永远不要附加用户输入(例如来自 $_GET
或 $_POST
的表单输入)直接到您的查询。有人可能会以这种方式小心地操纵输入,从而对您的数据库造成巨大损害。这就是所谓的 SQL 注入(inject)。您可以阅读更多相关信息 here
为了保护您的脚本免受此类攻击,您必须使用准备好的语句。更多关于准备好的陈述 here
像这样在您的代码中包含准备好的语句:
$sql = "INSERT INTO users (username, password, email)
VALUES (?,?,?)";
注意 ?
是如何用作值的占位符的。接下来,您应该使用 mysqli_prepare
准备语句:
$stmt = $mysqli->prepare($sql);
然后开始将输入变量绑定(bind)到准备好的语句:
$stmt->bind_param("sss", $_POST['username'], $_POST['email'], $_POST['password']);
最后执行准备好的语句。 (这是实际插入发生的地方)
$stmt->execute();
注意 虽然不是问题的一部分,但我强烈建议您永远不要以明文形式存储密码。相反,您应该使用 password_hash
来存储密码的哈希值
关于PHP:将表单中的值插入 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37367992/