Php 如何使用mysqli_real_escape_string()在MySQL数据库中插入序列化数组

Php 如何使用mysqli_real_escape_string()在MySQL数据库中插入序列化数组,php,mysqli,Php,Mysqli,我尝试了无数的mysqli\u real\u escape\u string()变体,在我的一个表的列中插入一个简单数组。该列的内容每次都为空 有人能看出这个查询有什么问题吗 $accessRights = array( 'S-01' => 'Y', 'S-02' => 'Y', ); $accessRights = serialize( $accessRights ); mysqli_query( $GLOBALS['db_link'], 'SET NAMES "utf8

我尝试了无数的
mysqli\u real\u escape\u 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'] ) );

注意:我可以使用此查询在表中插入一个简单的文本字符串,因此我知道查询本身是有效的。

在我看来,您没有足够的错误报告功能来注意代码中的语法错误。需要两个参数,而不是一个。您应该确保开发环境的
php.ini
设置了以下条目

error_reporting = E_ALL
display_errors = On
或者,将其放在脚本顶部,但将其删除以用于生产


使用变量/用户输入创建查询的更好方法是。比如说

// 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
是一个整数字段。

为什么不省去这些麻烦,使用一个带绑定参数的预处理语句呢?另外,您应该使用而不是
设置名称
queryTerrific@Phil-我喜欢省去自己的麻烦。。。现在的问题是,你的建议是什么意思,我该怎么做?很好,我会尝试一下--谢谢@Phil…(是的,userID是一个整数--关键字段)@H.Ferrence cool,这就是“si”中的“I”的意思(“s”代表“string”)。让我知道你是怎么做的,并确保你阅读了准备好的声明快速入门指南,以便更深入地理解。谢谢@Phil。我通过mysqli\u real\u escape\u字符串($GLOBALS['db\u link'],$accessRights)
实现了它。我需要研究准备好的陈述,并开始理解这种方法。谢谢你的帮助和提示。
// 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();