我尝试过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'] ) );
注意:我可以使用此查询在表中插入一个简单的文本字符串,因此我知道查询本身有效。
答案 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
是一个整数字段。