我正在尝试编写代码,允许用户向我的数据库添加免费的公共厕所。这需要将数据添加到数据库中的3个单独的表中:区,位置和房间。我正在使用insert_id将查询链接到每个父/子表。
现在编写我的代码,该表单仅重新加载到页面上,而没有添加任何内容到数据库中。是因为我的某些表单输入类型是一个下拉选择菜单和几个复选框(其中一个是数组)引起的问题吗?这是我第一学期学习php和MySQL,因此,我希望提供有用的指针或其他答案。谢谢!
我已经在此站点上查看了多个答案,但是还没有找到包含我所有输入类型的表格。
#Add a toilet to the database
if (isset($_POST['submit'])) { //check if the form has been submitted
if ((empty($_POST['name'])) || (empty($_POST['location'])) || (empty($_POST['hours'])) || (empty($_POST['boro_id'])) ||
(empty($_POST['boro_name'])) || (empty($_POST['gender'])) || (empty($_POST['handicap_access'])) ||
(empty($_POST['change_table'])) || (empty($_POST['stalls'])) ) {
$message = '<p class="error">Please fill out all of the form fields!</p>';
} else {
$conn = new mysqli($hn, $un, $pw, $db);
if ($conn->connect_error) die($conn->connect_error);
$name = sanitizeMySQL($conn, $_POST['name']);
$location = sanitizeMySQL($conn, $_POST['location']);
$hours = sanitizeMySQL($conn, $_POST['hours']);
$boro_id = sanitizeMySQL($conn, $_POST['boro_id']);
$boro_name = sanitizeMySQL($conn, $_POST['boro_name']);
$gender = sanitizeMySQL($conn, $_POST['gender']);
$h_a = sanitizeMySQL($conn, $_POST['handicap_access']);
$c_t = sanitizeMySQL($conn, $_POST['change_table']);
$stalls = sanitizeMySQL($conn, $_POST['stalls']);
$query = 'INSERT INTO `borough` VALUES(NULL, \"$boro_name\")';
$result = $conn->query($query);
$insertID = $conn->insert_id;
$query = 'INSERT INTO `location` VALUES(NULL, \"$name\", \"$location\", \"$hours\", NULL, \"$insertID\" )';
$result = $conn->query($query);
$insertID = $conn->insert_id;
$query = 'INSERT INTO `rooms` VALUES(NULL, \"$insertID\", \"$gender\", \"$h_a\", \"$c_t\", \"$stalls\" )';
$result = $conn->query($query);
if (!$result) {
die ("Database access failed: " . $conn->error);
} else {
$message = "<p class=\"message\">Successfully added new toilet! <a href=\"index.php\">Return to home</a></p>";
}
}
}
if (isset($message)) echo $message;
function sanitizeString($var)
{
$var = stripslashes($var);
$var = strip_tags($var);
$var = htmlentities($var);
return $var;
}
function sanitizeMySQL($connection, $var)
{
$var = sanitizeString($var);
$var = $connection->real_escape_string($var);
return $var;
}
?>
<h1>Add a public toilet</h1>
<div class="form">
<form method="POST" action="">
Borough<br>
<select name="boro_name" size="1">
<option value="Bronx">Bronx</option>
<option value="Brooklyn">Brooklyn</option>
<option value="Manhattan">Manhattan</option>
<option value="Queens">Queens</option>
<option value="Staten Island">Staten Island</option>
</select><br><br>
<div>Name <input type="text" name="name"></div><br>
<div>Location <input type="text" name="location"></div><br>
<div>Hours <input type="text" name="hours"></div><br>
Gender<br>
<input type="checkbox" name="gender[]" value="men">Men<br>
<input type="checkbox" name="gender[]" value="women">Women<br>
<input type="checkbox" name="gender[]" value="neutral">Neutral<br><br>
Handicap Accessible
<input type="checkbox" name="handicap_access"><br><br>
Changing Tables
<input type="checkbox" name="change_table"><br><br>
<div>Number of Stalls <input type="text" name="stalls"></div><br><br>
<input type="submit" name="submit" value="Submit">
</form>
</div>
我希望表单能够提交到我的数据库,并告诉用户他们成功了。
答案 0 :(得分:1)
您对这么多输入类型的担忧是很公平的,但是您会发现它们看上去都与后端非常相似。您需要做的就是查看数据的状态以及if / then逻辑。
我将教您如何自己调试代码,而不仅仅是调试某人可能愿意做的代码。因为,老实说,使用正确的指针对您来说应该很容易。
首先,您知道自己有一个表格和应该处理的东西。您不知道数据是什么样的。
此小片段将使您可以查看正在发送的数据。出于天生的考虑,请不要在启用网站时将此代码保留在其中。
echo '<pre>';
print_r($_POST);
echo '</pre>';
如果有什么不符合您的期望,那么您将知道如何进行更改。这应该可以减轻您对输入类型等的任何担忧。但是,如果您发现一些奇怪的问题,则可以对此做一些事情。
您还可以通过添加“观察者”来遵循代码。临时多余的行向您显示事物发生的顺序。
例如:
if (isset($_POST['submit'])) { //check if the form has been submitted
echo "1. Post contains submit";
// ...
echo "2.a. Something was empty ";
} else {
echo "2.b. Form was good ";
这将向您展示PHP如何遵循您给出的逻辑。一直弹出它们,它们会告诉您正在运行什么代码以及按照什么顺序运行。寻找缺少的观察者以及出现的观察者。
现在您可能在这里找到问题:
$query = 'INSERT INTO `borough` VALUES(NULL, \"$boro_name\")';
$result = $conn->query($query);
$insertID = $conn->insert_id;
您怎么知道插入件起作用?您不是因为从未测试过它。我假设您的最后一个观察者是6。让我们在这里也进行一些测试。
$query = 'INSERT INTO `borough` VALUES(NULL, \"$boro_name\")';
$result = $conn->query($query);
if (!$result) {
die ("Database insert failed at stage one " . $conn->error);
} else {
echo "7. Stage one success";
}
$insertID = $conn->insert_id;
现在您知道那一项是否有效。第二次插入工作了吗?同样,您不知道,因为您仅测试了最后一个。在检查之前,您可能会遇到三个错误。同样,并检查第二阶段插入物。
将所有内容放在一起,您应该能够准确看到此脚本失败的地方。哪个应该确切告诉您要使其正常工作需要做什么。如果您仍然陷于困境或仍然拒绝使用该程序,您将要提出一个更加具体的问题。
保持测试,不断改进并不断提出问题。您的代码结构合理,因此调试应该很简单。
奖励材料:
如果进行小的更改,则可以减少传递消息的工作。为什么要在消息中放入HTML?这似乎比您想要的还要多。
if (isset($message)) echo "<p class=\"message\">$message</p>";