【问题标题】:PHP form post to databasePHP 表单发布到数据库
【发布时间】:2014-10-13 13:03:06
【问题描述】:

所以,到目前为止,我已经用谷歌搜索了一个多星期,但我无法解决这个问题。

我有一个包含特定内容的表格。我希望用户能够填写此表格。然后点击按钮提交,将填写好的表格发布到我的数据库中。

我一直在尝试各种可能的方法,但这对我不起作用,所以希望这里有人可以帮助我。

到目前为止我的代码(我的表单):

<div class="regForm">
<h1> Register here: </h1>
    <form method='POST' action='connectie.php' id="registerPage">
        Username:<br>
        <input type="text" name="username" size="20"><br>
        Password:<br>
        <input type="text" name="password" size="20"><br>
        First name:<br>
        <input type="text" name="first_name" size="20"><br>
        Last name:<br>
        <input type="text" name="last_name" size="20"><br>
        Age:<br>
        <input type="text" name="age" size="20"><br><br>
        E-mail adress:<br>
        <input type="text" name="mail" size="20"><br><br>
        <input type="submit" name="register" id="regButton" value="Register">

<h1> Unsubscribe here: </h1>
        Username<br>
        <input type="text" size="20"><br>
        Password<br>
        <input type="text" size="20"><br><br>
        <input type="submit" name="unsub" id="unsubButton" value="Unsubscribe">
    </form>
</div>

还有我与数据库的连接(wamp 上的本地)

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$fname =  $_POST['first_name'];
$lname = $_POST['last_name'];
$username = $_POST['username'];
$password = $_POST['password'];
$age = $_POST['age'];
$email = $_POST['mail'];
$sql = "INSERT INTO users (`ID`, `first_name`, `last_name`, `username`, `password`, `age`, `email`) VALUES (NULL, '$fname', '$lname', '$username', '$password', '$email', '$age');";
define('DB_USER', 'root');
define('DB_PASSWORD', 'studie');
define('DB_HOST', 'localhost');
define('DB_NAME', 'i268296_studie');
$connection = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
// Check connection
$connection_error = $connection->connect_error;
if ($connection_error != null) {
    echo "Error connecting to database: $connection_error";
    exit();
}
$result = $connection->query($sql);
?>

所以,如果有人能这么好心地指出我正确的方向,我如何将表单中的文本提交到我的数据库中。取消订阅的东西现在不需要工作。希望有人可以帮助我,因为 PHP 与数据库的结合正在慢慢让我发疯:)

提前致谢!

【问题讨论】:

  • 定义“不起作用”。它以什么方式失败?您是否收到任何错误(即使在 PHP 和/或 Web 服务器日志中)?代码具体在哪里失败?此外,这看起来像是一个 SQL 注入漏洞。您可能想开始阅读:php.net/manual/en/security.database.sql-injection.php
  • @David 好吧,此时我第二次转到 connection.php(其中包含查询等)它只是填写数据库中的一个空单元格,但它应该只放一个如果我按下提交按钮,数据库中的新行/单元格。所以基本上我需要将提交按钮附加到表单(按下时,将表单中填写的项目放入数据库)。我没有收到任何错误等。但是我用谷歌尝试过的不同代码似乎不起作用。我真的不明白为什么

标签: php database phpmyadmin


【解决方案1】:

回应您的评论:

此时我第二次转到connection.php(其中包含查询等)它只是填写数据库中的一个空单元格

听起来 PHP 代码和 HTML 表单都在同一个页面上(connectie.php)?在这种情况下,您正在执行服务器端代码之前显示表单。请注意,当您请求页面时,该页面上的任何服务器端代码都将被执行。 PHP 代码并不真正了解或关心表单或按钮,它只会运行该文件中的任何代码。

你有两个选择:

  1. 呈现表单的代码与处理表单的代码分隔成两个不同的页面。一页可以是纯 HTML 来显示表单(如果你想做一些服务器端的工作来显示表单,可以使用一些最少的 PHP 代码)。第二页(在表单的action 属性中引用的那个)将包含用于接收表单输入的 PHP 代码。这样,处理表单的代码只会在实际提交表单时调用,而不是在请求时调用。
  2. 将您的表单处理服务器端代码包装成如下内容:

    if (isset($_POST['register'])) { /* process registration code */ }

只有在提交带有register 元素(您的一个按钮的名称)的表单时,第二个选项才会有条件地调用if 块中的逻辑。您可以对 unsub 按钮的逻辑执行相同操作。这里的想法是,当您请求页面时,这些if 条件是false 并且不会执行。但是当您提交表单时,其中之一是 true 并且会执行。


