Canonical:如何将 HTML 表单数据保存到 MySQL 数据库中

Posted

技术标签:

【中文标题】Canonical:如何将 HTML 表单数据保存到 MySQL 数据库中【英文标题】:Canonical: How to save HTML form data into MySQL database 【发布时间】:2014-08-06 08:32:49 【问题描述】:

这是使用 php 将数据从 (html) 表单保存到 mysql 数据库的规范问答。

如果您尝试执行以下操作,这适用于您:

    在 HTML 表单上接受用户输入 使用 PHP 脚本处理输入 将所述输入存储到 MySQL 数据库中。

过去提出的不应使用的类似问题示例:

Connecting PHP Code and Submit Form to mySQL DatabaseInsert into mysql using php / html form - not workingHow to use PHP to pass HTML form data to a MYSQL db and return the data to the browsersaving form data to database

简而言之,如果您有以下问题,请继续阅读:我想使用 HTML 表单、PHP 和 MySQL 将用户输入存储到数据库 或类似的。

【问题讨论】:

请添加更多关于如何使用复选框和其他表单元素的示例。我们的想法是关闭未来针对此问题的重复项,并在需要其他变体时对其进行更新。 您的大部分链接都包含使用已弃用的mysql_* 函数。您至少应该找到一些使用mysqli_* 函数的函数。 另外, 更好的是,使用准备好的语句。比如mysqli_* with prepared statements,或者PDOprepared statements @Fred-ii-:这就是它们被链接的部分原因。答案中涵盖了 SQL 注入。我想我也需要在问题部分更具体。 这就是我有时会回答那些认为使用 PDO 是安全的人的问题。 ---=> “mysqli_ 和/或 PDO 的使用不能防止 SQL 注入;不是单独使用。使用 mysqli_* with prepared statementsPDOprepared statements 将。 " 【参考方案1】:

首先,您的 PHP 或 HTML 页面应该生成一个用户可以与之交互的表单。在最 简单的形式是这样的:

<html>
<body>
 <form method="post" action="yourscript.php">
  <input type="text" name="yourfield">
  <input type="submit" name="youraction" value="save">
 </form>
</body>
</html>

这将为您的用户提供一个带有单个输入字段和“保存”按钮的简单表单。点击后 内容的“保存”按钮将使用POST 方法发送到您的“yourscript.php”。

yourscript.php 应该实现以下内容:

    接受并处理表单中的输入。 连接到您的 MySQL 数据库。 存储到数据库中。

最简单的形式是:

<!doctype html>
<html>
 <head>
  <title>Process and store</title>
 </head>
<body>
<?php

// Check that user sent some data to begin with. 
if (isset($_REQUEST['yourfield'])) 

    /* Sanitize input. Trust *nothing* sent by the client.
     * When possible use whitelisting, only allow characters that you know
     * are needed. If username must contain only alphanumeric characters,
     * without puntation, then you should not accept anything else.
     * For more details, see: https://***.com/a/10094315
     */
    $yourfield=preg_replace('/[^a-zA-Z0-9\ ]/','',$_REQUEST['yourfield']);

    /* Escape your input: use htmlspecialchars to avoid most obvious XSS attacks.
     * Note: Your application may still be vulnerable to XSS if you use $yourfield
     *       in an attribute without proper quoting.
     * For more details, see: https://***.com/a/130323
     */
    $yourfield=htmlspecialchars($yourfield);


 else 
    die('User did not send any data to be saved!');



// Define MySQL connection and credentials
$pdo_dsn='mysql:dbname=yourdatabase;host=databasehost.example.com';
$pdo_user='yourdatabaseuser';     
$pdo_password='yourdatabaspassword';  

try 
    // Establish connection to database
    $conn = new PDO($pdo_dsn, $pdo_user, $pdo_password);

    // Throw exceptions in case of error.
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // Use prepared statements to mitigate SQL injection attacks.
    // See https://***.com/questions/60174/how-can-i-prevent-sql-injection-in-php for more details
    $qry=$conn->prepare('INSERT INTO yourtable (yourcolumn) VALUES (:yourvalue)');

    // Execute the prepared statement using user supplied data.
    $qry->execute(Array(":yourvalue" => $yourfield));

 catch (PDOException $e) 
    echo 'Error: ' . $e->getMessage() . " file: " . $e->getFile() . " line: " . $e->getLine();
    exit;

?>
<form method="post">

 <!-- Please note that the quotes around next <?php ... ?> block are important
      to avoid XSS issues with poorly escaped user input. For more details:
      https://***.com/a/2894530
  -->
 <input type="text" name="yourfield" value="<?php print $yourfield; ?>">
 <input type="submit" name="youraction" value="save">
</form>

</body>
</html>

这里的关键点是对avoid SQL injections attacks 使用准备好的语句。

【讨论】:

('INSERT INTO yourtable VALUES (:yourvalue)') 需要更改为('INSERT INTO yourtable (your_column) VALUES (:yourvalue)')。最好指定要插入的实际列。 加工部分在哪里?我本来希望参考答案包含有关字符集验证、文本/* 约束或例如至少提到了 HTMLPurifier。

以上是关于Canonical:如何将 HTML 表单数据保存到 MySQL 数据库中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 javascript 或 jquery 将 html 表单数据保存到 sql db [关闭]

如何使用 Xamarin 表单和 C# 将 Html 数据从网站保存到文本文件

如何将动态表单保存到数据库/编辑表单回来

将 HTML 表单数据保存为 XML

如何从 html 表单中获取“日期和时间”输入并使用 Spring Boot 保存到 MySQL 数据库中?

不使用 django 表单如何验证和保存表单数据