トップページ⇒php
1001コメント348KB

【PHP】質問スレッドpart32【php】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/01/03(火) 17:18:20ID:???
PHP全般の質問スレです。
【基本ルール】
・新規質問の方は上げてください。age進行でお願いします。
・質問者は2回目以降、最初のレス番号を名前欄に入れてください。
・回答者は質問者に対して>>(アンカー)をつけてください。
・煽り・荒らしは放置。荒らしに反応した香具師も荒(ry
・解決しなくてもこたえてもらったら礼を。
【質問テンプレ】
・マニュアルを調べたか、google検索したか(調べたキーワード)
・タイトル(禁:教えてください!etc) 例:requireとinclude
・内容 例:requireとincludeはどう違うのですか?
・質問する際には環境も明記。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークはそれぞれの該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
・オブジェクト指向については良スレがないから本を買え
・速さについては自分でベンチをとってここに書け(違う環境の人も調べてくれるかも)
【PHP マニュアル】
http://www.php.net/manual/ja/
※マニュアル上部の「search for」から検索を活用すべし(便利)。

過去スレ、関連リンク、FAQ等>>2-10辺り
0477nobodyさん2006/01/26(木) 17:49:20ID:???
>>474
・wikiを使いたい→wikiスレ
・レンタル鯖に設置したいけど方法が分からない→レンタル鯖板
・PHPのインストール方法が分からない→分からない点を書きアドバイスを求める (質問の内容によっては 自宅サーバ板)

PHPのインストールってのが何を指すのかよく分からない。

まぁ、wikiを設置したいけどやり方が分からないんだとエスパー
って事でこの板のwikiスレに行って、設置先の名前、設置するwikiの名前、それと分からないポイントを書けば誰か教えてくれるかもよ
04784722006/01/26(木) 17:50:14ID:ZWELklYb
>>473
マジサンクス。マジ俺アホス。一発で解決しました。50円あげるお^^

つ �I�I�I�I
0479nobodyさん2006/01/26(木) 17:51:47ID:???
>>478
足りない10円はどこ行ったw
0480nobodyさん2006/01/26(木) 18:11:44ID:???
PHPで簡単な登録フォームを作成しています。

名前[ ]
内容[ ]

【プレビュー】【送信】

という表示だとして、プレビューのボタンを押した時に別ウィンドウが開いて
入力した内容が確認できる。
送信のボタンを押すとそのまま送信できる。

というのを考えているのですが、プレビューも送信もどちらもsubmitボタンとした場合、
formのaction先には1つのファイルしか指定できないわけで、どうすればいいか
迷っています。(プレビューと送信完了のページは別ファイル)

説明が下手ですみませんが、何かアドバイスをいただければと思います。
0481nobodyさん2006/01/26(木) 18:14:57ID:???
>>480
Submitの名前で判断すれば良いんじゃないかな?
0482nobodyさん2006/01/26(木) 18:18:14ID:???
>>480
確認しないで送れるんだけど、それでいいの?
中身空っぽのやつとかいたずらし放題なわけだけど。
0483nobodyさん2006/01/26(木) 18:19:25ID:???
>>482
ブログとかだって確認と送信あるから良いんじゃない?
04844802006/01/26(木) 19:01:55ID:???
>>481
その「Submitの名前」というのは、例えば以下のような事ですか?

<form action="test.php" method="POST">

ソース

<input type="submit" name="preview" value="プレビュー">
<input type="submit" name="entry"value="送信">

で、test.phpでifでsubmitからのnameを判別して
プレビュー用ならpreview.phpをincludeして、送信用ならentry.phpをinculdeするような。

>>482
確認はプレビューでするので、実際は登録されていない事になります。
0485nobodyさん2006/01/26(木) 20:09:10ID:???
>>484
オレだったら、hiddenだらけの別formを用意して、
プレビューはjavascriptで上記フォームを介して行い、
送信は普通にsubmitするかな。

もちろん、javascript offの環境ではプレビューできないけどw
0486nobodyさん2006/01/26(木) 21:26:36ID:???
>>484
正解。やってみそ。
0487nobodyさん2006/01/26(木) 22:50:15ID:XYYPwXMi
PHPで0から50までの乱数を出したい場合
rand(0,50);
で0以上50以下が出力されるのはわかったのですが
srand(初期値);
のsrandの使い方がいまいちわかりません。
0から50までの乱数を出す場合はsrandの初期値はどのように
設定すればいいのでしょうか?
0488nobodyさん2006/01/26(木) 23:07:36ID:???
PHPを使ってHTMLにアクセスした際に文章をパソコン向けと携帯向けの表示振り分けを行いたいのだけど
とりあえずわかったのが、UserAgentで携帯端末情報を読み取るまではわかったが、それから先が一向に進まぬ

教えて下さい。大先生方!!
0489nobodyさん2006/01/26(木) 23:39:02ID:???
>>487
http://www.php.net/srand
> 注意: PHP 4.2.0 以降、 srand() または mt_srand() によりランダム数生成器にシードを与える必要はありません。これは、この処理が自動的に行われるためです。

つまり4.2.0以降のバージョンではsrandを書かなくていい。
ちなみに以前のバージョンでsrandを書く場合引数にはtime()などのランダムになりやすい値を与える。
つーかsrand(time())にするべし。

>>488
そこまでわかったのにどうして先に進めないのさ?
ifとかswitchとかincludeとかファイル入出力とかDBとか適当に組み合わせるだけだよ。
0490nobodyさん2006/01/27(金) 02:21:59ID:???
PHPで既存のスクリプトを改造してます。
0491nobodyさん2006/01/27(金) 06:25:24ID:???
>>490
いきなりそんなことを言う貴方はだぁれ?
0492nobodyさん2006/01/27(金) 12:31:39ID:???
>>490
引き続きがんがってください
0493nobodyさん2006/01/27(金) 14:07:06ID:lsupN3af
>>490
ついでにPHPも改造してください。
0494nobodyさん2006/01/27(金) 17:14:49ID:zienXgmO
PHP4系から5.1.2にアップデートしたら、

$test = 'hoo';
echo $test['bar'];

で「h」が出力されるようになったのですが、
($test['bar'] が $test[0] と評価されている?)
こういう仕様に変わったんでしょうか?
0495nobodyさん2006/01/27(金) 17:40:06ID:???
>>494
PHP4.0.1辺りから色々試したけど同じように「h」が出力されたぞ。

「存在しない添字は0として評価される」なんて公式な仕様はないと思うので、
仕様ではないと思うけど。
0496nobodyさん2006/01/27(金) 17:55:11ID:???
キモい挙動だけど仕様でしょ。
連想配列に添字でアクセスしようとしてるんじゃなくて、オフセットを指定して
文字列にアクセスしようとしてて、string "bar" が int 0 にキャストされてるだけ。
0497nobodyさん2006/01/27(金) 18:52:21ID:???
データベース抽象化しようと思うんだけど、良い感じの奴を教えておくれ。

php 4、MySQL、PostgreSQL 対応で。
0498nobodyさん2006/01/27(金) 19:15:36ID:???
>>495
存在しない添え字っつーか、それは文字列型への桁位置アクセスだからな。
配列とは違って数値しかありえない。よって[0]扱いが正しいと思われ。
0499nobodyさん2006/01/27(金) 19:18:59ID:???
ちなみに文字列への $hoge[0] 表記は過去互換で残されてるけど推奨はされない。
できれば $hoge{0} と書いた方がいい。
0500nobodyさん2006/01/27(金) 19:35:19ID:???
>>499
ごめんそれどっかにソースある?
0501nobodyさん2006/01/27(金) 21:51:27ID:???
>>500
http://www.php.net/manual/ja/language.types.string.php
文字列への文字単位のアクセスと修正

http://www.zend.com/engine2/ZendEngine-2.0.pdf
String offset syntax
0502nobodyさん2006/01/28(土) 00:18:29ID:???
>>501
ありが�d
0503nobodyさん2006/01/28(土) 03:53:00ID:vNPPStC0
PHPのuniqid()って
どのくらいユニークなのかな?
ミリ秒を種にしているとのことだけど
無限にユニークであり続けることなんて不可能だし。
UNIXタイムの限界くらいまでユニーク?
0504nobodyさん2006/01/28(土) 05:24:49ID:???
>>503
uniqidは現在時刻をマイクロ秒単位(マニュアルにはミリ秒って書いてあるけど)でそのまま16進表記しただけなので、2038年(だったっけ?)のいつだかまでの間に1マイクロ秒のズレもなく同時にuniqidを呼び出さない限りは確実にユニーク。
echo uniqid(), "\n", uniqid();ってやっても多分ちょっとはズレる。
ちなみにUNIXタイムスタンプの最大値0x7FFFFFFF(約20億)に100万を掛けた数の膨大なuniqidが存在し得る。
以下はソースのext/standard/uniqid.cから一部抜粋

> /* The max value usec can have is 0xF423F, so we use only five hex
> * digits for usecs.
> */
> if (more_entropy) {
>  spprintf(&uniqid, 0, "%s%08x%05x%.8f", prefix, sec, usec, php_combined_lcg(TSRMLS_C) * 10);
> } else {
>  spprintf(&uniqid, 0, "%s%08x%05x", prefix, sec, usec);
> }

spprintfっていったい何だ?w
05055032006/01/28(土) 09:32:11ID:???
>>504
なるほどー
分かりやすい説明ありがとう!
0506nobodyさん2006/01/28(土) 12:17:41ID:???
main/spprintf.c
0507nobodyさん2006/01/29(日) 02:15:45ID:???
Debug Build をNOにしたいのだけど
0508nobodyさん2006/01/29(日) 04:31:28ID:???
したいのだけど・・・?
0509nobodyさん2006/01/29(日) 10:01:30ID:???
したいのならすればいい。
0510nobodyさん2006/01/29(日) 15:22:58ID:mSKJalfC
DBに格納したデータを、先頭の"The"を抜いた条件で昇順でソートする方法ってどんなんでしょうか?

例>>
Aaa
The bbb
Ccc

これが思いつきそうで思いつかない……orz
0511nobodyさん2006/01/29(日) 15:31:15ID:???
HAHAHA、そうか!それ程言って欲しいのか!それならば言ってやろう!!

 ス レ 違 い
0512nobodyさん2006/01/29(日) 15:33:53ID:???
SQLのお話ならDB板へ。その時は使用しているDB名もお忘れなく。
05135102006/01/29(日) 15:43:09ID:mSKJalfC
>>512
これってDBの話なの?
DBからは素直にとってきて、配列にして、PHP側でさあどうソートするかって話だと思ったんですが……。
0514nobodyさん2006/01/29(日) 16:30:19ID:???
>>513
>これってDBの話なの?
「DBに格納したデータを」って書いてるじゃないか。

文面通りに解釈すると「DBに格納したデータを特殊な条件付でソートし結果を受け取りたい」と読める。
だから、「どこがPHPの質問なの?」と突っ込まれたわけよ。

まぁ、usort でも使ってユーザ関数でソートしたら?
05155102006/01/29(日) 16:40:58ID:???
>>514
そうか。言葉が足りませんでした。ごめんなさい。
usortでいじってはみてるんですが、これがなかなか……orz
0516nobodyさん2006/01/29(日) 16:49:08ID:???
ソース晒して分からない箇所を下質スレで聞くと誰か相手に(ry
05175102006/01/29(日) 16:55:30ID:???
>>516
わかりました。後はそちらに移動します。
どうもありがとうございました。
0518nobodyさん2006/01/29(日) 23:54:56ID:???
001に1を足して002、また1を足して003としていきたいのですが、
どういった方法があるでしょうか?
0519nobodyさん2006/01/29(日) 23:55:53ID:???
>>518
何が分からないのか皆目検討がつかない
05205182006/01/30(月) 00:12:30ID:???
カウンターで複数桁を使用したいと考えています、
1を2にするのは簡単ですが、
01を02にするのはかなり面倒そうですので。
0521nobodyさん2006/01/30(月) 00:16:29ID:???
>>520
あとで画像カウンタとか言うなよ
sprintf を調べろ
0522nobodyさん2006/01/30(月) 00:17:49ID:???
>>520
計算自体は桁考えずに行って、最後に表示するときだけ
printf("%03d", $cnt); と3桁化すりゃいーよ。
05235182006/01/30(月) 00:27:03ID:???
ありがとう!!
0524nobodyさんNGNG
ごめんなさい、↓なんですけど
自分で「短い文字でもちゃんとSJIS→JISに変換できるように!!」
と入れた処理なんですが、後から見て何をやっているか
わからなくなってしまいました。


/* 文字数が少ないとエンコードに失敗するんだとさ。*/
$message = "あいうえお眉幅ABC".$message;
$body = mb_convert_encoding( $message , "JIS", "EUC-JP,UTF-8,SJIS,ASCII,JIS");
$body = substr ( $body , 3 + 14 + 3 + 3 );

�@なぜ「"あいうえお眉幅"」ではなくて「"あいうえお眉幅ABC"」なのか
�A最後の「3 + 14 + 3 + 3」の詳細
解読できる人がいたら助けてください。。。。

0525nobodyさん2006/01/30(月) 01:57:49ID:???
くだ質行けばかちん
0526nobodyさんNGNG
>>525
ありがとう。
0527nobodyさん2006/01/30(月) 09:39:33ID:JutOeLmX
クラス名でタイプヒンティングすると一切のデフォルト引数が無意味になるけどこれは仕様と思ってあきらめるしかない?
nullを渡せたらまだよかったんだけど。
もしくはデフォルト引数にnewを書けたらまだよかったかも。
タイプヒンティングせずに関数内でinstanceofしか方法はないかな?
よりよい型の制限方法あったら教えてください。
0528nobodyさん2006/01/30(月) 17:33:56ID:???
>>524
�@英語もテストしたいから
�A数が大きくて同時に計算できなかった
0529nobodyさん2006/01/30(月) 18:52:22ID:???
php.ini の memory_limit を抑えて、DLさせる為にflushを利用しているのですが、巧く動作しません。
何かご存じの方、ご教授願います。

 ・実メモリ 128Mbytes
 ・DLファイル 1Gbytes
 ・直アクセスはしない
 ・DLダイアログは直ぐに出る
 ・https経由

DL部分のコードは下記の通りです。
ob_start(),ob_end_flush();を組み合わせても×でした。

$fp=fopen($FNAME,"rb");
while(!feof($fp)){
echo fread($fp,4096);
flush();
}

環境
 apache 1.3.33
 php4-4.4.1_1
05305292006/01/30(月) 19:28:04ID:???
素のコードで巧く行きました…。
これから切り分けて、後で報告します。 お騒がせしました。

test.php
<?
 $file="test.zip";
 header("Content-Type: application/octet-stream;");
 header("Content-Disposition: attachment; filename=$file");
 
 ob_end_flush();
 
 readfile("data/$file");
?>
0531nobodyさん2006/01/30(月) 20:56:32ID:EJ05v1/F
ご教授お願いします
POSTでwavのバイナリデータが飛ばされてくるシステムでデータを保存するのに
pack関数を使用して保存すれば良いのでは?という所まではたどり着いたのですが
どのように使用するのかがマニュアルを見たのですが今ひとつ分かりませんでした
どなたか使い方分かる方教えていただけませんか?

$data = urldecode($_POST['wavdata']);
$fp = @fopen("./data.wav","wb");
fwrite($fp, pack("[この部分がわかりません]",$data));
fclose($fp);
0532nobodyさん2006/01/30(月) 21:31:50ID:???
>>531
その前に何でそのシステムがRFC1867に基づく
ファイルアップロードを行わない(させない)のか教えてくれる?
Webブラウザ以外の特殊(といっていいのかな)なクライアントでも対応してる
場合が多いと思うけど。PHPでもアップロードのクラスがPEARにあるよ。
0533nobodyさん2006/01/30(月) 21:46:56ID:/1xdn91h
×ご教授
○ご教示
05345312006/01/30(月) 21:47:09ID:???
>>532
私もシステム開発元になぜRFC1867に基づくファイルアップロード
を使用できないのか聞いたのですが、
開発元で作成したデータ保存後にFTPで送信するCGIを使用するか
もしくは自分で何とか出来るならしてください
の一点張りで結局教えてくれませんでした。
現在はつなぎとして開発元が提供しているFTPのCGIを使用していますが
とにかく遅いので自前で何とかしようと今回の書き込みとなりました。
0535nobodyさん2006/01/30(月) 22:12:12ID:???
>>534
それを読んだ限りだと、開発元が作成したのはデータ保存後FTPで送信する物であり、POSTでバイナリを送りつける妙な仕様の物ではない
つまり、その妙な物を作ったのは貴方だと受け取れるが、そうなのか?

仮にそうなら、そんな妙な仕様の物を作るのはやめて、RFC1867に基づくファイルアップロードをやってくれる物を使うべきだ

まぁ・・そもそも、遅いのはFTPするCGIが原因なのか?とか作って時間の無駄だったと気付きそうな香りが・・・。
0536nobodyさん2006/01/30(月) 22:13:31ID:???
お絵描き掲示板みたいにJavaアプレットが自力でバイナリを生成して
それを標準出力(=POST)で送ってくる、とかの類じゃないの?
で、巷のお絵描き掲示板でそういう処理は実際にやってるから
ソース見てみたら参考になると思う。
参) PHP製のお絵描き掲示板 >ttp://www.punyu.net/
0537nobodyさん2006/01/30(月) 22:16:36ID:???
ちなみにお絵描き掲示板の場合は、一定のヘッダの後に
生のバイナリデータがそのまま送信されてくるので、
urldecodeだのpackだのは要らないです。
ヘッダで指定されたサイズで受信してそのまま保存。

なので、全然違う仕様の可能性も高いけど、それ以外に
そんな変な仕様になる理由が思いつかなかったので。
05385312006/01/30(月) 22:22:57ID:???
>>535
開発元がPOSTでバイナリデータを送っいるといっていますので
こちらでわざわざ妙なつくりにしたということはありえません。

FTPが遅いのは流れから言っても確実です
FTPを使用した場合
CGIにデータ渡す>データをエンコード後保存>FTP接続しこちらのサーバーへ>ファイル公開
FTP使用しなかった場合
データをエンコード後保存>ファイル公開
05395312006/01/30(月) 22:51:32ID:???
>>536
ありがとうございます
ためしてみます
報告はまた後ほど
05404522006/01/31(火) 00:20:15ID:+LWq5c8/
>>456
>>457
亀ですんません。

[:XXXX:]は[:はーと:]と言ったように、
ひらがなで統一しようと思ってました。
でも、英数字でも問題ないです。

preg_replaceだと1個しか置換できないのかと考え、
preg_match_allで、[::]内のひらがなを抜き出し、
ループで回して該当する画像を表示させようと思ってたのですが、
>>456さんのやり方の方がいいのでしょうか。

正規表現がよくわからなくて、
調べてはみたものの、
ちぐはぐな返答かもしれません。
ごめんなさい。

---------------------------------------------------------
$text = 今日は天気[:hare:]がいい!明日は雨[:ame:]らしい。
---------------------------------------------------------
$textを表示させるときに、[:hare:]=太陽の画像、[:ame:]=傘の画像を
表示させたいのです…
05415312006/01/31(火) 00:50:36ID:???
>>536
完全なテスト環境が家に無いので確実とはいえませんが
教えていただいたもので何とかなりそうです
みなさんありがとうございました
0542nobodyさん2006/01/31(火) 01:21:23ID:???
>>540
なんとなく、こんな感じかな?
ってか、正規表現くらい勉強しろ。”調べる”のではなく、”勉強”だ。
あと、
> preg_replaceだと1個しか置換できないのかと考え、
”考え”ではなく、試せ。せっかく >>456 が良い回答しているのに・・・。

以下、動作未確認スクリプト。

//
$text = "今日は天気[:hare:]がいい!明日は雨[:ame:]らしい。";
$text = preg_replace('/\[:(\w+?):\]/e', 'emoji($1)', $text);

function emoji($code) {
// 以下、DBに接続できていると仮定
$imageFileName = "";
$result = mysql_query("SELECT imageFileName FROM table_name WHERE emojiCode = '{$code}'");
if (mysql_num_rows($result)) {
$imageFileName = "<img src=\"".mysql_result($result , 0)."\">";
}
return $imageFileName;
}


0543nobodyさん2006/01/31(火) 01:41:28ID:kuYyOVO4
他鯖のファイル取りに行く時にIf-Modified-Sinceとかヘッダ送りたい時は
fopenとかじゃ無理だよね。
自前でサーバーにつないでhttpリクエスト書かなきゃダメ?
もしくはそういうステキなラッパーがあれば・・・
0544nobodyさん2006/01/31(火) 01:44:59ID:???
>>540
ちょっと調べてみたけど、sjisかeucだったら2バイト目にコロンと同じコード(3A)が来る文字はないから>>542の正規表現を'/\[:(.+?):\]/e'にすれば問題なくマルチバイト混在可能になるはず。
ただUTF-8の場合は2バイト目以降全てのコードがありえるらしいから : の直後に ] があると意図しない結果になるかも。
JISは終端エスケープが完全なら問題なし。
0545nobodyさん2006/01/31(火) 01:50:48ID:b+k1eFbT
PHPにて、関数を使ってフィボナッチの計算をしてみたかったのですが、どうにもうまく
できません。プログラムは以下のようにやっています。
<?php $n; $i; function fib($n){if($n==1){return 1;}else if($n==0){
return 0;}else{return fib($n-1)+fib($n-2);}}
for($i=0;$i<=20;$i++){print("fib($i)");} ?>
そして結果が、
fib(0) fib(1) fib(2)・・・fib(20)
のようになってしまい、ちゃんとした値がでません。
計算の仕方自体は間違っていないと思うのですが、functionのあたりが間違って
いるような気がしないでもありません。
echoや&をつけたりといろいろしているのですがうまくいきません。
何が違うのか、どうすればいいのかを、どうか教えて下さい。お願い致します。
0546nobodyさん2006/01/31(火) 02:10:55ID:???
>>543
PEAR の HTTP_Request を使うといいよ
0547nobodyさん2006/01/31(火) 02:11:53ID:???
>>540
人の回答を信用する気がないなら
最初から質問なんてしなきゃいいのに
0548nobodyさん2006/01/31(火) 02:12:45ID:???
>>545
print("fib($i)"); → print(fib($i));