另外,这很重要

  1. 您的代码中有一个 SQL 注入漏洞,它允许任何用户在您的服务器上执行他们的代码。请参阅this page,了解有关如何保护您的代码免受此类攻击的更多信息。
  2. 您的代码以纯文本形式存储用户密码。 切勿以纯文本形式存储用户密码。密码应使用单向哈希进行哈希处理,并且任何人都不应读取。

【讨论】:

  • 此时我将 Connectie.php(这是第二个代码块)与表单(位于registration.php 中)分开,并且在顶部我包括了connectie.php: php session_start();包括“connectie.php”; ?> 我认为您的第二个选项可能对我有用。但是代码,它应该在按下提交时工作,对吗? (我只需要把它放在 if 语句中)
  • 它与 if 语句一起使用,它现在将我填写的任何内容放入提交时的数据库中。太爱男人了!谢谢!!我知道这会很简单......
  • @Xereoth:它被分离到自己的文件中,但如果你在第一页中包含它,那么它仍然会被执行。通过分隔它,我的意思是它应该是它自己的页面。
  • @Xereoth:另外,我在回答中添加了一些重要 注释。请认真对待它们,因为它们会直接影响您的用户。
  • 是的,这是我的下一步,使密码安全/不可读。我将阅读 SQL 注入漏洞。再次感谢!
【解决方案2】:

将您的连接代码放在所有 $_POST 行之前..

您在连接数据库之前进行查询...那么,如果没有连接,您如何进行查询?而且,像第一个 php 代码一样,编写 session_start();

<?php
session_Start();

//YOUR CODE
define('DB_USER', 'root');
define('DB_PASSWORD', 'studie');
define('DB_HOST', 'localhost');
define('DB_NAME', 'i268296_studie');
$connection = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

建立连接后,您可以进行查询

$fname =  $_POST['first_name'];
$lname = $_POST['last_name'];
$username = $_POST['username'];
$password = $_POST['password'];
$age = $_POST['age'];
$email = $_POST['mail'];
$sql = "INSERT INTO users (`ID`, `first_name`, `last_name`, `username`, `password`, `age`, `email`) VALUES (NULL, '$fname', '$lname', '$username', '$password', '$email', '$age')";
ADD $result=mysql_query($sql);

//YOU OTHER CODE..
?>

这是我在我的站点中用于连接到数据库以进行登录的代码(更改插入的查询)..

    <?php
    session_start();
    $host=""; // Host name 
    $username=""; // Mysql username 
    $password=""; // Mysql password 
    $db_name=""; // Database name 
    $tbl_name=""; // Table name 

    mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
    mysql_select_db("$db_name")or die("cannot select DB");

    //take datas from inputs
   $myusername = stripslashes($myusername);
   $mypassword = stripslashes($mypassword);
   $myusername = mysql_real_escape_string($myusername);
   $mypassword = mysql_real_escape_string($mypassword);

    $sql="SELECT * FROM $tbl_name WHERE BINARY U_NomeUtente='$myusername' and U_Password='$mypassword'"; 
    $result=mysql_query($sql);
    $count=mysql_num_rows($result);

    if($count==1) //if the login it's ok
        {

            header("location:pagethatyouwantoreach after the login.php"); 
        }
    ?>

【讨论】:

  • 1) 您将mysqlimysql 混合在一起。 2) 此代码对 SQL 注入完全开放
  • 1) 你能告诉我 mysqli 在我的代码中的位置吗?我也是php的初学者,所以我很高兴学习^^
  • 第一个代码块,最后一行。 (Ctrl-F 有助于在 Web 浏览器中查找文本。)答案中的其他所有内容都是 mysql,即使 OP 显然使用的是 mysqli。您还继续添加更多 SQL 注入漏洞。您发布的代码根本不应该在任何生产系统中使用。
  • about 1) 第一个块是我在答案中使用的 Xereoth 的代码,不是我的 ^^ 但我应该注意到并更改它,你是对的......(只有最后一个块是我的)关于 2)我添加了 stripslashes 和 mysql_real_escape_string 但我确信这足以解决 sql 注入问题..我正在尝试改进代码,但我是初学者
  • mysql_real_escape_string 的使用可能巧合适用于您遇到的任何情况,但请查看其文档:php.net/manual/en/function.mysql-real-escape-string.php 顶部附近的那个阅读框该页面指示功能的弃用状态,并提供指向更好替代方案的链接。
猜你喜欢
  • 2012-06-28
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多