Php MySQL将散列密码部分视为变量

Php MySQL将散列密码部分视为变量,php,mysql,phpass,Php,Mysql,Phpass,使用phpass生成哈希,将生成以下字符串: $2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/cziirli 然后是一个标准查询: "INSERT INTO su_auth ( AuthAlias, AuthUsername, AuthPass, AuthSessionID, AuthIP, AuthUs

使用phpass生成哈希,将生成以下字符串:

$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,
]);