使用PHP从HTML表单发布到MySQL数据库,重新加载表单且未发布任何数据

时间:2019-05-06 00:19:20

标签: php mysql

我正在尝试编写代码,允许用户向我的数据库添加免费的公共厕所。这需要将数据添加到数据库中的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>    

我希望表单能够提交到我的数据库,并告诉用户他们成功了。

1 个答案:

答案 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>";