2016-12-27 80 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我不得不做回滚到原来的文章,因为你应该作为一个额外的编辑。我会一直低估它,人们会对自己说:*“他们使用占位符,为什么答案?”*。 –