print("fib($i)") ってのは文字列に$iの値を埋め込んで出力するって事、つまりfib()を関数として認識してない。
それと動作しないのとは関係ないけど、最初に書いてる$n; $i; は不要。$i は for($i=0; ...) で初期化されてるし、$n は使われてない。

まぁ次からは下質スレにおいで
0549nobodyさん2006/01/31(火) 02:20:40ID:???
下質住人キタコレw
05505452006/01/31(火) 02:26:33ID:???
>>548
ありがとうございます、おかげできちんと表示させる事ができました。
わかりやすい説明もどうもありがとうございました。
05515402006/01/31(火) 09:12:48ID:2n+xF/sd
ありがとうございます!

>>547
信じてなかったわけではなく、理解できなかったわけで…。
コレを機会にちゃんと勉強します。
かなり甘えすぎてしまってごめんなさい。

答えてくれた皆さん、本当にありがとうございました
m(__)m
0552nobodyさん2006/01/31(火) 10:41:44ID:???
>>551
str_replace()やpreg_replace()の置換対象の仕様なんて正規表現と何の関係もないし
05535432006/01/31(火) 20:03:14ID:???
>>546
おー、すごい楽そう。
使ってみます!
ありがとうございますー。
0554nobodyさん2006/01/31(火) 20:33:44ID:???
すごい楽しそうなのかと思った
0555nobodyさん2006/02/01(水) 00:05:32ID:???
$array = array("aaa","bbb","ccc");
みたいな配列を
$res["aaa"]["bbb"]["ccc"] = 1;
のようにするのってどうやってやる?
evalは使わないで。
0556nobodyさん2006/02/01(水) 00:10:07ID:???
>>555
$res[$array[0]][$array[1]]][$array[2]]] = 1;
05575552006/02/01(水) 00:22:23ID:???
>>556
すんません、 $array の長さが不定なんです。
3つ固定ならそれでいいんですが。
0558nobodyさん2006/02/01(水) 01:07:07ID:???
>>555
$array = array("aaa","bbb","ccc");
$ref =& $res;
foreach($array as $k) $ref =& $ref[$k];
$ref = 1;
0559nobodyさん2006/02/01(水) 11:17:48ID:???
555じゃないけどプチ感動した。
なんかいろいろ応用できそうだ。
0560nobodyさん2006/02/01(水) 12:08:18ID:???
array_rand -- 配列から一つ以上の要素をランダムに取得する
とあったのですが、
配列の1行目の要素を拾う場合は array_ なんと入れれば良いのでしょうか?
05615602006/02/01(水) 12:15:45ID:???
あ、すみません
$data[array_rand($data)];
こういう書式だったんですが
0562nobodyさん2006/02/01(水) 13:12:03ID:???
>>560
「配列の1行目」とは?
05635602006/02/01(水) 13:17:08ID:???
あ、すみません
<?
$data_file = "data.csv";
$row = array("7");
$num = count($row);
$data = file($data_file);
for($j = 0; $j < $num; $j++)
{
$result = $data[array_rand($data)];
$val = explode("\t", $result);
echo $val[$row[$j]] . "<br>";
}
?>

