Php MySQL将散列密码部分视为变量
使用phpass生成哈希,将生成以下字符串:Php MySQL将散列密码部分视为变量,php,mysql,phpass,Php,Mysql,Phpass,使用phpass生成哈希,将生成以下字符串: $2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/cziirli 然后是一个标准查询: "INSERT INTO su_auth ( AuthAlias, AuthUsername, AuthPass, AuthSessionID, AuthIP, AuthUs
$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/cziirli
然后是一个标准查询:
"INSERT INTO su_auth (
AuthAlias, AuthUsername,
AuthPass,
AuthSessionID, AuthIP, AuthUserAgent
)
VALUES (
'Me', 'Myself',
'$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/czIiurLi',
NULL, NULL, NULL
)"
当部分$KHiiru4yzYh141GUh2xIMew
被视为空变量并作为空变量提交(即空值)时,会出现问题。因此,存储的字符串是:$2a$08//bCc7rxMuY1rtDApwA66/cziirli
。在$
之前放置反斜杠是可行的,但显然是不可行的
为什么这会发生在带引号的字符串中?为什么前面的
$
不会触发相同的反应?我能做些什么来防止它?您之所以看到您正在看到的内容,是因为您在查询中使用了。在PHP中,单引号字符串由PHP解释。因此,在您的例子中,PHP读取查询并看到一个变量$KHiiru4yzYh141GUh2xIMew
此变量从未明显设置,因此会在通知中显示:
注意:未定义变量:KHiiru4yzYh141GUh2xIMew in
并且将导致null
(同样是因为变量从未设置)
要查看PHP如何读取字符串,请参见以下内容
现在回答您的问题,为什么其他$
没有被解释为变量。这与PHP变量不是以数字开头这一事实有关。因此PHP知道,$2
永远不能是变量
PHP中的有效变量名:
在PHP中有一种让变量以数字开头的方法:${'2a'}='foo'代码>
因此,您有四种选择来修复代码:
使用单引号
'INSERT INTO su_auth (
AuthAlias, AuthUsername, AuthPass, AuthSessionID, AuthIP, AuthUserAgent
) VALUES (
\'Me\',
\'Myself\',
\'$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/czIiurLi\',
NULL, NULL, NULL
)'
连接
"INSERT INTO su_auth (
AuthAlias, AuthUsername, AuthPass, AuthSessionID, AuthIP, AuthUserAgent
) VALUES (
'Me',
'Myself',
'". '$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/czIiurLi' . "',
NULL, NULL, NULL
)"
为什么直接在查询中使用数据强>
选项四是首选。@PeeHaa我可以这样做,但我也想知道为什么会发生在那部分,而不是另一部分。简单到。好啊如果你愿意,提交答案,我会接受。
"INSERT INTO su_auth (
AuthAlias, AuthUsername, AuthPass, AuthSessionID, AuthIP, AuthUserAgent
) VALUES (
'Me',
'Myself',
'". '$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/czIiurLi' . "',
NULL, NULL, NULL
)"
echo sprintf("INSERT INTO su_auth (AuthAlias, AuthUsername, AuthPass, AuthSessionID, AuthIP, AuthUserAgent) VALUES ('Me', 'Myself', '%s', null, null, null)", '$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/czIiurLi');
$stmt = $connection->prepare('INSERT INTO su_auth (AuthAlias, AuthUsername, AuthPass, AuthSessionID, AuthIP, AuthUserAgent) VALUES (:AuthAlias, :AuthUsername, :AuthPass, :AuthSessionID, :AuthIP, :AuthUserAgent)');
$stmt->execute([
'AuthAlias' => 'Me',
'AuthUsername' => 'Myself',
'AuthPass' => '$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/czIiurLi',
'AuthSessionID' => null,
'AuthIP' => null,
'AuthUserAgent' => null,
]);