2012-02-25 7 views
0

私は、各ユーザーに固有の配列の大きな(シリアル化された)配列を格納するWebサイトを設定しています。大きな配列がシリアル化され、データベースが新しい値に更新されます。また、新しい配列は、ユーザーがログインしている期間に使用される$ _SESSION []配列に追加されます。大規模な配列でこれらの配列を最大4個まで更新できますが、その後はデータは更新されません正しく更新されているようです。大きすぎるMySQLデータを取得できません

3番目の配列が追加され、$ _SESSION []配列にすべての適切なデータが含まれているように見える場合でも、MySQL UPDATEクエリは1を返しますが、ユーザーがログアウトしてから再び入り込むと、ユーザーがログインするたびに$ _SESSION []配列にコピーする必要があります。これらの配列のうちの4つだけが大きな配列に格納されている場合は、データベースからデータをフェッチできます。私は、データベースフィールドの長さを必要以上に長くしました(そして、それを必要以上に拡大しました)が、役に立たなかった。

phpMyAdminに行くと、シリアル化された配列が(シリアル化された配列の文の途中で)突然停止する配列3の後まで配列が正常に更新されることがわかりますが、これはphpMyAdminは配列の編集ボックスの横に「長さのためにこのフィールドは編集できないかもしれません。」と言っているので、おそらくphpMyAdminは配列の残りの部分を小さなテキストエリアに読み込むことに煩わされません。

この問題を解決する方法はありますか?私が気づいていないことはありますか(私はMySQLの初心者ですが、今までは正常に動作しているようです)。

データベースを更新するために使用されるコードは次のようである:

$_SESSION['data']['user']['templates'][$_SESSION['edit']['templateNo']] = $template; 
$serializedTemplates = mysql_real_escape_string(serialize($_SESSION['data']['user']['templates'])); 
$serializedReports = mysql_real_escape_string(serialize($_SESSION['data']['user']['reports'])); 
$email = mysql_real_escape_string($_SESSION['data']['user']['details']['email']); 
$returned = mysql_query("UPDATE rmusers SET templates='$serializedTemplates', reports='$serializedReports' WHERE email='$email'") or die (mysql_error()); 

[レポート]と[メール]配列の要素は、実際には関係ありません。私は上記の質問に単語「配列」の約25倍を使用していた:)

+1

データベースにはどのようなフィールドがありますか?また、phpMyAdminのデータを(編集する代わりに)表示し、アイコンをクリックして切り捨てられたテキストフィールドを展開することもできます( - > T < - ) –

+0

このデータチャンクの大きさmysqlの "max_allowed_pa​​cket"設定? –

+0

フィールドタイプはテキストです。私は "max_allowed_pa​​cket"設定を認識していませんでした - それは問題かもしれません。どうすれば変更できますか? –

答えて

0

あなた申し訳ありませんが、また

$result = mysql_query("SELECT * FROM rmusers WHERE email='" . $_POST['email'] ."'"); 
$userRow = mysql_fetch_array($result); 
if (strlen(unserialize($userRow['templates'])) > 0) 
{ 
    $_SESSION['data']['user']['templates'] = unserialize($userRow['templates']); 
} 

データベースから配列を取得するために使用されるコードは次のようですフィールドタイプはtextで、最大長は65535文字です。理論上の制限が4GBのlongtextに切り替えます。しかしdocsが言うことを覚えておいてください。

LONGTEXTカラムの有効最大長は、クライアント/サーバープロトコルと使用可能なメモリで構成された最大パケットサイズに依存します。

またmax_allowed_packet設定のマニュアルを参照してください。

のmax_allowed_pa​​cketのプロトコル制限が1ギガバイトです。

+0

ありがとうございます。 longtextの短所は何ですか? –

+0

"4つのテキストタイプには実用的な違いはありません" http://stackoverflow.com/questions/7314682/what-is-the-disadvantage-to-using-a-mysql-longtext-sized-field-when-every-エントリ – Maerlyn

+1

代わりに、 'LARGEBLOB'(または' MEDIUMBLOB'、〜16 MBの制限)を考慮してください。 Blob型はバイナリであり、これはPHPの直列化された文字列であり、さらなる問題を防ぐことができます。 – hakre