0

私はphp/sqlにかなり慣れていませんが、助けを求めるまで、これについて多くの調査を行いました.

基本的に、新しいユーザー名/電子メール/パスワード/ソルトを MySQL5 DB に挿入しようとしています。これは、エコーだけの私のテスト用 register.php です。

include 'dbcxn.php';

$usr = $_POST['user'];
$mail = $_POST['mail'];
$pwd = $_POST['p'];
$random_salt = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true));
$password = hash('sha512', $pwd.$random_salt);

$insert_stmt = DB::cxn()->prepare("INSERT INTO members (username, email, password, salt) VALUES ($usr, $mail, $password, $random_salt)");
echo $insert_stmt->param_count." parameters\n";

「$insert_stmt = $mysqli->prepare」だけを使用してみましたが、同じことが起こります。それで、クラスDBを作りました。役立つ場合は、これが私の dbcxn.php です。

define("HOST", "");
define("USER", "");
define("PASSWORD", "");
define("DATABASE", "");
define("PORT", "");

$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE, PORT);

class DB {
private static $mysqls;
private function __construct(){}

static function cxn() {
    if( !self::$mysqls ) {
        self::$mysqls = new mysqli(HOST, USER, PASSWORD, DATABASE, PORT);
    }
    return self::$mysqls;
}
}

他に何をしようとしているのか分からず、睡眠をとる必要があります:)。アドバイスをよろしくお願いします。

4

2 に答える 2

1

あなたの主な問題は、文字列がまったくエスケープされていないことです。

mysqli::prepare() は、準備されたクエリに使用されます。これを正常に機能させるには、クエリを次のように変更する必要があります。

$insert_stmt = DB::cxn()->prepare("INSERT INTO members (username, email, password, salt) VALUES (?, ?, ?, ?)");
$insert_stmt->bind_param('ssss', $usr, $mail, $password, $random_salt);
$insert_stmt->execute();

詳細については、 http: //www.php.net/manual/en/mysqli-stmt.bind-param.php で bind_param を参照してください。また、最初のパラメーターの説明 ('s' は文字列値を意味します) 、4 つの文字列値を挿入しているため、ここには 4 つあります)。

于 2012-08-11T09:20:54.543 に答える
0

SQL に構文エラーがあります。得られるものは次のようなものです: INSERT INTO members (username, email, password, salt) VALUES (username, test@test.test, mypassword, lkjlk21j3lkjsdclksdmfl3i4)

あなたはこれが欲しいかもしれません:

INSERT INTO members (username, email, password, salt) VALUES (?, ?, ?, ?)

于 2012-08-11T09:23:05.237 に答える