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

时间:2015-11-01 23:52:45

标签: php mysqli

我尝试过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 个答案:

答案 0 :(得分: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是一个整数字段。