2014-12-29 152 views
0

我是新來的PHP和SQL和所有的東西,我在看YouTube上的論壇在YouTube上的教程,並想知道爲什麼這個代碼不提交表單時回聲「成功」 。我也想知道爲什麼它在我提交表格之前回應失敗。我已成功連接到數據庫。提交表單,MySQL和PHP

<!DOCTYPE HTML> 
<html> 
    <head> 
     <title>Register</title> 
    </head> 
    <body> 
     <form action="register.php" method="POST"> 
      Username: <input type="text" name="username"> 
      <br/> 
      Password: <input type="password" name="password"> 
      <br/> 
      Confirm Password: <input type="password" name="confirmPassword"> 
      <br/> 
      Email: <input type="text" name="email"> 
      <br/> 
      <input type="submit" name="submit" value="Register"> or <a href="login.php">Log in</a> 
     </form> 
    </body> 
</html> 
<?php 
    require('connect.php'); 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $confirmPassword = $_POST['confirmPassword']; 
    $email = $_POST['email']; 

    if(isset($_POST["submit"])){ 
     if($query = mysql_query("INSERT INTO users ('id', 'username', 'password', 'email') VALUES('', '".$username."', '".$password."', '".$email."')")){ 
      echo "Success"; 
     }else{ 
      echo "Failure" . mysql_error(); 
     } 
    } 
?> 

Connect.php

<?php 

$connect = mysqli_connect("localhost", "root", "") or die("Could not connect to server!"); 
mysqli_select_db($connect, "php_forum") or die("Could not connect to database!"); 

?> 
+4

[**請勿在新代碼**中使用'mysql_ *'功能](http ://bit.ly/phpmsql)。他們不再被維護[並且被正式棄用](http://j.mp/XqV7Lp)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。此外,此代碼*開放給[SQL注入](http://bobby-tables.com/)。 – esqew

+0

顯示您的connect.php – iatboy

回答

4

有幾件事錯在這裏。

您使用的是在您的列(並且是引號)錯誤identifiers

('id', 'username', 'password', 'email') 

刪除

(id, username, password, email) 

或使用反引號

(`id`, `username`, `password`, `email`) 

mysql_error()應該有拋出一個錯誤,但它並不是因爲:

  • 您正在混合MySQL API與mysqli_連接,然後在您的查詢中使用mysql_

這兩種不同的API不會相互混淆。

使用mysqli_完全改變你的當前查詢:

if($query = mysqli_query($connect, "INSERT... 

,改變mysql_error()mysqli_error($connect)

,作爲該塊重寫:

if(isset($_POST["submit"])){ 
    if($query = mysqli_query($connect,"INSERT INTO users ('id', 'username', 'password', 'email') VALUES('', '".$username."', '".$password."', '".$email."')")){ 
     echo "Success"; 
    }else{ 
     echo "Failure" . mysqli_error($connect); 
    } 
} 

只是爲了測試錯誤, m按照上面概述的方式改變這些變化,同時按照現在的方式保留列中的引號。然後你會看到MySQL會拋出的錯誤。然後,您可以像上面已經概述的那樣去除列名稱周圍的引號,或者用反引號替換它們。

您看到的教程可能使用了反引號,但可能無法區分足以讓您知道它們確實是反引號而不是單引號。

但是,您現在的代碼對SQL injection開放。使用mysqli with prepared statementsPDO with prepared statements,他們更安全


我注意到你可能用純文本存儲密碼。如果是這樣的話,它是非常不鼓勵的。

我建議你使用CRYPT_BLOWFISH或PHP 5.5的password_hash()函數。對於PHP < 5.5使用password_hash() compatibility pack


此外,而不是這樣做的:

$connect = mysqli_connect("localhost", "root", "") or die("Could not connect to server!"); 
mysqli_select_db($connect, "php_forum") or die("Could not connect to database!"); 

你應該檢查錯誤,而不是,就像手冊指出

$link = mysqli_connect("myhost","myuser","mypassw","mybd") 
or die("Error " . mysqli_error($link)); 

所以你的情況:

$connect = mysqli_connect("localhost", "root", "","php_forum") 
or die("Error " . mysqli_error($connect)); 

編輯:和我改變action="register.php"action=""由於您使用在同一頁內的全部代碼。

<!DOCTYPE HTML> 
<html> 
    <head> 
     <title>Register</title> 
    </head> 
    <body> 
     <form action="" method="POST"> 
      Username: <input type="text" name="username"> 
      <br/> 
      Password: <input type="password" name="password"> 
      <br/> 
      Confirm Password: <input type="password" name="confirmPassword"> 
      <br/> 
      Email: <input type="text" name="email"> 
      <br/> 
      <input type="submit" name="submit" value="Register"> or <a href="login.php">Log in</a> 
     </form> 
    </body> 
</html> 
<?php 
    require('connect.php'); 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $confirmPassword = $_POST['confirmPassword']; 
    $email = $_POST['email']; 

    if(isset($_POST["submit"])){ 
     if($query = mysqli_query($connect,"INSERT INTO users (`id`, `username`, `password`, `email`) VALUES ('', '".$username."', '".$password."', '".$email."')")){ 
      echo "Success"; 
     }else{ 
      echo "Failure" . mysqli_error($connect); 
     } 
    } 
?> 
+0

謝謝,它現在呼應「成功」。感謝安全提示,我會使用它,但現在我只是試着做一些簡單的工作。任何想法爲什麼代碼在我提交表單之前運行? –

+0

@EmilØgård不客氣。我看不出爲什麼查詢會運行,怎麼你有條件語句'if(isset($ _ POST [「submit」]))''。你確定你使用的是相同的代碼,並且提交按鈕是按照你現在的名字命名的嗎? –

+0

@EmilØgård您還應該從表單中刪除'或Log in',並將其放在表單標記之外。這可能是原因。你是否保留了'if(isset($ _ POST [「submit」]))'?重新加載以查看我在**下的更改,作爲該塊的重寫:** –

0

:它將呼應;故障」,因此執行這段代碼

else{ 
      echo "Failure" . mysql_error(); 
     } 

只要$ _ POST [‘提交’])未設置並且將不設置任何時候你打開你頁面(即使您從Google搜索結果的書籤中導航到它),或者當您在GET模式下提交FORM時