こういうプログラムで、data.csvの一番上のデータ行の、8列目の文字列を取り出す、
というのをやりたいんですが
$result = $data[array_shift($data)]; ではダメだった…
0564nobodyさん2006/02/01(水) 13:35:24ID:???
えーっと、$data[0]ってことかな?
05655292006/02/01(水) 13:53:53ID:???
memory_limit の問題にハマっています。
ご存じの方、教えて下さい。

このコードは8M超のファイルがDownload可能である事を確認しました。
---------
[php.ini]
 memory_limit = 8M
------------
[test.php]
 $content_size = filesize("$FNAME");
 header("Content-Type: application/octet-stream;");
 header("Content-Length: ".$content_size);
 header("Content-Disposition: attachment; filename=\"$SRCFILE_SJIS\"");
 flush();
 ob_end_flush();
 readfile($FNAME);
------------
しかし、上記と全く同じものを、ファイル名($FNAME)選択する
PHP中に含ませると下記のエラーが出ます。
Allowed memory size of 8388608 bytes exhausted (tried to allocate 8209774 bytes)

php.ini の memory_limit を超えてDownlloadできる方法は
これで合っているのですが、解決方法や問題点をご存じの方、ご指摘願います。
(小さなファイルはDownload出来ています)
0566nobodyさん2006/02/01(水) 14:33:37ID:???
>>565
> ファイル名($FNAME)選択するPHP
これが何やってんだかわからん。
無駄な処理を挟んでないか?
05675292006/02/01(水) 15:26:49ID:???
>>566
ファイル選択の前に、ID/PASSの認証と、sessionを利用してます。(同じPHPコード内)

