2011-11-01 137 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!'; 
      } 

?> 

謝謝大家的幫助。