2015-11-01 57 views
0

在MySQL數據庫中插入序列化數組我試過mysqli_real_escape_string()的無窮無盡的變化,以在我的一個表中插入一個簡單的數組。該列的內容每次都是空白的。如何使用mysqli_real_escape_string()

任何人都可以看到這個查詢有什麼問題嗎?

$accessRights = array(
    'S-01' => 'Y', 
    'S-02' => 'Y', 
); 
$accessRights = serialize($accessRights); 

mysqli_query($GLOBALS['db_link'], 'SET NAMES "utf8"'); // to ensure proper encoding of special characters 
$query_string = ' 
    UPDATE users_accessRights 
    SET 
    accessRights = "' . mysqli_real_escape_string($accessRights) . '" 
    WHERE userID = "' . $_POST['userID'] . '" 
    LIMIT 1 
'; 
mysqli_query($GLOBALS['db_link'], $query_string) or die(mysqli_error($GLOBALS['db_link'])); 

注:我可以使用此查詢插入一個簡單的文本字符串到表中,所以我知道查詢本身的作品。

+1

爲什麼不救自己所有這些麻煩,並使用帶有綁定參數的準備語句?此外,你應該使用['mysqli_set_charset()'](http://php.net/manual/mysqli.set-charset.php)而不是'SET NAMES'查詢 – Phil

+1

好棒@Phil - 我喜歡''節省自己的麻煩_。 ..現在問題是你的建議是什麼意思,我該怎麼做呢? –

回答

2

在我看來,你沒有足夠的錯誤報告啓用注意到你的代碼中的語法錯誤。 mysqli_real_escape_string()要求兩個的論點,而不是一個。你應該確保你的開發環境的php.ini具有以下條目設置

error_reporting = E_ALL 
display_errors = On 

或者,把這個在你的腳本的頂部,但刪除了生產

ini_set('display_errors', 'On'); 
error_reporting(E_ALL); 

更好的辦法用變量/用戶輸入創建查詢是prepared statements。例如

// set mysqli to throw exceptions so you don't have to check return 
// values for false or use "or die" 
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

$mysqli = $GLOBALS['db_link']; // I suggest you avoid using globals like this ASAP 

$mysqli->set_charset('utf8'); 

$stmt = $mysqli->prepare(
    'UPDATE users_accessRights SET accessRights = ? WHERE userID = ? LIMIT 1'); 
$stmt->bind_param('si', $accessRights, $_POST['userID']); 
$stmt->execute(); 

這裏假設userID是一個整數字段。

+0

不錯,我會試試看 - 謝謝@Phil ...(是的,userID是一個整數 - 關鍵字段) –

+0

@ H.Ferrence很酷,這就是「si」中的「i」 (「s」代表「字符串」)。讓我知道你如何去,並確保你閱讀準備好的聲明快速入門指南,以便更深入地瞭解。 – Phil

+0

謝謝@Phil。我通過'mysqli_real_escape_string($ GLOBALS ['db_link'],$ accessRights)'得到了它的工作。我需要查看準備好的聲明並開始瞭解該方法。感謝您的幫助和提示。 –

相關問題