ロジックとして以下のフローとなっています。
 認証 → .認証をSessionで保持 → ファイル選択 → .DL

もちろん、前段の部分が原因になっているとは思うのですが、
外すわけには行かず…。orz

DLに関しては、上記PHPコード部分で(ほぼ)独立した世界であると
考えておりましたが、甘かったようです。

最悪、外に fget.php を用意して、引数を与えて
DLさせるようにしてみようと思いますが、
何かしら解決手段、原因など判る方はご指摘願います。
0568nobodyさん2006/02/01(水) 15:58:54ID:???
>>567
前段でグローバル変数とか使いすぎてるんじゃないのか。

ダウンロードのとこ、readfile()で一気読み&出力しないで
fgets+fwriteのループ処理にしてやればいきなり8MBもメモリ確保するようなことはなくならない?
なんかPerl辺りじゃ常識的な省メモリ動作のロジックなのに(やらんやつはタコ呼ばわり)、
PHPの開発者って便利関数に頼りすぎて丸っきり無視する傾向にあるよな。
ファイルがあったら何でも配列に丸ごとぶちこめ!みたいな。
0569nobodyさん2006/02/01(水) 16:40:16ID:???
>>568
>PHPの開発者って便利関数に頼りすぎて
これはあるな。GETのQUERY_STRINGが自前のコードでパースできない奴とか。
便利なものを使わずに、わざわざ不便なやり方をしろとは言わないけど。
0570nobodyさん2006/02/01(水) 16:45:40ID:???
ま、それがPHPのいいとこでもあるんだがな。
05715292006/02/01(水) 16:56:19ID:???
>>568
レスどうも。 色々試してみた結果のご相談です。

