【PHP】質問スレッドpart16【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/04/07 01:06ID:HTcWOpWf上級者用や雑談スレを立てたくなった場合は後から適宜立ててください。
■本家
http://www.php.net/
■日本 PHP ユーザ会
http://www.php.gr.jp/
■PHP マニュアル
http://www.php.net/manual/ja/
■PEAR マニュアル
http://pear.php.net/manual/ja/
過去スレ, 関連スレ及び注意事項等は、 あふぉが居なけりゃ>>2-5
0554nobodyさん
04/04/30 21:49ID:???最初の
<? $CPU_start=microtime(); ?>
で時刻をとっておいて、最後にまた時刻を取得して引き算。
list($tmp1,$tmp2)=split(" ",$CPU_start);
list($tmp3,$tmp4)=split(" ",microtime());
ここら辺の処理は違う方法があるきがするが。
0555nobodyさん
04/04/30 22:50ID:???array_randを使う。
4.2.0以降ならsrandも不要なので、seedの質に気を使う必要も無い。
>>554
Perlだと$^Tとかあるけど(1秒単位だからあまり意味無いかもしれないが)、
PHPには無いから普通は>>554の方法かな。
0556nobodyさん
04/05/01 01:23ID:???"C P U"
いかにも厨臭いな
0557nobodyさん
04/05/01 03:34ID:???で、質問といいますか相談というのは、
自分が普通に考えると、1000件を越えるまではfopenのモード 'r+' で単純に頭に行を足していって、
1000件を越えて以降は、file( )で1000行分を配列に読み込んで、
頭に新規アクセスをunshift、末尾をpopすればよいのではないかと考えました。
でも、よく考えると一件のアクセスを記録するために、毎回file( )で1000件分を配列化するのって、
大変無駄なような気がするんですが、どうなんでしょうか?
もっとスマートに書く方法がありますか?
1000件ごとにログを別ファイル化、などせずに良い方法がありましたら、
どうかお聞かせください。
というかPHP様にとっては1000行の配列化くらいなら大した手間ではないのかもしれませんが…。
アドバイスよろしくおねがいします。
0558nobodyさん
04/05/01 03:45ID:???ただし壊れにくさのためには早朝4時とかにログをローテートさせるべき。
0559nobodyさん
04/05/01 04:15ID:???行っていうのは人間が分かりやすい区分の仕方で、
PHP様にとっては\rなり\nなりの文字が含まれているだけにすぎない。
逆を言うと、ファイルを配列に取り込むにはファイル全部を舐めて
\rなり\nなりを検索して行ってるわけやね。
一方ファイル操作にはファイルポインタ(今ファイル中のどこを読んでるか、
書いてるかを示す位置情報)という概念があって、
ファイル中の特定の場所を操作するのに便利に使える。
この2つことから、別ファイルにファイルポインタ用の行の切れ目の場所を保存しておくと、
1行目・1000行目の取り出しが高速に行えることが分かると思う。
ところが、この別ファイルもまた1000行分あるわけで、そうなるとこれも高速化する必要がでてくる。
高速化のためにこれにもファイルポインタを活用しうわなにするんだやめr
0562nobodyさん
04/05/01 16:04ID:l1Yr02pcPHPlibって今はあんまり使われてないんだろうか?
セッション管理はしてくれるし、DBに依存しないコーディングができるから良いと思ったんだが。
0563nobodyさん
04/05/01 16:58ID:dBD1NpKI0564nobodyさん
04/05/01 17:27ID:???0565nobodyさん
04/05/01 17:33ID:dBD1NpKIやりかたがよくわかりません。。
やりたいことですがPHPでアップロードした複数の画像ファイルを
一括でダウンロードしたのです。ダウンロードは管理人のみです。
dir以下のダウンロードというのはできませんよね?
0566nobodyさん
04/05/01 17:37ID:???というのも思いつきました。これでよいかな。
PHP関係ないけど・・。
0567nobodyさん
04/05/01 17:49ID:???0568nobodyさん
04/05/01 18:22ID:???php-users MLで複数の案が出てたよ。
まっとうなやり方は無いのでどうしてもやりたいなら代替案で、って感じだったけど。
http://ns1.php.gr.jp/pipermail/php-users/2004-March/021535.html
0570nobodyさん
04/05/01 18:55ID:???0571nobodyさん
04/05/01 21:06ID:???新規のリンクが確立されるのではなく、代わりにすでに
オープンされた リンクのリンクIDが返されます。
オープンはこれでいいんだけど、これだとクローズするとき困る。
すでにオープンされてたら新規にオープンせずに既存のを使い
そのかわりクローズもしないで処理を抜ける とか出来ねーじゃん!
すでにオープンされているかどうか を調べる方法はないの?
0572nobodyさん
04/05/01 21:36ID:???ちゃんとドキュメント読んだか?
0573nobodyさん
04/05/01 22:25ID:h+ty9Fa60574nobodyさん
04/05/01 23:31ID:???PHP自体には、DBコネクションプーリングの機能はないよ。
他にプーリングサーバ設けて、それ使う。それでも
PHP-プーリングサーバ間のコネクションは持続できないけど。
0575nobodyさん
04/05/01 23:32ID:???取り合えずマニュアルの画像系の関数を調べたら?
サンプルも載ってるし。書き出しはUnysys特許の絡みで
サポートしてないバージョンもあるから、Imagemagick
使うのがいいだろね。まあバイナリー自力で操作する
手もあるけど。一般的なフォーマットの扱いだけなら
標準関数か外部ツールを使った方がいい。
0576nobodyさん
04/05/02 01:06ID:ChuRnvJnとりあえず、定型の部分(ヘッダー、フッター)とひと月経つと
次ページへ移動させるコンテンツは別ファイルにして、includeで
ページを構成させることにして、更新の負担軽減化を図れることが
わかり、一部実行しました。
PHP初心者が次に使えそうなテクニックってどんなのがありますか?
0578nobodyさん
04/05/03 03:31ID:11Jyjr9/phpのマニュアルにプリンタ関数はWindows 9.x, ME, NT4, 2000しか使えないと書いて有るのですが、
XPでphp_printer.dllを入れてとりあえずは動きますが、printer_draw_bmpという関数だけプリント
されないのです・・。
やっぱり駄目な物は駄目?
webで入力されたデータを印刷して、入力者に返したいのですが、ロゴなど入っていた方がカッコ良い
な・・なんて思っているのですが・・。
0579nobodyさん
04/05/03 11:14ID:???0581nobodyさん
04/05/03 15:31ID:???サーバの設定により、domxmlを使えないみたいなのですが、他の関数などを使って代用することは可能でしょうか。
もしくはdomxmlをphpで自作されている方はいらっしゃいませんか。
php_domxml.c php_domxml.h は何が書いてあるかさっぱりわかりません。
0582nobodyさん
04/05/03 15:47ID:???0583nobodyさん
04/05/03 16:41ID:rg12GSDJというのも、今スケジューラを作っていて、指定された時間になると自動でメールを発信するリマインダ機能をつけようと思っているんですが。
処理呼び出し用マシンを用意して、処理するPHPを自動更新で5分おきに呼び出すとか、そんな方法しか思いつかないんです。
(この表現で伝わりますか?)
もっとスマートな方法はありませんかね?
0585nobodyさん
04/05/03 17:11ID:???0586nobodyさん
04/05/03 17:27ID:???0587583
04/05/03 17:40ID:???ですから、cronとかも使えず…。
質問しておいてアレなんですが、やっぱりブラウザを起動しておいて自動更新で…に落ち着こうかなぁと思ってたり。
簡単だし。
スレ汚してすみません。
0590nobodyさん
04/05/03 21:54ID:???正直、Win版独自の機能については、
COMなんかもそうだけど、使ってる人あんまりいない。
[PHP-WIN] MLが比較的情報回ってる方かな。
0591nobodyさん
04/05/03 22:50ID:q5DnTGK5契約先のサービスサーバに接続しても、1/2の確率程度でしか結果を返してくれません。
私が悪いのか、サービスサーバが悪いのか分かりません。
$fp = fsockopen(...);
fputs($fp, "ヘッダとデータ");
fflush($fp);
while(!feof($fp)) {
$result .= fgets($fp);
}
fclose($fp);
一応、fflushの後にsleepとか入れてみたんですが、駄目です。
こういう経験がある方がいらっしゃれば、教えて下さい。
あいまいな質問で申し訳ないです。
0593nobodyさん
04/05/03 23:00ID:q5DnTGK5実際のスクリプトにはエラーハンドリングしてます。
feof($fp)が結果を返す前にtrueを返してしまいます。
0595nobodyさん
04/05/04 01:18ID:qkyRU8F3有難う御座います。
578です。
でも、MLって、英語ですよねぇ・・。
BMPで検索してそれらしき質問は見つけたのですが、誰も相手していなかったです。
$rst = printer_draw_bmp($objprt,"c:\\logo.bmp",400,400);
if($rst) {
print "成功";
} else {
print "失敗";
}
というのを書いて実行すると。
むなしく・・・「成功」・・・とでます。
という事は、やっぱり、XPではダメって事ですよね。
他のprinter_draw_textやprinter_draw_textは動くのになア。
ザンネン。
0596nobodyさん
04/05/04 04:57ID:???ウチのMe+PHP 4.3.4でも動きませんでした
might be only in CVS
だから仕方ないかも
(よく見たらプリンタ関数全部そうなんだけど)
0597hiro@ ◆7iyjK8Ih4Y
04/05/04 10:41ID:???なんとか作成はできて、生成もできて、メールの送信ができたのですが
どうしても、送られてきたメールの内容・件名などが文字化けしてしま
います。この生成プログラムを利用してみて、ご指導などをしていただ
けないでしょうか?
http://ffmax.com/test/mail/top.html
0598hiro@ ◆7iyjK8Ih4Y
04/05/04 10:47ID:???付けたしです。
上記のファイルダウンロード=ttp://ffmax.com/test/mail/fmail_040504.zip
0601nobodyさん
04/05/04 11:44ID:???ただビットマップデータをプリンタに投げてるだけだから、
そんなに"動きにくい"ということも無いはずなんだが...
取り合えずPHP4.3.4に戻してテストしてみたけど、
以下のコードで期待通りに出力された。
<?php
$handle = printer_open();
printer_start_doc($handle, "TestDocument");
printer_start_page($handle);
$result = printer_draw_bmp($handle,"test.bmp",0,0);
if($result) {
echo "Success";
} else {
echo "Failure";
}
printer_end_page($handle);
printer_end_doc($handle);
printer_close($handle);
?>
環境:
・MS Windows-XP Pro
・PHP4.3.4(ApacheSAPIとCLIの両方) with php_printer.dll
・HP LaserJet4PJ(Windows付属のドライバ)
使用してるbmpのフォーマットとか確認した方が良いんでは?
(テストは無圧縮のWindows_BMPとOS/2_BMPの両方で試した)
0602nobodyさん
04/05/04 11:57ID:???まあスレ違いだが、今更i18n関数を使わないと駄目な環境なのか?
今後のことも考えて、現行のPHP4に切り替え、mbstringモジュールを組み込み
PHPのmbstring関係の設定を適正に行い、関数もそちらを使うことを検討してはどうかな。
もし今i18n関数を使うコードを書くなら、i18n/mbstring/jcodeの複数対応ぐらいをしないと。
0603nobodyさん
04/05/04 12:11ID:???といった場合にはどのようにすれば良いでしょうか?
rand(1,10)を4回繰り返すだけでは重複する可能性があるので、
その重複を排除したいです。
0604nobodyさん
04/05/04 12:18ID:???根本の考え方は"重複してたら選択しないで別のを"で良いと思うけど。
自分は生成したものを配列に格納するスタイルで、配列に入れる
(選択する)際に、in_array()で重複チェックかな。
他にも色々やり方はあると思うよ。
0605530
04/05/04 12:22ID:+sfVuN8rCygwin上で動いているPostgreSQLの文字コードはSHIFT_JISにもできるみたいです。
initdb時もしくはデータベース作成時にオプションで指定する文字コードを『WIN』と
指定する事でPostgreSQLサーバの文字コードもSHIFT_JISにできます。
その節はどうもありがとうございました。
0607nobodyさん
04/05/04 13:22ID:FohXuraC現在webサーバとしてFreeBSD(Apache+PHP4.0.5+PostgreSQL)を利用していますが、
コマンドラインでPHPが利用できないため、
現在の4.0.5を利用しつつ、
コマンドライン版PHPを別にインストールを行おうと考えています。
この際、コマンドライン版についてはPHP4.0.6以上のインストールを行おうと思いますが、
PHPマニュアルを見ていますと、php.iniの書き換えが行われる旨の記述があり、
コマンドライン版をインストールすることによって今までのPHP環境に影響がありますでしょうか。
※たとえば、webサーバで利用していたphp4.0.5が動作しなくなる、等
よろしくお願い致します。
0608nobodyさん
04/05/04 13:53ID:???CLIは別物。
異なるバージョンのCLI版PHPを混在しているが別段問題も無い。
影響するphp.iniをきちんと認識しておくこと。
直接指定するのが確実ではあるが。
0609nobodyさん
04/05/04 14:14ID:B1UV88Cv素早いレスありがとうございます。
マニュアルをもう少し確認し、php.iniの影響範囲を確認後、作業を進めようとおもいます。
ありがとうございました。
0610nobodyさん
04/05/04 14:16ID:???$num = array_fill(1,10,0);
$randnum = array_rand($num, 4);
//$randnum[0]から$randnum[3]までに1〜10のランダムな数が入ってるはず
0611nobodyさん
04/05/05 21:55ID:eV5n8HpSBMPも色々試して見ましたが、(phpでの生成も含めて)やっぱり、プリントされません。
プリンタの相性なんですかね??
・・が、諦めます。
ロゴ自体は簡単な図形に文字だけなので、printer_draw_lineとかprinter_draw_elipseとprinter_draw_textで
なんとか似たような物出来ました。
今後、MLは注意深く拾ってみます。
おさがわせしました。&有難うございました。
0612nobodyさん
04/05/05 23:16ID:???連想配列から、キーを特定して切り出すのに便利な関数無いでしょうか。
$arr = array('hoge'=>'funi', 'foo'=>'bar'); で foo を取り出した後の配列が $arr =array('hoge'=>'funi) になるような動作を望んでいます。
array_shift や array_pop の、キーを指定できる版のような。
マニュアル見たけど見あたらず orz
array_diff は一見 UNIX コマンドの diff っぽく見えて実は期待した動作と違うとか何とかで ((((;゜Д゜)))) してます。
何かありませんか。。
0613nobodyさん
04/05/05 23:19ID:???10日でおぼえるPHP入門教室という参考書のサンプルファイル
http://www.shoeisha.com/book/hp/10days/down/PHP10sample.lzh
自分の環境で動かないんです。
念のためNファイアウォールをDisableにして、OPERAではなくてIEで開こうと思っても
動きません。
正確には自作の幼稚なものや、サンプルの中でも簡単なスクリプトなら動くんですが、
最後の[?>]ある行がエラーとでて動かないものが殆どです。
PHPDEVからアパッチを起動しているつもりなんですが、何が問題なんでしょう?
因みにPHPファイルは、PHPDEVのWWW以下に置いてあって、アドレスの指定も
http://LOCALHOST以下で呼び出しています。
0615nobodyさん
04/05/05 23:31ID:???その書き方ではその本を持っている人にしか分からない罠。
質問の仕方から学ぼう。エラー内容も書いてないよね。
> 簡単なスクリプトなら動く
のならひとつづつ動作の確認を取り追っていくと良いのでは。
デバッグ/エラー情報の扱いは大切なスキルの一つだし。
0618nobodyさん
04/05/05 23:53ID:???02-01.phpはFatal error: Call to undefined function: mb_convert_encoding() in c:\phpdev\www\php10sample\02-01\common.php on line 27
と出ます。
同じディレクトリのCommon.phpがエラーみたいなんですが、自分にはそのラインを見てもわかりません。
>615
その一つずつ確認するというのは、余計な命令文を削除して稼動させるということですか?
0619nobodyさん
04/05/05 23:58ID:???エラーメッセージぐらい嫁よ。
終了
0620nobodyさん
04/05/06 00:06ID:???情報を取得することってできますか?
色々調べたのですが全然見つかりません・・・。
どなたか知ってるいる方がいましたらお願いします。
0621618
04/05/06 00:15ID:???619が誰にレスしているのか知らんけど、
参考書についているサンプル(つまり動いて当然)を
一式localに入れて動かないという事に、初心者が対応するのは難しいと思うんだけど、
エラーメッセージが出ても解らないといってるですけど?
なにかPCの環境に応じて変えないといけない要素があるんですか?
0622nobodyさん
04/05/06 00:25ID:???>色々調べたのですが全然見つかりません・・・。
ちょこっと調べたら10秒で見つかりました。ファイルシステム関数を参照。
>>621
関数が未定義だって言ってるんだから関数名で検索すればいいじゃん♪
すぐ見つかるよ。
0623nobodyさん
04/05/06 00:30ID:???見つかりました。ありがとうございます。
PHPのマニュアルを見るという基本的なことを忘れていました・・・。
0624nobodyさん
04/05/06 00:33ID:???0625nobodyさん
04/05/06 00:35ID:???マルチバイト文字列関数を有効にするようなインストールをその入門書が
ちゃんと書いていないならその入門書が悪いだろうけど、漏れが今まで
日本人向けに書かれたPHP解説本には全て書いてあったが。
あと、その手のエラーはFAQなのでちょっとググれば腐るほどヒットすると思うがの。
逆切れする前に、ちょっとは検索汁。
0626nobodyさん
04/05/06 01:14ID:???bmpファイルはopen可能な位置に置いてるの?
カレントに置いて試した?
多分fopenとかincludeとかと同様の制限受けるよ。
0628nobodyさん
04/05/06 01:48ID:???漏れも使うかなこのフレーズw
0629nobodyさん
04/05/06 01:58ID:???0630nobodyさん
04/05/06 02:06ID:???0632nobodyさん
04/05/06 05:01ID:???zakoga
0634nobodyさん
04/05/06 08:24ID:???0635nobodyさん
04/05/06 09:35ID:???0636nobodyさん
04/05/06 09:50ID:???0637nobodyさん
04/05/06 11:20ID:???0638nobodyさん
04/05/06 11:21ID:???0640nobodyさん
04/05/06 12:17ID:???ファイルのダウンロードについて教えて下さい
header('Content-Type: application/octet-stream; name="'.basename($filepath).'"');
header('Content-Disposition: attachment; filename="'.basename($filepath).'"');
header('Content-Length: '.$content_length);
上記スクリプトでファイルのダウンロードを行っているのですが、
ダウンロードのダイアログにてファイル名がうまく取得できない場合があります
WindowsXP/IE6.0 : 指定したファイル名をダイアログに表示
WindowsXP/NN7.02 : 指定したファイル名+".php"を表示
MacOS X/IE5.2 : ダウンロードマネージャが開き、自動でダウンロードが始まる ファイル名はスクリプトのファイル名
MaxOS X/NN7.1 : 指定したファイル名を表示
WindowsのNNで".php"が付加される件と、MacOSXのIEでスクリプトのファイル名を取得してしまう件について
回避方法はありますでしょうか?
よろしくお願いいたします
0641nobodyさん
04/05/06 13:23ID:???phpマニュアルの"XXXVII. HTTP関連の関数" "header()"のページには以下の記述があります。
注意: Microsoft Internet Explorer 4.01にはこれが動作しないというバグ があります。この解決策はありません。
Microsoft Internet Explorer 5.5にもこれを妨げるバグがあります。これは、サービスパック2以降 とすることで修整可能です。
0642nobodyさん
04/05/06 13:27ID:???path_infoでファイル名をとる。
http://foo/hoge.php/filename.ext
な感じでどうよ
あとcontent_typeのfilenameは要らない気もする
0643640
04/05/06 14:11ID:???・・・、成る程。ブラウザ固有の問題だったんですね。
教えて頂いたPHPマニュアルのXXXVIIのheader関数のページに
In response to Martin Anso and for your benefit,
here's an even better routine for forcing the browser to save a file,
rather than opening it.
という書き込みがあったので、そこに載っていたコードを試してみましたら、IE5.2でもファイル名を
取得してくれました。
ありがとうございます。
>>642
path_infoからファイル名を拾わせたら、WinのNNでも元ファイルの拡張子を認識してくれました。
これはQUERY_STRING内にドットが入るとうまく認識されないという事なのでしょうか?
なにはともあれ、ありがとうございます。
尚、content_typeのfilenameを外す件も、試してみたら不具合なく動きました(上記4環境では)。
重ねてありがとうございます。
0644nobodyさん
04/05/06 14:48ID:gVUqIIm2<?php
session_start();
session_register("msg");
?>
<html>
<body>
<p><?php print $msg; ?></p>
<form action="session.php" method="post">
<input type="text" name="msg" value="">
<input type="submit">
</form>
</body>
</html>
とやってフォームからテキストを入力しても $msg の上書きがさせません。
$msg = $_POST["msg"]; とやると出来ます。これってスマートなやり方なんでしょうか?
0645nobodyさん
04/05/06 14:53ID:???0646nobodyさん
04/05/06 14:57ID:???参考にしているサイトか本が古そうだな。
そして、それだけだとSESSIONを使う意味ないな。
あと、register_globals あたりの設定も。
0647642
04/05/06 15:01ID:???これ関連の問題で、たとえばshift_jisの予測.txtとかだと正常なファイル名でアップされないんだよね
0648644
04/05/06 15:12ID:gVUqIIm2$_SESSION["msg"] とやった方が良いのでしょうか?
0649nobodyさん
04/05/06 15:36ID:???>$msg = $_POST["msg"]; とやると出来ます。これってスマートなやり方なんでしょうか?
これやっとけ
正解だから
0650644
04/05/06 15:50ID:aeZSFft+最後に、もう一つだけ質問させてください。
<?php
if (!session_is_registered('count')) {
session_register('count');
$count = 1;
} else {
$count++;
}
?>
より
<?php
if (!session_is_registered('count')) {
session_register('count');
$_SESSION["count"] = 1;
} else {
$_SESSION["count"]++;
}
?>
の方が望ましいということでしょうか?
0651nobodyさん
04/05/06 16:18ID:???めんどくさいからここ読んで
http://www.php.net/manual/ja/function.session-register.php
ちなみに
注意
register_globalsを 考慮することなくスクリプトを書きたい場合には、 $_SESSION配列を 代わりに使用する必要があります。 $_SESSIONのエントリーは自動的に登録されます。
スクリプトでsession_register()を 使用している場合には、それは register_globalsを 不可としている環境下では動作しません。
注意
$HTTP_SESSION_VARS(または$_SESSION)を 使用する場合、 session_register(), session_is_registered(), session_unregister()を使用しないで下さい。
って知ってる?
0652nobodyさん
04/05/06 16:20ID:???漏れなら、
session_start();
if(isset($_SESSION['count'])){
$_SESSION['count']++;
}else{
$_SESSION['count']=1;
}
とする。
ま、エラー出力を抑制して、
session_start();
@$_SESSION['count']++;
でもありかな。やんないけど。
0653nobodyさん
04/05/06 16:48ID:???session_registerは使わない方がいいんじゃね?
>>652の方法がよかろう
■ このスレッドは過去ログ倉庫に格納されています