2016-12-27 29 views
1

有問題所以,我目前正在嘗試爲我的瀏覽器遊戲做一個登錄表單,這需要多個查詢才能正常工作。我首先開始使用PHP和MySQL查詢的正常程序,但很快發現由於SQL注入而不是最好的方法。與mysqli_stmt(程序風格)

所以,我決定使用stmt,根據stackoverflow,更安全。

我的代碼是比這個大,但我只想把這裏被竊聽(我調試的代碼的其餘部分和其他一切是好的,包括連接到MySQL服務器)

$stmt = mysqli_prepare($conn, "SELECT username FROM users WHERE username='$playername'"); 
    ´ 
//Im pretty sure this is where the bug is 
mysqli_stmt_bind_param($stmt, "s", $playername); 
//---------------------------------------- 

mysqli_stmt_execute($stmt); 

mysqli_stmt_bind_result($stmt, $dbusername); 

mysqli_stmt_fetch($stmt); 

$row_cnt = mysqli_stmt_num_rows($stmt); 

if($row_cnt === 0) { 

    mysqli_stmt_close($stmt); 
    $error = true; 
    $errorid = "There is no player registered with that username."; 
    echo $errorid; 

    } 
部分

我用數據庫中的用戶名「Syvered」創建了一個條目,這是我目前正在測試的用戶名,並且當試圖在登錄表單上使用該用戶名時(請注意,$ playername是用戶輸入的用戶名)它仍然會說「沒有這樣的用戶使用該用戶名」,這意味着mysqli_stmt_num_rows($ stmt)由於某種原因返回0。這是我不明白的。

我真的很希望我對你已經很清楚,先謝謝你的幫助。

問題我查可惜沒有幫助:

回答

4

你傳遞一個變量WHERE子句中:

WHERE username='$playername' 

,而不是一個佔位符,需要更改爲:

WHERE username=? 

因爲您想要使用預準備語句。

確保$playername確實有一個值,你已經使用mysqli_ API連接成功。

使用適當的錯誤檢查會有所幫助:

如果你正在尋找,看有沒有行存在(這似乎是這裏的情況),請參閱我的答案之一,其中使用了準備好的聲明:

也是一種PDO方法。

從我的答案,這是你需要做的,你正在使用的查詢和變量(S)的數據進行替換什麼的一個採取一個例子:

$query = "SELECT `email` FROM `tblUser` WHERE email=?"; 

if ($stmt = $dbl->prepare($query)){ 

     $stmt->bind_param("s", $email); 

     if($stmt->execute()){ 
      $stmt->store_result(); 

      $email_check= "";   
      $stmt->bind_result($email_check); 
      $stmt->fetch(); 

      if ($stmt->num_rows == 1){ 

      echo "That Email already exists."; 
      exit; 

      } 
     } 
    } 

編輯:

測試你的代碼後,有些事情你在這裏做得不正確。

您需要「存儲」代碼中缺少的結果。

然而,讓我們嘗試一個稍微不同的方法,並檢查它確實存在,並回應說確實如此,如果沒有;表明它沒有。

旁註:我用>=if($row_cnt >= 1)應該有多個匹配。如果你願意,你可以改變它。

$playername = "Syvered"; // This could also be case-sensitive. 

$stmt = mysqli_prepare($conn, "SELECT username FROM users WHERE username = ?"); 

    mysqli_stmt_bind_param($stmt, "s", $playername); 
    mysqli_stmt_execute($stmt); 
    mysqli_stmt_store_result($stmt); // Store the results which was missing. 
    mysqli_stmt_bind_result($stmt, $dbusername); 
    mysqli_stmt_fetch($stmt); 

$row_cnt = mysqli_stmt_num_rows($stmt); 

if($row_cnt >= 1) { 

    $error = false; // Changed from true 
    $errorid = "It exists."; 
    echo $errorid; 

    mysqli_stmt_close($stmt); 

    } 

else{ 

echo "It does not exist."; 

} 
  • 可以恢復到你所使用的條件的方式,但要記住「存儲」的結果。
+0

謝謝你的回答!不幸的是,我做了你告訴我的事,但它仍然無法正常工作。我編輯了我的問題的代碼。 – Syvered

+0

@Syvered正如我在我的回答中所說,看到我的答案另一個http://stackoverflow.com/questions/22252904/check-if-row-exists-with-mysql/22253579#22253579哪些工作,基本上做同樣的事情。如果你的工作沒有成功,那麼你的工作就會失敗,你需要檢查錯誤的原因。 –

+0

@Syvered我不得不做回滾到原來的文章,因爲你應該作爲一個額外的編輯。我會一直低估它,人們會對自己說:*「他們使用佔位符,爲什麼答案?」*。 –