>>529 読み込みバッファ固定+ループで吐き出し

 大きなファイル×
 小さなファイル ○

>>565 メモリ食わないように、強制バッファリング無し(ob_end_flush();)で吐き出し、(+flush系関数での試行錯誤。)

 大きなファイル×
 小さなファイル○

という結果で、路頭に迷っている訳です。

実は「強制バッファリング無し等が有効にならない条件」があって、
それにハマっているんじゃないかと思う次第です。

ともかく、下手打ってphpに100Mとか、1Gとかメモリを
食われるのはご免なので、もう少し苦しんできます。
0572nobodyさん2006/02/01(水) 17:04:12ID:???
>>571
Allowed memory size of 8388608 bytes exhausted は
PHPの変数で確保しようとしたメモリが足りないときのエラーだから
バッファリングのフラッシュとかは全然関係ないと思うぞ。
あと、ob_end_flashってob_start以降の出力制御をかけたときのフラッシュ処理で
ob_startを使ってないなら何の関係もない。

読み込みバッファ固定+ループってやつがやり方間違ってるとかじゃないの?
0573nobodyさん2006/02/01(水) 18:35:08ID:???
WinXPでshell_execでxcopyコマンド使うにはどうしたらいいでしょうか?

echo shell_exec("xcopy /?");

で走らせた所

'xcopy' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

と出て使えませんですた
0574nobodyさん2006/02/01(水) 19:25:40ID:???
>>573
PATHが通ってないだけだろ。フルパスで書いてみれば?
0575nobodyさん2006/02/01(水) 19:28:39ID:???
>>573
普通に使える。

>php xcp.php
<?php
echo shell_exec("type xcp.php")."\n";
echo shell_exec("xcopy /?");
?>
ファイルとディレクトリ ツリーをコピーします。
[以下略]

path通してないんじゃ?
0576nobodyさん2006/02/01(水) 21:13:37ID:???
%PATH%入れてませんですたorz
0577nobodyさん2006/02/02(木) 12:29:48ID:nicG19IV
質問です。

関数やメソッドに「配列を複数の引数として渡す」のは
call_user_func_arrayなどで出来ると思いますが、
new時のコンストラクタには出来ないのでしょうか。

class obj{
  function obj($a,$b,$c){
    echo "a=$a,b=$b,c=$c<br />\n";
  }
}
$arr=array("a","b","c");
new obj($arr);

↑みたいにしたいのですが・・・。
よろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています