2011-11-01 139 views
1

我正在学习PHP阅读PHP手册和学习不同的教程。我用mysql_query遇到了一个问题。我试图用PHP从表单中将用户数据插入到数据库中。 mysql_query应该返回false,因为用户名在数据库中不存在,但根据结果我得到它返回true,并且没有任何数据被输入到数据库中。我使用mysql_query错误还是正在使用!结果不正确?PHP的Mysql数据插入

$sql = "SELECT * FROM users WHERE username='".$_POST["name"]."'"; 
$result = mysql_query($sql) 

if (!$result) { 
    $sql = "INSERT INTO USERS (username, email, password) VALUES 
      ('".$_POST["name"]."', '".$_POST["email"]."', '".$passwords[0]."')"; 
    $result = mysql_query($sql); 

    if ($result) { 
     echo "It's entered!"; 
    } else { 
     echo "There's been a problem: " . mysql_error(); 
    } 
} else { 
    echo "There's already a user with that name: <br />"; 

    $sqlAll = "SELECT * FROM users"; 
    $resultsAll = mysql_query($sqlAll); 
    $row = mysql_fetch_array($resultsAll); 

    while ($row) { 
     echo $row["username"]." -- ".$row["email"]."<br />"; 
     $row = mysql_fetch_array($result); 
    } 
} 
+3

由于您正处于学习过程中,现在是灌输良好编码习惯的绝佳时机。正如以下某些答案中所建议的那样,请阅读[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)并考虑使用抽象层(如PDO)来访问数据。尽管知道如何使用mysql_query()及其同类代码是很好的,但任何面向公共的代码都应尽可能安全。 –

+0

@Justin:当他学习时,我不会建议对SQL进行抽象。一旦他厌倦了SQL,那么就该开始学习ORM等了。 – 2011-11-01 16:58:50

+0

@Muu:尽管抽象层增加了一些复杂性,但最终还是在编写SQL查询(无论是将它们传递给'mysql_query ()'或'$ dbh-> prepare()')。我不认为“学习如何编写SQL查询”和“使用数据库抽象层”是互斥的。 –

回答

0

这并不确切。

如果用户没有 有权访问查询引用的表,则mysql_query()也会失败并返回FALSE。

在你的情况下,你有权限但用户不存在。所以它将返回true,但返回的结果集是空的。

5

Jason,您正在检查查询是否失败 - 而不是它是否返回了值'false'或'true'。您需要拨打mysql_fetch_row或类似名称,然后比较结果。

另外,您可以使用以下方法:

if (mysql_num_rows($result) == 0) { 
    /* User doesn't exist */ 
} else { 
    /* User exists */ 
} 

如果任何用户已被查询选择,这将检测 - 如果他们有 - 你的用户已经存在。

此外,您应该了解输入sanitisation和SQL注入。这是一个非常关键的安全问题,您的脚本很容易受到攻击。 More info here.

0

如果查询没有返回任何数据,mysql_query将返回一个空集。该查询将不会失败。

4

一个没有结果行的select查询STILL返回一个结果句柄。如果查询失败msyql_query()将只返回一个“假”值,由于语法错误,违反约束,等等

你的代码应该是

$sql = "..."; 
$result = mysql_query($sql); 
if ($result === false) { 
    die("QUery failed: " . mysql_error()); 
} 

if (mysql_num_rows($result) == 0) { 
    ... user does not exist ... 
} 

并请请请读了有关SQL注入漏洞。你的代码有足够的空间让卡车通过。

+0

我正在关注一个教程,这是他们的代码,我只是沿着试图学习。我似乎无法得到他们得到的结果。 –

+2

在网上找到的大多数PHP教程都严重过时,它们是为过时的PHP版本编写的,而且是由无法编写代码的人编写的。如果本教程指出“if(!$ result)”适用于“无结果”,那么我建议您永远不要再访问该网站。 –

+0

谢谢Marc B.我一直在头撞墙。 –

1
  1. 在这种情况下,$ result将是一个资源。你应该用mysql_num_rows()检查结果的数量。

  2. 永远不会真的永远不要在查询中使用$ _POST或任何直接用户输入。在使用mysql_real_escape_string()之前,一定要在查询中使用它,否则您将通过SQL注入打开严重的安全问题。

例:

$safe_name = mysql_real_escape_string($_POST["name"]); 
$sql = "SELECT * FROM users WHERE username='$safe_name'"; 
+0

谢谢大家的意见,直到现在我才知道SQL注入。我只是在学习,现在我想学习良好的习惯。我要回到制图板并进一步研究。 –

0

我解决我的问题:

这样

<?php 
$username = $_POST['username']; 

include('config.php'); 
$result = mysqli_query($con,"SELECT * FROM persons WHERE username='$username'"); 

while($row = mysqli_fetch_array($result)){ 

echo $row['username']; 
echo "</br>"; 
echo "</br>"; 
echo "<p><b>Secret Question</b></p>"; 
echo $row['secret']; 

} 
?> 


</br> 
</br> 
<form action="forgetaction.php" method="POST"> 
<p><b>Answer is :</b><p> 
<input type="hidden" name="username" value="<?php echo $username; ?>"> 
<input type="text" name="answer"> 
</br> 
</br> 
<input type="Submit" value="Submit"> 
</form> 


and forget action.php like this : 

<?php 
include('config.php'); 

$username = $_POST['username']; 
echo $username; 

$result = mysqli_query($con,"SELECT * FROM persons WHERE username='$username'"); 
$row = mysqli_fetch_array($result); 

     if($row['answer'] == $_POST['answer']) { 
      echo $row['password']; 
     } else { 
      echo 'wrong!'; 
      } 

?> 

谢谢大家的帮助。