我从终端创建了一个users表,mysql然后尝试创建简单的任务:从表单中插入值。这是我的dbConfig file
users
mysql
dbConfig file
<?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。
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尝试从users表返回所有数据的操作,但得到了空集。
echo'ing
INSERT
sql
以下代码仅声明了一个包含MySQL查询的字符串变量:
$sql = "INSERT INTO users (username, password, email) VALUES ('".$_POST["username"]."','".$_POST["password"]."','".$_POST["email"]."')";
它不执行查询。为此,您需要使用一些功能,但让我先解释一下其他内容。
永远不要信任用户输入 :永远不要将用户输入(例如来自$_GET或的表单输入$_POST) 直接 附加到查询中。有人可以以这种方式小心地操作输入,以免对您的数据库造成严重损害。这就是所谓的SQL注入。
$_GET
$_POST
为了保护您的脚本免受此类攻击,您 必须 使用预处理语句。在这里更多关于准备好的陈述
将准备好的语句包括在您的代码中,如下所示:
$sql = "INSERT INTO users (username, password, email) VALUES (?,?,?)";
请注意如何将?用作值的占位符。接下来,您应该使用mysqli_prepare以下语句准备语句:
?
mysqli_prepare
$stmt = mysqli_prepare($sql);
然后开始将输入变量绑定到准备好的语句:
$stmt->bind_param("sss", $_POST['username'], $_POST['email'], $_POST['password']);
最后执行准备好的语句。(这是实际插入的地方)
$stmt->execute();
注意 尽管不是问题的一部分,但我强烈建议您不要以明文形式存储密码。相反,您应该使用password_hash存储密码的哈希值
password_hash