【发布时间】:2015-11-22 23:11:11
【问题描述】:
这似乎是正确的,但不知何故我想念它。
demo-form.php 文件中的表单
<form action="test.php" method="post" />
<p>Name: <input type="text" name="name" /></p>
<p>Email: <input type="text" name="email" /></p>
<input type="submit" value="Submit" />
</form>
test.php 文件中的代码
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "forms1";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "INSERT INTO per_Info (name, email)
VALUES ('Test', 'test@example.com')";
if ($conn->query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
问题:它将“Test”、“test@example.com”插入数据库(在“name”和“email”下)而不是我在表单中实际输入的任何名称,换句话说,如果我输入“John”和“John@test.com”在表单的 Name 字段中只会插入“Test”、“test@example.com”而不是“John”等。
【问题讨论】:
-
因为在您的 sql 中您将名称和电子邮件值设置为
test和test@example.com。 -
在您的代码中查看此查询,
$sql = "INSERT INTO per_Info (name, email) VALUES ('Test', 'test@example.com')";,这就是原因。 -
您需要从
$_POST['name'], $_POST['email']中提取值,而不是从$sql变量中的硬编码值。开始阅读有关PHP superglobals 的内容,以及有关使用How can I prevent SQL injection in PHP 保护表单输入免受SQL 注入攻击的内容。使用prepare()/bind_param()/execute()而不是query()很重要。 -
那是因为您在查询中硬编码了
Test和test@example.com,您的代码中也没有存储从 demo-form.php 发送到 test.php 的数据。大多数编程语言都不是头脑读者,因此它不会自动为您更改硬编码查询
标签: php mysql forms connection