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
  1. include_once ('/_includes/classes/connection.class.php');何も含まれません。ローカルファイルシステムのルートに_includesディレクトリはありません
  2. エラーについて言及しなかったため、適切なエラー報告が設定されていません。

誰かが私のコードで何がうまくいかないのかわかりますか?

他のエラーが発生する可能性がありますが、コードを監視することはできません。コードを実行してデバッグ、発生したエラーを監視する必要があります。

補足として追加しなければならない唯一のこと-あなたのコードは洪水のように濡れています。それを見てください:あなたはすべてのフィールド名を6回書いています!

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

合計6回の繰り返し

于 2013-01-19T18:48:24.583 に答える
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 に答える
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 に答える