2014-10-09 116 views
2

我試圖插入一些數據到使用mysqli函數的表中。MySQLi插入,成功的數據庫連接,但沒有成功插入

function connectDB(){ 
    // configuration 
    $dbuser  = "root"; 
    $dbpass  = ""; 

    // Create connection 
    $con=mysqli_connect("localhost",$dbuser,$dbpass,"my_db"); 

    // Check connection 
    if (mysqli_connect_errno()) { 
     echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
     return false; 
    }else{ 
     echo '<br />successfully connected<br />'; 
     return $con; 
    } 
} 

但是當我嘗試運行我的插入功能我得到什麼數據庫:

我的連接使用以下的罰款。

function newUserInsertDB($name,$email,$password){ 
    $con = connectDB(); 

    // Prepare password 
    $password = hashEncrypt($password); 
    echo $password . "<br />"; 

    // Perform queries 
    mysqli_query($con,"SELECT * FROM users"); 
    mysqli_query($con,"INSERT INTO users (name,email,password,isActivated) VALUES ($name,$email,$password,0)"); 

    // insert 
    mysqli_close($con); 
} 

我一直在尋找通過正確的方式mysqli的函數列表給錯誤,但他們似乎都被關於到數據庫的連接,而不是關於插入成功(我可以清楚地看到我的數據庫,它沒有插入。)

什麼是最好的調試方式?我應該爲我的插入使用哪種錯誤處理?

我試過使用mysqli_sqlstate,它給出了42000的響應,但我在我的聲明中看不到任何語法錯誤。

+0

添加這只是你上面的'$ CON = ...'行'中connectDN()'〜'mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);'。這使* mysqli *函數在遇到任何錯誤時會拋出異常。您可能還需要在'php.ini'文件中設置'display_errors = On'和'error_reporting = E_ALL',然後重新啓動您的web服務器 – Phil 2014-10-09 21:23:41

+0

另外,閱讀本文,瞭解如何使用* mysqli *中的預準備語句。這將幫助你保護來自SQL注入漏洞的查詢〜http://php.net/manual/mysqli.quickstart.prepared-statements.php – Phil 2014-10-09 21:25:18

回答

2

正如我在評論中提及了,你就用事先準備好的聲明會更好。例如...

$stmt = $con->prepare(
    'INSERT INTO users (name, email, password, isActivated) VALUES (?, ?, ?, 0)'); 
$stmt->bind_param('sss', $name, $email, $password); 
$stmt->execute(); 

使用這個,你不必擔心轉義值或提供字符串類型的引號。

總而言之,準備好的語句比嘗試將值插入到SQL字符串中要容易得多且安全得多。

我還建議您將$con變量傳遞到您的函數中,而不是在其中創建它。例如...

function newUserInsertDB(mysqli $con, $name, $email, $password) { 
    // Prepare password 
    $password = hashEncrypt($password); 

    // functions that "echo" can cause unwanted side effects 
    //echo $password . "<br />"; 

    // Perform queries 
    $stmt = $con->prepare(
     'INSERT INTO users (name, email, password, isActivated) VALUES (?, ?, ?, 0)'); 
    $stmt->bind_param('sss', $name, $email, $password); 
    return $stmt->execute(); // returns TRUE or FALSE based on the success of the query 
} 
+0

謝謝,這看起來是最好的方式! – Francesca 2014-10-09 21:32:11

+0

+1;這是正確的方法 – 2014-10-09 21:32:12

1

來自值附近的mysql語句中缺少引號。此外,您應該在將值插入查詢之前將值轉義。做到這一點的方法:

mysqli_query($con,"INSERT INTO users (name,email,password,isActivated) VALUES ('". 
mysqli_real_escape_string($con,$name)."','". 
mysqli_real_escape_string($con,$email)."','". 
mysqli_real_escape_string($con,$password)."',0)"); 

問候

相關問題