2015-03-13 31 views
0

我有這個問題,註冊是成功的,但它不會將信息寫入數據庫..爲什麼?註冊成功,但不寫信息到數據庫

註冊過程CODE:

<?php 
include_once 'db_connect.php'; 
include_once 'psl-config.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); 

    // 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) { 
    $error_msg .= '<p class="error">A user with this email address already exists.</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) { 
    $error_msg .= '<p class="error">A user with this username already exists.</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 salted password 
     $passwordHash = 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', '$passwordHash'); 
      // Execute the prepared query. 
      if (! $insert_stmt->execute()) { 
       header('Location: ../error.php?err=Registration failure: INSERT'); 
      } 
     } 
     header('Location: ./continue.php'); 
    } 
} 

登記表:

<div class="register-form"> 
    <center><h2>Registration</h2></center> 
     <form action="<?php echo esc_url($_SERVER['PHP_SELF']); ?>" 
       method="post" 
       name="registration_form"> 
      <center><p></p><input type='text' 
       name='username' 
       placeholder="Username" 
       id='username' /><br></center> 
      <center><p></p><input type="text" name="email" id="email" placeholder="Email" /><br></center> 
      <center><p></p><input type="password" 
          name="password" 
          placeholder="Insert Password" 
          id="password"/><br></center> 
      <center><p></p><input type="password" 
            name="confirmpwd" 
            placeholder="Repeat Password" 
            id="confirmpwd" /><br></center> 
      <center><p></p><input type="submit" class="button" 
        value="Register" 
        onclick="return regformhash(this.form, 
            this.form.username, 
            this.form.email, 
            this.form.password, 
            this.form.confirmpwd);" /> </center> 
     </form> 
     </div> 

它做的工作最後一次,但現在並沒有因爲服務器有一個內部錯誤,所以我不得不重新上傳所有文件並創建一個新的數據庫。我重寫了數據庫名稱並傳遞了所有的內容,所以它連接到了正確的數據庫,但它在註冊時不會將信息寫入該數據庫。

+1

添加一些錯誤檢查和mysqli位和/或檢查錯誤日誌,如果你有獨特的約束,該會在第一時間後失效。 – 2015-03-13 11:59:28

+0

@JayBlanchard - 如何做錯誤檢查? – Steven 2015-03-13 12:00:38

+2

[從這裏開始](http://php.net/manual/en/mysqli.error.php) – 2015-03-13 12:01:32

回答

2

您正在插入文字字符串,您的變量名稱,而不是值。

$insert_stmt->bind_param('sss', '$username', '$email', '$passwordHash'); 

您需要:

$insert_stmt->bind_param('sss', $username, $email, $passwordHash); 
+0

我有$ insert_stmt-> bind_param('sss',$ username,$ email,$ passwordHash);但它沒有工作,所以我改爲 $ insert_stmt-> bind_param('sss','$ username','$ email','$ passwordHash'); 並且這也不起作用:D – Steven 2015-03-13 12:15:51

+0

@Steven將它添加到腳本的頂部並啓用錯誤顯示:'mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);'任何消息? – jeroen 2015-03-13 12:19:42

+0

甚至沒有一個錯誤消息......這很奇怪......這就是爲什麼我在這裏發佈......我的思想被吹了 – Steven 2015-03-13 20:21:13

相關問題