私はデータベースベースのセッションストレージソリューションを持っています。よく働く!私はしかし、それは特定の種類のデータを格納する問題があります。mysql dbエラーに格納されたPHPのシリアル化されたデータ
CSRFトークンを使用するアプリケーションがあります。フォームが作成されると、そのフォームのトークンが作成されます。トークンは、異なるタイプの値のハッシュ値(sha256)です。 1つのコピーがフォームに送られ、別のコピーがセッションに保管されます。フォームを送信すると、トークンが比較され、一致することが確認されます。
は以下
UPDATE session_manager SET variables= :variables WHERE 1=1 AND id = :id
array(2) {
[":variables"]=>
string(152) "a:1:{s:4:"CSRF";a:1:{s:8:"register";a:2:{s:5:"token";s:64:"e749603241dec1911ef3a40d98b2f5185d389434060483297394b504cc904ede";s:4:"time";i:1443456816;}}}"
[":id"]=>
string(2) "49"
}
UPDATE文が細かいと正常に動作し、新しいデータでデシベルを更新破壊関数の例です。これは私が持っている問題ですが、データは更新されますが、上記のデータで見ることができる 'トークン'の値は以下のdbの値とは異なります(これはデータのバイナリダウンロードです):
a:1:{s:4:"CSRF";a:1:{s:8:"register";a:2:{s:5:"token";s:64:"b48fc79fc2f51eff765c05476895238a42d9d45b2c1aeb7c6e4582d0381b7f4f";s:4:"time";i:1443456817;}}}
これは、mysqlが値を変更しているように見えますが、私の人生では問題を理解できません。私が試したソリューションが含まれます:
- シリアル化
- json_encode
- base64で
変更デシベルの文字セットとものではありません。 TEXT、Longtext、BLOBなど、データベース内のさまざまなフィールドタイプを試してみました。デシベル
CREATE TABLE session_manager(
id BIGINT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
session_id VARCHAR(200),
user_agent TINYTEXT NOT NULL,
variables BLOB NOT NULL,
initial_time DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
regenerate_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL
);
気にポップいかなる理由でもSQLが私のために動作するようには思えない:(
ここにいるのですか?
MySQLがあなたの価値を変えているとは思いません。あなたの更新プログラムにあなたのPHPコードの別の文字列を与える必要があります...あなたはあなたの更新のために準備されたステートメントを使っています...更新ステートメントの直前で 'echo $ tokenValue;'を試して、値を確認してください –
update文の後にdbクエリを実行する前にバインドされたparamsをダンプします。 – Tim
'Text 'を型として使うと、問題は解決しないかもしれませんが、それは問題解決の提案の1つです。私はそれに直面した。 –