2016-02-10 122 views
2

我已經設法編寫了一個php腳本,用於檢查用戶名是否已經存在於數據庫中,並且僅在新用戶不存在的情況下才添加新用戶。INSERT INTO SQL php函數不起作用

這是我的PHP腳本:

<?php 
require "init.php"; 

if(isset($_POST['username']) && isset($_POST['forename']) && isset($_POST['surname']) && isset($_POST['password'])){ 
    $username = $_POST['username']; 
    $forename = $_POST['forename']; 
    $username = $_POST['surname']; 
    $password = $_POST['password']; 

    $stmt = "SELECT username FROM users WHERE username = ?"; 
    $result = $dbcon -> prepare($stmt); 
    $result->bind_param('s', $username); 
    $result->execute(); 
    $result->bind_result($username); 

    if($result->fetch()){ 
     echo "Can't add new user as it already exists!"; 
    } 
    else{ 
     $stmt_two = "INSERT INTO users (username, forename, surname, password) 
       VALUES(?, ?, ?, ?)"; 
     $result_two = $dbcon -> prepare($stmt_two); 
     $result_two->bind_param('ssss', $username, $forename, $surname, $password); 
     $result_two->execute(); 
     $result_two->close(); 
     echo json_encode("Success"); 
    } 
} 
?> 

我相信這些記錄不被插入或被插入間歇由於我有不止一個事先準備好的聲明。如果我只用SELECT FROM聲明自行完成INSERT INTO聲明 - 記錄幾乎立即添加。

爲什麼這和我的代碼有什麼問題?

感謝

+0

就更不用說了,你不需要檢查是否已經有使用PHP的這個用戶名的註冊。您可以使用UNIQUE約束來設置用戶名列。如果他們嘗試再次添加相同的用戶名,則查詢將失敗。所以你的代碼會更簡單。 – Phiter

+2

你是什麼意思_slowly_?有多慢?我不認爲這塊代碼會佔用太多的資源,只要使用'COUNT()'或' - > num_rows'這兩個準備好的語句,就不會花費太多時間,它會花多長時間反正在你的環境中做這些事情? 15-30秒? – Ghost

+0

@Ghost它甚至沒有將值插入到數據庫:(。它沒問題,當我沒有選擇語句。也許你可以幫助 - 我只是想添加一個用戶名IF和只是如果它不我不能在一個語句中做到這一點嗎? –

回答

4

正如我剛纔所說的意見,不要過分複雜化,只是檢查發現的行數。無需獲取任何東西。你只是檢查該用戶是否存在。

$stmt = "SELECT username FROM users WHERE username = ?"; 
$result = $dbcon->prepare($stmt); 
$result->bind_param('s', $username); 
$result->execute(); 
$result->store_result(); 

if($result->num_rows() > 0) { // if it exists 

} else { 
    // make your insertions 
} 

而另注:

isset可以採取多個參數:

if(isset($_POST['username'], $_POST['forename'], $_POST['surname'], $_POST['password'])) { 
    // and so on 
} 

編輯:另一種味道(使用MySQL的COUNT()):

$stmt = "SELECT COUNT(username) FROM users WHERE username = ?"; 
$result = $dbcon->prepare($stmt); 
$result->bind_param('s', $username); 
$result->execute(); 
$result->bind_result($count); 
$result->fetch(); 

if($count > 0) { // exists 

} else { 
    // do something else 
} 
+0

PERFECT! !它的工作原理 - 因此我給了你一個贊同的答案和可以接受的答案。你能解釋一下爲什麼我的代碼之前沒有工作嗎?如果你不介意 –

+0

@SamuelGeorgeszusz沒有任何意義去取回任何東西,更容易檢查產生的行數,並且始終不要忘記調用' - > store_r esult()'執行後。 – Ghost

+0

謝謝,' - > store_result()'是什麼意思,爲什麼我需要調用它?我也注意到你沒有'關閉'連接 - 有什麼理由?我只是好奇 –