2013-01-19 53 views
0

我試圖用PDO創建一個用戶註冊頁面,我從來沒有用過這個,所以我很難理解如何插入到我的表中的值。爲用戶註冊插入數據PHP/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 = '[email protected]'; 
$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(); 

?> 
+0

如果您打算擁有不同用戶的數據庫,您可能需要考慮擁有主鍵。 – sooper

回答

2

決不做你didt的方式,SQL Injections

使用預處理語句的原因。

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

而且請不要明文密碼保存到數據庫中,使用散列

Secure hash and salt for PHP passwords

最好使用「規定」或「require_once」如果你真的需要includet文件。

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

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(); 
+0

這似乎不工作@VincentRamdhanie,我用我的完整代碼更新了我的問題... – Liam

+0

當你說「不行」時,你的意思是什麼?什麼是錯誤信息? –

2
  1. include_once ('/_includes/classes/connection.class.php');永遠不會包括任何東西。在本地文件系統的根目錄中沒有_includes目錄
  2. 由於您沒有提及任何錯誤 - 因此,您沒有設置正確的錯誤報告。

任何人都可以看到我的代碼出了什麼問題嗎?

可以有其他錯誤,但看代碼是不是要走的路。一個有來運行的代碼,去調試吧,並觀察發生的錯誤。

我必須添加一個附註 - 你的代碼和洪水一樣溼。看看它:你正在寫每個字段的名字六次!

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

總的6次重複

+0

@YourCommonSense 5次,你的意思是什麼? – Liam

+0

我不明白爲什麼這是一件壞事,但?還有什麼我可以做的更有益?對不起,如果我聽起來很天真,我只是對此感到陌生,並且很難理解某些問題等。 – Liam

0

你真的應該使用預處理語句。你應該做更多的東西這樣的,假設:

  • $胸徑爲您檢查$ _POST數組,以確保它包含了所有領域的PDO對象
  • 你認爲它應該
  • 您修復包括聲明
  • 您選擇保存密碼哈希數據庫中,而不是將它們存儲明文

您的代碼會更喜歡這樣。

<?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 
}