0

我试图使用 PDO 创建一个用户注册页面,我之前从未使用过这个,所以我无法理解这些值是如何插入到我的表中的。

任何人都可以看到我的代码出了什么问题吗?

<?php

include_once ('/_includes/classes/connection.class.php');

$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];
$password = $_POST['password'];
$accounttype = $_POST['accounttype'];

$query = "INSERT INTO users(firstname,lastname,email,password,accounttype) VALUES ($firstname,$lastname,$email,$password,$accounttype)";
echo $query;
$count = $dbh->exec($query);
$dbh = null;

?>

<?php

$dsn = 'mysql:host=localhost;dbname=site.co.uk';
$username = 'access@site.co.uk';
$password = 'password';
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
); 
$dbh = new PDO($dsn, $username, $password, $options);

$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];
$userpassword = $_POST['password'];
$accounttype = $_POST['accounttype'];

$query = "INSERT INTO users(firstname,lastname,email,password,accounttype) VALUES (:firstname,:lastname,:email,:password,:accounttype)";
$stmt = $dbh->prepare($query);
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':password', $userpassword);
$stmt->bindParam(':accounttype', $accounttype);
$stmt->execute();

?>
4

4 回答 4

2

永远不要像以前那样做,导致SQL 注入

使用准备好的语句。

http://php.net/manual/de/pdo.prepared-statements.php

<?php

require_once ('_includes/classes/connection.class.php');

$stmt = $dbh->prepare('INSERT INTO users (firstname,lastname,email,password,accounttype) VALUES (:firstname,:lastname,:email,:password,:accounttype)');
$stmt->execute(array($_POST));

出了什么问题,你忘记了你的价值观的引号。但在准备好的陈述的情况下,您不需要引号。

http://www.w3schools.com/sql/sql_insert.asp

并且请不要将纯文本密码保存到数据库中,使用哈希

PHP 密码的安全哈希和盐

如果您确实需要包含文件,最好使用“require”或“require_once”。

http://php.net/manual/en/function.require.php

于 2013-01-19T18:44:24.313 回答
2
  1. include_once ('/_includes/classes/connection.class.php');永远不会包括任何东西。本地文件系统的根目录下没有 _includes 目录
  2. 由于您没有提及任何错误 - 因此,您没有设置适当的错误报告。

任何人都可以看到我的代码出了什么问题吗?

可能还有其他错误,但观看代码不是要走的路。必须运行代码、调试它并观察发生的错误。

我唯一需要补充的是 - 你的代码就像洪水一样湿。看看它:你把每个字段名都写了六次!

  • $firstname = $_POST['firstname'];- 2x
  • (名字)值(:名字)` - 2x
  • bindParam(':firstname', $firstname);- 2x

总共6次重复

于 2013-01-19T18:48:24.583 回答
1

您需要绑定值而不是使用字符串连接。

  $dsn = 'mysql:host=localhost;dbname=mydb';
  $username = 'myun';
  $password = 'mypw';
  $options = array(
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
  ); 
  $dbh = new PDO($dsn, $username, $password, $options);
  $query = "INSERT INTO users(firstname,lastname,email,password,accounttype) VALUES
        (:firstname,:lastname,:email,:password,:accounttype)";
  $stmt = $dbh->prepare($query);
  $stmt->bindParam(':firstname', $firstname);
  $stmt->bindParam(':lastname', $lastname);
  //etc
  $stmt->execute();
于 2013-01-19T18:47:44.587 回答
0

你真的应该使用准备好的语句。你应该做更多这样的事情,假设:

  • $dbh 是一个 PDO 对象
  • 您已检查 $_POST 数组以确保它包含您认为应该包含的所有字段
  • 你修复你的包含语句
  • 您选择将散列密码保存在数据库中,而不是以明文形式存储它们

你的代码会更像这样。

<?php

error_reporting(E_ALL);

include_once ('_includes/classes/connection.class.php');

$_POST['password'] = hash('md5', $_POST['password']);

$statement = $dbh->prepare("INSERT INTO 
    users(firstname,lastname,email,password,accounttype) 
    VALUES (:firstname, :lastname, :email, :password, :accounttype)");
if ($statement->execute($_POST) !== true) {
    // there was some kind of error
    // perhaps $statement->errorInfo() will tell you something
}
于 2013-01-19T19:08:20.350 回答