2015-07-19 37 views
0

update1:​​我嘗試了所有的建議(很欣賞順便說一句),但執行仍然沒有通過顯示「更新0行」。我嘗試了多種方法來解決這個問題,但似乎沒有任何效果。如何使用準備好的語句來更新表格而不是沒有準備的形式

這裏是我此刻的代碼:

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

     $updateCD = "UPDATE users SET lgs=?, its=?, hbs=?, bios=?, pls=?, cts=? WHERE email=?"; 
     $stmt = $con->prepare($updateCD); 

     $stmt->bind_param('sssssss', $_POST['lgs'], $_POST['its'], $_POST['hbs'], $_POST['bios'], $_POST['pls'], $_POST['cts'], $_GET['email']); 
     $stmt->execute(); 

      if ($stmt->errno) { 
    echo "FAILURE!!! " . $stmt->error; 
     } 
    else { 
    echo "Updated {$stmt->affected_rows} rows"; 

     $stmt->close(); 

    } 

     } 

我想用預處理語句代替我的基本SQLI查詢,以提高我的代碼的安全性。

此UPDATE語句涉及更新數據庫中用戶的配置文件信息。問題是,儘管我遵循的模型,更新執行沒有通過,從而在數據庫中沒有任何改變。

PHP代碼:關閉後

$email_login = mysqli_real_escape_string($con, $GET['email']); 
    $lg = mysqli_real_escape_string($con, $_POST['lgs']); 
    $it = mysqli_real_escape_string($con, $_POST['its']); 
    $hb = mysqli_real_escape_string($con, $_POST['hbs']); 
    $bio = mysqli_real_escape_string($con, $_POST['bios']); 
    $pl = mysqli_real_escape_string($con, $_POST['pls']); 
    $ct = mysqli_real_escape_string($con, $_POST['cts']); 

    if(isset($_POST['Done'])) { 
    $updateCD = "UPDATE users SET lgs=?, its=?, hbs=?, bios=?, pls=?, cts=? WHERE email=?"; 
    $stmt = $con->prepare($updateCD); 

     $stmt->bind_param('sssssss', $lg, $it, $hb, $bio, $pl, $ct, $email_login); 
     $stmt->execute(); 

     if ($stmt->errno) { 
    echo "FAILURE!!! " . $stmt->error; 
     } 
    else { 
    echo "Updated {$stmt->affected_rows} rows"; 

     $stmt->close(); 

    } 

     } 

注:我明白爲什麼它可能看起來,如果這個問題是類似的另外一個,但絕不是它的精確複製。所提到的問題涉及更新一般的表格,而這個問題放大了使用預處理語句來執行更新。我已經知道如何在不使用預處理語句的情況下更新表,所以我想用更可靠的框架來提高我的代碼語法。雖然這兩個問題都是相關的,但他們有不同的範圍。

+0

什麼錯誤你得到了嗎? – Mureinik

+0

@Mureinik我不斷收到「更新0行」 – CodeMerchant

+0

execute()方法的返回值是什麼?如果它是'假',則呼叫失敗。 [見文檔](https://secure.php.net/manual/en/mysqli-stmt.execute.php)。 – halfer

回答

2

您的$email_login變量爲空;即使通過GET獲取,也必須使用$_GET,而不是$GET

正如各種意見所述,不要使用mysqli_real_escape_string,因爲可靠的轉義是由MySQLi自己完成的。只需將$_POST變量直接作爲bind_param的參數傳遞。

一些額外的想法:

+0

嗨,我按照你的建議,但問題仍然存在。我已經更新了OP。 – CodeMerchant

+0

您必須認真對待準備好的語句以及超全局變量$ _GET等等有更多的工作。否則將來會遇到所有其他類型的怪異事件。試用和錯誤地使用$ _SESSION是毫無意義的。誠然,價值可能存儲在那裏,但如果你不明白爲什麼,你會錯過非常重要的基礎知識。這並不意味着阻止你。您將從這種理解中獲益良多,就您未來面臨的每個與網絡相關的任務而言,通過所有方式,不僅僅是PHP相關。投入時間。 – stef77