【问题标题】:Create account using PHP to MySQL [duplicate]使用 PHP 到 MySQL 创建帐户 [重复]
【发布时间】:2016-01-08 21:41:29
【问题描述】:

我对 PHP/MySQL 不太了解,所以请原谅我的无知。 我的网站上有一个登录表单,我创建了一个用于创建帐户的表单,视觉上一切都很好,但是,我需要将数据发送到我在 mysql 中的客户帐户表。当我提交表单时,它似乎可以工作,创建 ID 1,但所有其他字段都是空白的。

PHP:

<?php

$hostname="localhost";
$username="createaccount";
$password="******";
$dbname="Island_Web_Design";
$usertable="customer_accounts";
$connection = mysql_connect($hostname, $username, $password);
mysql_select_db($dbname, $connection);

$sql="INSERT INTO customer_accounts (firstname, lastname, email, password)
VALUES
('$_POST[firstname]','$_POST[lastname]','$_POST[email]','$_POST[password]')";


if (!mysql_query($sql,$connection))
  {
  die('Error: ' . mysql_error());
  }
echo "1 record added";

mysql_close($con);

?>

HTML:

<form role="form" action="Create_Account.php">
                            <div class="row">
                                <div class="col-xs-6 col-sm-6 col-md-6">
                                    <div class="form-group">
                                        <input type="text" name="firstname" id="firstname" class="form-control input-sm floatlabel createinput" placeholder="First Name">
                                    </div>
                                </div>
                                <div class="col-xs-6 col-sm-6 col-md-6">
                                    <div class="form-group">
                                        <input type="text" name="lastname" id="last_name" class="form-control input-sm createinput" placeholder="Last Name">
                                    </div>
                                </div>
                            </div>
                            <div class="form-group">
                                <input type="email" name="email" id="email" class="form-control input-sm createinput" placeholder="Email Address">
                            </div>
                            <div class="row">
                                <div class="col-xs-6 col-sm-6 col-md-6">
                                    <div class="form-group">
                                        <input type="password" name="password" id="password" class="form-control input-sm createinput" placeholder="Password">
                                    </div>
                                </div>
                                <div class="col-xs-6 col-sm-6 col-md-6">
                                    <div class="form-group">
                                        <input type="password" name="password_confirmation" id="password_confirmation" class="form-control input-sm createinput" placeholder="Confirm Password">
                                    </div>
                                </div>
                            </div>
                            <input type="submit" name="submit" value="Create Account" class="btn btn-primary btn-block register">
                        </form>

提前谢谢你。

【问题讨论】:

  • stop using mysql_* functionsThese extensions 已在 PHP 7 中删除。了解PDOMySQLiprepared 语句并考虑使用 PDO,it's really pretty easy
  • 请使用 PHP 的built-in functions 来处理密码安全问题。如果您使用的 PHP 版本低于 5.5,您可以使用 password_hash() compatibility pack
  • 在您打开&lt;?php 标记error_reporting(E_ALL); ini_set('display_errors', 1); 之后将错误报告添加到文件顶部,在您的查询中添加错误检查,例如or die(mysql_error())。或者您可以在当前的错误日志中找到问题。
  • 帮自己一个忙,只需在接收表单提交的 PHP 页面中放置 print_r($_POST)var_dump($_POST)。填写您的表格,提交并仔细查看打印到屏幕上的数据。熟悉表单数据是如何发布到脚本的,包括传递的内容和不传递的内容。

标签: php html mysql database forms


【解决方案1】:

对于初学者,您应该停止对新代码使用mysql_* 函数。它已从最新版本 (7) 中的语言中删除。而是升级到mysqliPDO

Why shouldn't I use mysql_* functions in PHP?.

其次,您应该防止代码中存在 SQL 注入漏洞:

How can I prevent SQL-injection in PHP?

第三,当您的应用程序中存在安全漏洞时,您应该散列您的密码以防止密码泄露。

password_hash()

最后回答您的问题:如果您不将表单告知POST,它将改为发出GET 请求。将您的表单更改为&lt;form role="form" action="Create_Account.php" method="post"&gt;

您可以也应该针对此类问题自行调试代码。最简单的形式是在变量上使用var_dump(); 来查看变量是否包含您认为它们包含的内容。您还可以通过打开您喜欢的浏览器的开发者工具来检查发出的请求。

您的代码可以/应该重写为:

<?php

$dbConnection = new PDO('mysql:dbname=Island_Web_Design;host=localhost;charset=utf8', 'createaccount', '******');

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $dbConnection->prepare('INSERT INTO customer_accounts (firstname, lastname, email, password) VALUES (:firstname, :lastname, :email, :password');

try {
    $stmt->execute([
        'firstname'=> $_POST[firstname],
        'lastname' => $_POST[lastname],
        'email' => $_POST[email],
        'password' => password_hash($_POST[password], PASSWORD_DEFAULT, ['cost' => 14]),
    ]);
} catch(\PDOException $e) {
    die('Error: ' . $e->getMessage());
}

echo "1 record added";

【讨论】:

  • 感谢您的回答,理想情况下我喜欢直观地看到。有人可以把一些东西放在一起让我理解其中的区别吗?
  • 是的。 OP 应该能够阅读整个答案,因为上面的所有内容实际上更重要。此外,您正在覆盖我的更改。
  • @JoeyG 我尝试添加图片,但作为新用户,我无法添加更多链接。
  • 我把这个 passowrd_hash 段放在哪里? @jeeves
  • 让我写一个例子。
【解决方案2】:

请不要这样做:

('$_POST[firstname]','$_POST[lastname]','$_POST[email]','$_POST[password]')

阅读:Is SQL Injection possible with POST?

修复表单应答器中的 add method="post",谢谢@jay

【讨论】:

  • 这已在 cmets 中介绍过,不是问题的答案。
  • 我刚开始使用 stackoverflow 我无法发表评论
  • @jay 好的,给我看一个例子,说明在这种情况下你会做什么,上面的代码是什么?那会有很大帮助。谢谢
  • @jay 这就是我放链接的原因...
猜你喜欢
  • 1970-01-01
  • 2018-08-04
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多