PHP5.4 からの upload_progress と Zend_Session

PHP5.4からsession.upload_progressが使用できるようになりました。詳しくは検索!もしくはこちら
けっこう簡単に素敵なアップロード画面を作ることができるようになりました。

ただ…
Zend_Sessionと併用はできないようです。 (↓訂正)

名前が session.upload_progress.name の値を持つPOSTを受け取った時点で、どうも session_start しているようです。

Zend_Sessionを使う場合は php_value session.auto_start 0 にして勝手にsession_startを呼ばないでねっていうZend_Sessionとの約束は守れません。

なので、Zend_Auth を認証に使ってたら new Zend_Auth_Storage_Session() で怒られます。
「session has already been started by session.auto-start or session_start() 」

ドハマリ数時間の結論は、併用不可。アップロード画面はZend_Session、Zend_Authを使用せず、別の方法で認証してupload_progressを優先することにします。(↓訂正)

— 訂正 —
なんということでしょう。結構簡単に実装できちゃいました。Zendの設計者スバラシイ。
Zend_File_Transfer_Adapter_Http  あたりが答えです。
情報は少なくなりますが、このあたり(stackoverflow)が参考になります。

クリックで表示するFAQ

質問一覧が表示されてて、質問をクリックしたら回答が表示されるアレ。
デモ↓

質問質問質問質問質問質問

答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え

質問質問質問質問質問質問

答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え

質問質問質問質問質問質問

答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え答え

 

jQuery(function($){
	$(".accordion-toggle").css("cursor","pointer");
	$(".accordion-toggle").next().css("display","none");
	
	$(".accordion-toggle").on("click", function() {
		$(this).next().slideToggle();
	});
});

 

質問質問質問質問質問質問

 

[ IE6対策 ] 選択していないsubmitのnameとvalueが送信されてしまう対策

忘れたころにやって来るIE6対応のWEB。。。

<form method=”post”>
<input type=”submit” name=”cmd” value=”追加” />
<input type=”submit” name=”cmd” value=”編集” />
<input type=”submit” name=”cmd” value=”削除” />
</form>

追加をクリックしたら、cmd=追加 のみ送信してほしいですよね。
ところが、IE6の場合は、クリックしていない ボタン の値を全て送信してくれます。クリックしたボタンで処理を分けたい場合は致命的です。

毎回はハマって時間を費やしてしまうのでメモ。さすがにdisabled は機能してくれます。

$(function(){
	//選択していないsubmitのname=valueが送信されてしまうIE6対策
	$('input[type=submit],button[type=submit]').click(function(){
		$('input[type=submit],button[type=submit]').attr('disabled','disabled');
		$(this).removeAttr('disabled');
	});
});

XAMPP on mac  ファイルアップロードサイズが変更できない!?

XAMPP on mac にて、ファイルアップロードサイズの変更が適用されず、3時間消費

【定石】ファイルアップロードサイズの変更

[php.ini] の場合
post_max_size 4096M
upload_max_filesize 4096M
max_input_time -1

[.htaccess] の場合
php_value post_max_size 4096M
php_value upload_max_filesize 4096M
php_value max_input_time -1

2GB以上の対応

filesize()関数が返す値が負の値になってしまうので、符号なしに変換してあげます。
$size = sprintf(‘%u’,filesize($path));

4GB以上のファイル

filesize($path)  0ゼロが返ってくるため、扱うことができません。

 

開発環境 XAMPP on Windows7(64bit)  ではパーフェクトなのにどういうこと??

XAMPP on mac では適用されません。

 

解決策

4096M」の記載を 「4294967296」(=4096×1024×1024)に変更すると認識してくれます。

 

時は金なり…。Google先生、同じところでハマっている人の検索結果に、どうか表示してあげてください!

MySQL のサブクエリが遅い!!

鉄則

MySQLでは 「IN」 にサブクエリを使わない。
FROM 句に全て並べる!

(例)この商品を買った人はこんな商品も購入しています!

SELECT item_id FROM order
INNER JOIN order_detail ON order.id = order_detail.order_id
WHERE customer_id IN (
SELECT customer_id FROM order_detail

(↑↑クラッシュしたのかとビックリするほど時間がかかります)

INを使わずFROM句で。

SELECT item_id FROM order,order_detail,(
SELECT customer_id FROM order_detail

)  AS tbl1
WHERE order.id = order_detail.order_id
order.customer_id = tbl1.customer_id

(サクサクです)

 

(参考)なぜMySQLのサブクエリは遅いのか。

ADO.NET C#で エクセルファイル(xls)を読み込む

C#でエクセルファイルを読み込む場合の参考ソース。Jet OLE DBプロバイダを使用するのが一般的なようです。

        String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
            "Data Source=" + Server.MapPath(filePath) + ";" +
            "Extended Properties=\"Excel 8.0;\"";
        OleDbConnection objConn = new OleDbConnection(sConnectionString);
        objConn.Open();
        OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM ItemMaster", objConn);
        OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
        objAdapter1.SelectCommand = objCmdSelect;
        DataSet objDataset1 = new DataSet();
        objAdapter1.Fill(objDataset1, "XLData");

ただ、現在のバージョンでは注意が必要です。

データ型について

従来のデータベースとは異なり、Excel テーブルの列に直接データ型を指定する方法はありません。OLE DB プロバイダが列内の 8 行をスキャンして、そのフィールドのデータ型を推測します。スキャンする行数は、接続文字列の拡張プロパティで、MAXSCANROWS の設定に 1 ~ 16 の値を指定することで変更できます。

だそうです。自動で「数値型」と認識された列に、文字列が入り込んでいる場合、なんと!「データなし」とされてしまいます。

ならば、データ型の推測対象をヘッダ行のみにすれば、すべて文字列型として認識されるはず。

Extended Properties="Excel8.0;HDR=NO;MAXSCANROWS=1;"

結果は同じでしたorz.. MAXSCANROWS 効かない。。。セルの書式設定を「文字列」にしてもやっぱり、数字のみで文字列を読み込みません。

別角度の対策が必要そうです。