0

phpass を使用してハッシュを生成すると、次の文字列が生成されます。

$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/czIiurLi

次に、標準クエリ:

"INSERT INTO su_auth ( 
                      AuthAlias, AuthUsername, 
                      AuthPass, 
                      AuthSessionID, AuthIP, AuthUserAgent
                    )
                    VALUES ( 
                      'Me', 'Myself',         
                      '$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/czIiurLi', 
                       NULL, NULL, NULL
                    )"

$KHiiru4yzYh141GUh2xIMewその部分が空の変数として表示され、そのように送信されると (つまり、null 値)、問題が発生します。したがって、格納される文字列は次のようになります$2a$08//bCc7rxMuY1rtDApwA66/czIiurLi。作品の前にバックスラッシュを置くことはできます$が、明らかに実現不可能です。

引用符で囲まれた文字列内でこれが発生するのはなぜですか? $前の が同じ反応を引き起こさないのはなぜですか? それを防ぐにはどうすればよいですか?

4

1 に答える 1

1

表示されているものが表示されている理由は、クエリに二重引用符で囲まれた文字列を使用しているためです。PHP では、一重引用符の文字列は PHP によって解釈されます。したがって、あなたの場合、PHP はクエリを読み取り、 variable を確認します$KHiiru4yzYh141GUh2xIMew

この変数は明らかに設定されることはなく、吸うと通知が表示されます。

Notice: 未定義変数: KHiiru4yzYh141GUh2xIMew in...

結果はnull(変数が設定されていないため)になります。

PHP が文字列を読み取る方法については、この説明ページを参照してください。

なぜ他の$変数が変数として解釈されないのかという質問に答えましょう。これは、PHP 変数が数字で始まらないことに関係しています。したがって、PHP$2は決して変数にならないことを知っています。

PHP で有効な変数名は次のようになります。

[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

ただし、PHP で変数を数字で開始する方法があります。${'2a'} = 'foo';

したがって、コードを修正するには 4 つの選択肢があります。

一重引用符を使用する

'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
 )"

スプリント

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

オプション 4 が優先されます。

于 2014-05-03T13:06:05.737 に答える