2017-07-04 14 views
0

"register.inc.php"ファイルを利用する登録フォーム(SQLデータベースを使用)を作成しようとしています。アカウントを作成しようとすると)私が手登録フォーム:function prepare()on null

THISエラー:

"致命的なエラーは、ライン30上の/usr/www/world/includes/register.inc.phpにヌル上)(準備メンバ関数を呼び出します"私は私のregister.inc.phpからコードを投稿しました。どんな洞察も大変ありがとうございます。

<?php 
include_once 'loginhandler.php'; 
include_once 'DBclass.php'; 

$error_msg = ""; 

if (isset($_POST['username'], $_POST['email'], $_POST['p'])) { 
    // Sanitize and validate the data passed in 
    $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING); 
    $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL); 
    $email = filter_var($email, FILTER_VALIDATE_EMAIL); 
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
     // Not a valid email 
     $error_msg .= '<p class="error">The email address you entered is not valid</p>'; 
    } 

    $password = filter_input(INPUT_POST, 'p', FILTER_SANITIZE_STRING); 
    if (strlen($password) != 128) { 
     // The hashed pwd should be 128 characters long. 
     // If it's not, something really odd has happened 
     $error_msg .= '<p class="error">Invalid password configuration.</p>'; 
    } 

    // Username validity and password validity have been checked client side. 
    // This should should be adequate as nobody gains any advantage from 
    // breaking these rules. 
    // 

    $prep_stmt = "SELECT id FROM members WHERE email = ? LIMIT 1"; 
    $stmt = $mysqli->prepare($prep_stmt); 

    // check existing email 
    if ($stmt) { 
     $stmt->bind_param('s', $email); 
     $stmt->execute(); 
     $stmt->store_result(); 

     if ($stmt->num_rows == 1) { 
      // A user with this email address already exists 
      $error_msg .= '<p class="error">A user with this email address already exists.</p>'; 
      $stmt->close(); 
     } 
    } else { 
     $error_msg .= '<p class="error">Database error Line 39</p>'; 
     $stmt->close(); 
    } 

    // check existing username 
    $prep_stmt = "SELECT id FROM members WHERE username = ? LIMIT 1"; 
    $stmt = $mysqli->prepare($prep_stmt); 

    if ($stmt) { 
     $stmt->bind_param('s', $username); 
     $stmt->execute(); 
     $stmt->store_result(); 

     if ($stmt->num_rows == 1) { 
      // A user with this username already exists 
      $error_msg .= '<p class="error">A user with this username already exists</p>'; 
      $stmt->close(); 
     } 
    } else { 
     $error_msg .= '<p class="error">Database error line 55</p>'; 
     $stmt->close(); 
    } 

    // TODO: 
    // We'll also have to account for the situation where the user doesn't have 
    // rights to do registration, by checking what type of user is attempting to 
    // perform the operation. 

    if (empty($error_msg)) { 

     // Create hashed password using the password_hash function. 
     // This function salts it with a random salt and can be verified with 
     // the password_verify function. 
     $password = password_hash($password, PASSWORD_BCRYPT); 

     // Insert the new user into the database 
     if ($insert_stmt = $mysqli->prepare("INSERT INTO members (username, email, password) VALUES (?, ?, ?)")) { 
      $insert_stmt->bind_param('sss', $username, $email, $password); 
      // Execute the prepared query. 
      if (! $insert_stmt->execute()) { 
       header('Location: ../error.php?err=Registration failure: INSERT'); 
      } 
     } 
     header('Location: ./register_success.php'); 
    } 
} 
?> 
+0

これは、mysqli-object( '$ mysqli')が' null'であることを意味します。あなたがそれを割り当てようとしたときに何かが間違っていました。 – Max

+0

こんにちはマックス、すばらしい返答をいただきありがとうございます。私はそれを引き起こす何も見ません..私はそれが私のデータベーステーブルとは何かするかもしれないと思ったが、実際には意図したように働いています..私は手動で自分のデータベースにユーザーを作成し、私のフォームは完璧に動作します。それは、私を困惑させた新しいユーザーを登録することです。 – DragonKyn

+0

DragonKyn 'var_dump($ mysqli)'を試してみてください。私は、接続オブジェクトの作成時に何らかの理由でデータベースに接続できないと思われます。 – Max

答えて

2

私は 'DBclass.php' が "$のmysqliの" 変数への代入が含まれていることを考えています。あたりです?現在のスクリプトでは、この変数への義務は含まれていないためです。 (したがって、それは決して初期化されていないのでnull値を含んでいます。)