我正在尝试从HTML表单和PHP网页中获取数据到mySQL数据库。它在两个页面上的连接都很好,但是当我尝试从表单提交时出现错误。如果我自己将其写入PHP并单击Submit,它将接收数据,但不会从表单中获取数据,因此那里肯定有问题,但我不知道是什么。我以前从未将PHP与mySQL一起使用,所以我不太确定它的工作方式。任何帮助,以解释其工作原理将不胜感激。
下面是我的表单所在的test.html.php页面和我尝试插入数据的testinsert.php页面。
(此外,courseID是“测试”表中的外键,因此我需要从选项中选择courseID,我为此感到困惑,而且我不知道这是否是问题所在。在当前代码位于下拉菜单中,显示的是CourseID,但每个选项之间都有一个空白选项,例如,选项列表为-“ 4”,“空白”,“ 5” ...等)>
<!DOCTYPE html>
<?php
include 'connect.php';
?>
<html lang="en">
<head>
<link rel="stylesheet" type="text/css" href="style.css" />
<meta name="viewport" content="width=1024, initial-scale=1.0, maximum-scale=1.0,user- scalable=no"/>
</head>
<title>Test Sign Up</title>
<body>
<header>
<h1>Test Sign Up</h1>
</header>
<div class="contactform">
<form action="testinsert.php" method ="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name" placeholder="Enter
your name here" required>
<label for="testsentence">Test Sentence:</label>
<input type="text" id="testsentence" name="testsentence" placeholder="Enter your sentence here" required>
<label for="course">Course:</label>
<select id="course" name="course">
<?php
$query = "SELECT CourseID FROM Course";
$result = mysqli_query($conn, $query);
while($row = mysqli_fetch_array($result)){
echo "<option>" . $row['CourseID'] . "<option>";
}
mysqli_close($conn);
?>
</select>
<button type="submit" name="submit">Submit</button>
</form>
</div>
<p></p>
<a href="courses.html.php">View Courses</a>
<p></p>
<a href="index.html">Return to home page</a>
</body>
</html>
Testinsert.php-
<?php
include 'connect.php';
$name = 'name';
$testsentence = 'testsentence';
$courseid = 'course';
$sql="INSERT INTO Test (Name, TestSentence, Course)
VALUES ('$name','$testsentence', '$courseid')";
if (mysqli_query($conn, $sql)) {
echo "<p></p>New record added successfully";
echo '<p></p><a href="index.html">Return to home page</a>';
} else {
echo "<p></p>Error adding record";
echo '<p></p><a href="index.html">Return to home page</a>';
}
mysql_close($conn);
?>
答案 0 :(得分:2)
每个选项带有期望值之后,您将获得空白选项,因为您没有写入关闭选项标签。 /
需要像这样被写入第二个选项标签:
while ($row = mysqli_fetch_array($result)) {
echo "<option>{$row['CourseID']}</option>";
}
即使未正确关闭选项标签,它们仍会呈现。在这种情况下,错误会通过生成所需标签的两倍来呈现。
我建议您将MYSQLI_ASSOC
用作mysqli_fetch_array
通话的第二个参数,或更方便的方法是:mysqli_fetch_assoc
实际上,由于$result
是可迭代的,因此您可以编写:
foreach ($result as $row) {
echo "<option>{$row['CourseID']}</option>";
}
关于使用extract($_POST)
...
我从未发现在我的一个脚本中使用extract
的充分理由。不止一次。此外,php手册中有特定的Warning说明:
警告 请勿对用户输入(例如$ _GET,$ _ FILES)之类的不受信任的数据使用extract()。
该页面上还有更多警告,但是您通过对用户提供的数据调用extract
来有效地将不安全因素纳入代码中。 永远不要这样做,没有理由这样做。
以下是一个不错的页面,其中介绍了如何访问提交的数据:PHP Pass variable to next page
具体地说,这是您访问预期的超全局数据的方式:
$name = $_POST['name'];
$testsentence = $_POST['testsentence'];
$courseid = $_POST['course'];
您绝不能将未经过滤,未经卫生处理的用户提供的数据直接写入mysql查询,这将导致查询不稳定(最好的情况下)和最糟糕的不安全情况。
您必须在INSERT查询中使用带占位符和绑定变量的预处理语句。有成千上万个有关如何在Stackoverflow上执行此过程的示例,请研究直到有意义为止-不要告诉自己自己会分层进行。
答案 1 :(得分:-2)
确保在您的PHP代码中添加了extract($_POST)
(或类似内容)!
您需要先从POST请求中提取参数,然后再使用它们,否则您的$name
,$testsentence
和$courseid
将不确定。