2017-08-04 138 views
1

這段代碼應該檢查現有的用戶名,如果沒有,它應該創建一個新的。不管它不會添加什麼。另外,正如你在代碼中看到的那樣,它只是回聲'在這裏',並不迴應'不在這裏'。PHP沒有發佈到mySQL數據庫

<?php 

$password = "hey"; 
$username = "hi"; 
require "conn.php"; 
//$password = $_POST["password"]; 
//$username = $_POST["username"]; 

echo 'here'; 
$result = $conn->query("SELECT * FROM UserData WHERE username ='$username' ", MYSQLI_USE_RESULT); 
echo 'not here'; 
if ($result) { 

    if($result->num_rows === 0) 
    { 

     $stmt = $conn->prepare("INSERT INTO UserData (username,password) VALUES (:username,:password)"); 
     $params = array(
      ':username' => $username, 
      ':password' => $password 
     ); 
     $stmt->execute($params); 
    } 

} 
?> 

這是連接代碼:

<?php 
    //$db_name = "xxx"; 
    //$mysql_username = "xxx"; 
    //$mysql_password = "xxx"; 
    //$server_name = "xxx"; 
    // Create connection 
    $conn = new mysqli("xxx","xxx","xxx","xxx"); 
    if ($conn->connect_error) { 
     die("Connection failed: " . $conn->connect_error); 
    } 
    echo "Connected successfully"; 

    ?> 

變化:

<?php 
require "conn.php"; 
echo "debug 1"; 
$stmt = $conn->prepare("SELECT * FROM UserData WHERE username = ?"); 
$stmt->bind_param('s', /*$_POST["username"]*/ $username); 
$username = 'hi'; 
$stmt->execute(); 
$stmt->store_result(); 

echo "debug 2"; 
if ($stmt->num_rows == 0){ // username not taken 
    echo "debug 3"; 
    $stmt2 = $conn->prepare("INSERT INTO UserData (username, password) VALUES (?, ?)"); 
    $password =(/*$_POST["password"]*/ "hey"); 
    $username =(/* $_POST["username"]*/ "hi"); 
    $stmt2->bind_param('s',$username); 
    $stmt2->bind_param('s',$password); 
    $stmt2->execute(); 
    if ($stmt2->affected_rows == 1){ 
    echo 'Insert was successful.'; 

    }else{ echo 'Insert failed.'; 
    var_dump($stmt2); 
    } 
}else{ echo 'That username exists already.';} 

?> 

這段代碼獲得通過所有的(1)調試,但由於某些原因,它仍然不插入。

+0

'$ mysqli'如何設置? (在'here'輸出後使用) –

+0

它在conn.php文件中 –

+0

您能顯示該文件的內容嗎?設置用戶並傳遞文本信息。任意的,如果需要的話。我在想'$ mysqli'應該被'$ conn'替代,但是我不知道沒有更多的信息。 –

回答

0

替換該行 $result = **$mysqli->**query("SELECT * FROM UserData WHERE username ='$username' ", MYSQLI_USE_RESULT); 具有以下 $result = **$conn->**query("SELECT * FROM UserData WHERE username ='$username' ", MYSQLI_USE_RESULT);

0

和mysqli和PDO接口不得混用。這裏數據庫連接和SELECT查詢都使用mysqli接口。但第二個INSERT查詢嘗試使用PDO接口,如使用指定佔位符所證明的,以及將數據數組直接傳遞給execute()。後兩個功能不受mysqli支持,因此代碼在第二個查詢時失敗。另外請注意,第二個查詢使用的是準備好的語句,而第一個則不是。再次,不應該將不同的方法混合在一起。

此外,它似乎是密碼存儲爲純文本,沒有安全。正確的方法是使用password_hash函數。 只要確保數據庫字段具有足夠的寬度(比如80-120個字符或更多)來處理當前的bcrypt散列,並且允許更多的未來更改。

與mysqli的接口(與password_hash)停留,代碼可以去像這樣:

$stmt = $conn->prepare("SELECT * FROM UserData WHERE username = ?"); 
$stmt->bind_param('s', $_POST["username"]); 
$stmt->execute(); 
$stmt->store_result(); 
if ($stmt->num_rows == 0){ // username not taken 
    $stmt2 = $conn->prepare("INSERT INTO UserData (username, password) VALUES (?, ?)"); 
    $password = password_hash($_POST["password"], PASSWORD_DEFAULT); 
    $stmt2->bind_param('s', $_POST["username"]); 
    $stmt2->bind_param('s', $password); 
    $stmt2->execute(); 
    if ($stmt2->affected_rows == 1) 
    echo 'Insert was successful.';  
    else echo 'Insert failed.'; 
} 
else echo 'That username exists already.'; 

注意上面的方法將不適合高流量的網站,那裏有一個在SELECT和INSERT數據庫查詢之間的短暫時間間隔內,另一個用戶嘗試插入相同用戶名的機會條件。這將需要一種不同的方法,例如確保主題數據庫字段設置爲UNIQUE(無論如何,這是一個很好的做法),然後在試圖重複插入時測試是否違反該UNIQUE字段。

假設數據庫和INSERT權限都設置正常,但仍未插入,請嘗試增強錯誤報告。

確保以下是在頁面的頂部:

ini_set('display_errors', true); 
error_reporting(E_ALL); 

而第一查詢之前把下面:

$driver = new mysqli_driver(); 
$driver->report_mode = MYSQLI_REPORT_ALL; 

然後再試一次。