2015-11-01 39 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)'得到了它的工作。我需要查看准备好的声明并开始了解该方法。感谢您的帮助和提示。 –

相关问题