2014-12-03 24 views
0

我在與我創建(僅用於測試目的,我知道這是容易受到SQL注入)一個形式的問題PHP的形式不插入值到數據庫

基本上,形式不插入到數據庫,但它似乎在劇本上回歸真實。

的代碼如下:

form.php的

<form action="create.php" method="post"> 
     <p>Username: <input type="text" name="username" /> 
     </p> 
     <p>Password: <input type="password" name="password" /> 
     </p> 
     <p><input type="submit" value="Create" name= "cre" /> 
     </p> 
    </form> 

create.php

<?php 
session_start(); 
$dbname = "obsidian"; 

if(isset($_POST['cre'])){ 


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

    $mysqli = new mysqli('localhost','admin1', 'password1','obsidian') or die('Failed to connect to DB' . $mysqli->error); 

    $hashed_password = password_hash($password,PASSWORD_DEFAULT); 

     $registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 
     if($registerquery = true) 
     { 
      echo "<h1>Success</h1>"; 
      echo "<p>Your account was successfully created. Please <a href=\"index.php\">click here to login</a>.</p>"; 
     } 
     else 
     { 
      echo "<h1>Error</h1>"; 
      echo "<p>Sorry, your registration failed. Please go back and try again.</p>";  
     }  
    } 


    ?> 

我得到了成功的消息,但正如我所說,價值沒有得到插入到數據庫中。

任何幫助都會很好。

+2

永遠不會在數據庫上運行插入查詢。 – Pitchinnate 2014-12-03 19:04:45

+4

...你很容易受到[sql注入攻擊](http://bobby-tables.com) – 2014-12-03 19:06:20

+0

你有沒有區別=和==? – bksi 2014-12-03 19:07:48

回答

6

這定義了查詢,但確實運行:

$registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 

的這個是不是 「試驗」 成功。它只是看到變量設置爲true:

if($registerquery = true) 

=是分配,==是平等的測試。

+0

是的,它仍然需要'prepare()','bind_param()'和'execute()'調用。 – tadman 2014-12-03 19:14:48

1

您錯過了將SQL查詢實際交給數據庫的步驟。

$mysqli->query($registerquery); 

必須在它被插入之前運行。

你也可以改變你的if語句下面

if ($mysqli->query($registerquery)) 

此外,您目前正在使用一個單一的=,這是設置$registerquery,而不是檢查它的價值。

1

所有你正在做的事情:

$registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 
if($registerquery = true) 

樹立了一個字符串,然後再串設置爲true。這總是會回到真實的。有兩個問題:

  • 您需要執行存儲在字符串中的SQL語句,以便在數據庫中發生任何事情。
  • 你並沒有真正檢查返回值(「==」),而是使用「=」,它只是簡單地設置變量。一個非常常見的錯誤。

此外,您應該不再使用內置函數中的mysqli,因爲它們很快就會被棄用。我建議在進一步移動之前切換到PDO

+0

他實際上沒有檢查它 – ofrommel 2014-12-03 19:07:37

+0

正確指出並編輯。最重要的一點仍然是,他沒有執行任何SQL語句。不確定這是否值得倒戈。 – 2014-12-03 19:10:34

+0

我沒有downvote。不知道是誰做的,但我的回答也被低估了,所以我刪除了它,因爲周圍顯然有太多愚蠢的人。 – ofrommel 2014-12-03 19:11:24

3

你必須查詢該數據庫。試試這個:

$registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 

if ($mysqli->query($registerquery)) 
{ 
    // success. 
} 
else 
{ 
    // failed. 
} 

下面是文檔:http://php.net/manual/en/mysqli.query.php

1

形式上,你應該做這樣的事情:

if(isset($_POST['cre'])){ 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $mysqli = new mysqli('localhost','admin1', 'password1','obsidian') or die('Failed to connect to DB' . $mysqli->error); 

    $hashed_password = password_hash($password,PASSWORD_DEFAULT); 

    $registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 
    $stmt=$mysqli->prepare($registerquery); 
    if($stmt->execute()) 
    { 
     echo "<h1>Success</h1>"; 
     echo "<p>Your account was successfully created. Please <a href=\"index.php\">click here to login</a>.</p>"; 
    } 
    else 
    { 
     echo "<h1>Error</h1>"; 
     echo "<p>Sorry, your registration failed. Please go back and try again.</p>";  
    }  
    $stmt->close(); 
} 

此外,您可以只調用mysqli_query

if($mysqli->query($registerquery)){ 
.... 
} 

這將是足夠的。如果需要綁定參數並使用不同的值對同一查詢進行多次調用,則第一個調用會更好。

Regards.-