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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/11/27(日) 00:07:12ID:eBvjdczp
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辺り
0020nobodyさん2005/11/27(日) 12:16:41ID:???
>>19
PHPとPerlは別物です。
0021nobodyさん2005/11/27(日) 12:25:55ID:???
仮に、意味が同じでも言葉が違うんだから別物だろ。
0022nobodyさん2005/11/27(日) 12:43:22ID:???
PHPはCGIとしても利用できる
これ以上でも以下でもない
0023nobodyさん2005/11/27(日) 12:44:04ID:???
PHPってインターフェイス仕様のことだったのか
0024nobodyさん2005/11/27(日) 12:53:08ID:???
>>19
日本語と電子メールは別物です。
0025nobodyさん2005/11/27(日) 13:04:35ID:???
つミ
https://coterie.ws/uncho.pl.html.htm.php.gz.rm.zip.lzh.txt.php9?cat=afo
0026nobodyさん2005/11/27(日) 13:47:49ID:???
コピペしすぎ
0027nobodyさん2005/11/27(日) 14:35:18ID:???
文字列に入っている文字列を改行で分割して配列に入れたいのですが
最もスマートな方法は何でしょうか。

例えば
$s = "aaa\nbbb\nccc\nddd\n";
   ↓
$arr[0] = "aaa";
$arr[1] = "bbb";
$arr[2] = "ccc";
$arr[3] = "ddd";

みたいな感じです
0028nobodyさん2005/11/27(日) 14:43:41ID:???
ツマンネ
0029nobodyさん2005/11/27(日) 15:08:05ID:???
”CGIやPHPを使ってください。”
みたいな記述を見たもので、別物なのかなと思いました。
0030nobodyさん2005/11/27(日) 15:20:14ID:???
CGIはゲートウェイインターフェイス。
PerlやPHPはそのインターフェイスの上で動作可能な言語。
0031nobodyさん2005/11/27(日) 15:25:50ID:VNuPQoCa
$arr = split("\n",$s);
0032nobodyさん2005/11/27(日) 15:45:02ID:???
$arr = explode("\n", $s); //正規表現を使わないならこっちの方が速い
0033nobodyさん2005/11/27(日) 16:45:46ID:???
>>30
CGIではなくてPHPを動作させるには?
0034nobodyさん2005/11/27(日) 16:54:45ID:???
## >> php
0035nobodyさん2005/11/27(日) 16:54:47ID:???
>>33
マニュアルぐらい読んでくれ。分からない単語はググりゃ知識が深まる。
ttp://www.php.net/manual/ja/intro-whatcando.php
ttp://www.php.net/manual/ja/install.general.php
0036nobodyさん2005/11/27(日) 17:22:22ID:???
二つ質問があります
・関数の戻り値をリファレンスで受け取りたい場合、
function &hoge() {
とするだけで良いのですか?受け取る時
$hage =& hoge();
もしなくてはいけないですか?

・SQLインジェクション対策に、入力値検査に加えて、MySQLならmysql_real_escape_stringし、%を\%にすれば、少しは大丈夫だと言えますか?
0037nobodyさん2005/11/27(日) 17:57:13ID:???
ありがとうございました。
解決しました。
0038nobodyさん2005/11/27(日) 18:03:33ID:???
どういたまして
0039nobodyさん2005/11/27(日) 18:04:13ID:???
$a[0] = array('aaa', 0);
$a[1] = array('bbb', 10);
$a[2] = array('ccc', 5);

みたいな配列を、二番目の配列の要素で降順にソートしたいのですが、
そういう関数って用意されていますか?
sortあたりで調べたんですが見つからなかったので
誰かわかる人いたらお願いします。
ちなみに上の結果は

$a[0] = array('aaa', 10);
$a[1] = array('ccc', 5);
$a[2] = array('bbb', 0);

です。
0040nobodyさん2005/11/27(日) 18:15:05ID:???
>>39
なんの結果?
0041nobodyさん2005/11/27(日) 18:16:11ID:???
自分が行いたいソートをした結果です
こういうふうになるような関数を探しています
0042nobodyさん2005/11/27(日) 18:20:37ID:???
usort()使うなりして自分で関数作る
0043nobodyさん2005/11/27(日) 18:25:19ID:???
>>36
1つ目:
本当に意味を理解していて参照渡しにする必要があるなら両方に&をつけないとだめ。
ただし基本的には>>4の6。
PHPで参照が必要なのは2つ(またはそれ以上)の変数に対して、どの実体を指すかを連動して変更する場合のみ。
パフォーマンスを上げる目的で参照渡しにするのは大抵NGだろうね。

2つ目:
mysql_real_escape_stringしたらあとはクエリの中でシングルクォートでくくりさえすれば%はエスケープしなくてもいいよ。
LIKEにユーザーからの入力つっこむとか言い出すなら別かもしれないけど。

>>39
usort
0044nobodyさん2005/11/27(日) 19:23:13ID:XoOSQ9gn
explodeで\nを分割できたんだ・・・全く気づかなかった(^^;

>>16
array_pop($array);
0045nobodyさん2005/11/27(日) 21:28:46ID:???
>>36
つーか%のエスケープって%%だよね
・・・ってスレ違いなレスでスマソ
0046nobodyさん2005/11/27(日) 22:16:18ID:???
>>39
簡単にarray_multisort()で一発
0047nobodyさん2005/11/28(月) 01:55:14ID:???
array[0]

array['0']
って、同じもの何でしょうか。

今まで違うものだと思ってたので
予想外の結果が出てとまどっています。
誰か知ってる人確認させてください。


だとしたら、ってことは
array[0]、array[1]、…
ってのも実は連想配列だったんですかね…
0048nobodyさん2005/11/28(月) 02:07:56ID:???
マニュアル読め
0049nobodyさん2005/11/28(月) 02:25:52ID:???
質問です。
このスレではどれくらいの割合で、
「マニュアル読め」というレスがありますか?
0050nobodyさん2005/11/28(月) 02:28:04ID:???
>>49
マニュアル読め
0051nobodyさん2005/11/28(月) 02:52:44ID:???
>>49
20%くらいじゃないの?
0052nobodyさん2005/11/28(月) 02:55:53ID:???
>>50までで6%
0053nobodyさん2005/11/28(月) 03:13:59ID:???
聞いといてアレなんですが、暇だったので調べてみました。
前スレを対象にマニュアルでレスを絞り、
マニュアル嫁的なレスを数えてみたところ、18のレスがありました。
およそ2%ですね。ちなみにくだ質の前スレは20のマニュアル嫁的なレスがありました。

これからも頑張ってください^^
0054nobodyさん2005/11/28(月) 04:04:34ID:???
>>47
実際にはPHPには連想配列しかないと考えていいと思う。
マニュアルには
> 配列型は1つだ けで、整数または文字列のインデックスを使用することができます。
と表現されてるけど、実際にはインデックスには文字列しか使えないと言ったほうがベター。

PHPでは整数インデックスであってもハッシュ表を検索している。
つまり暗黙の型変換は'0'→0ではなく0→'0'の方向に行われる。
メモリ上のオフセットでアクセスする本物の整数インデックスと比べると計算理論上の計算量は等しいけど、実質的にはPHPで配列へのアクセスが大量にあると普段は高速なPHPもひどく速度落ちする。
ハッシュがらみ以外に余計な計算はしていないので、速度落ちの原因はそれ以外ないと思う。

「インデックスに整数も使える」と言っているのは、「Perlで言うハッシュしか使えない」という側面を隠蔽するためのPHP側の戦略。
ここに暗黙の型変換がうまい位置で役立っている。
まあ実用上は「整数も使える」とごまかしておいたほうがわかりやすいってのはあるけど。
0055nobodyさん2005/11/28(月) 04:10:38ID:???
ほんとマニュアルの冒頭くらいよんでからレスしてください
0056nobodyさん2005/11/28(月) 04:21:31ID:???
マニュアルもいいけどたまにはソースにあたるのもいいぞ。
PHPのハッシュは単純な見た目と操作感に反して、色々と工夫が面白い。
0057nobodyさん2005/11/28(月) 04:33:09ID:???
5.0.5(5.0.4だっけ?)や5.1.0でのforeach()のチューニングとか、頑張ってるよね。
0058nobodyさん2005/11/28(月) 04:34:37ID:???
>>57
なにそれ?くわしく。
0059nobodyさん2005/11/28(月) 04:54:44ID:a54yzRbD
パフォーマンス気にするくらいならPHPなんて使ってないだろ(w
0060nobodyさん2005/11/28(月) 04:57:09ID:???
>>59
釣りはいいよ。
0061nobodyさん2005/11/28(月) 04:57:41ID:???
釣りっていうか常連馬鹿
というかこいつレス読んでたんだなw
0062nobodyさん2005/11/28(月) 06:31:41ID:???
というか、ここは質問スレなんだが・・・
0063nobodyさん2005/11/28(月) 06:38:05ID:???
今気づいたのかよ
0064nobodyさん2005/11/28(月) 07:47:10ID:???
ろっぽんぞー
0065nobodyさん2005/11/28(月) 09:19:28ID:???
>>39
aaaが0だったのが、aaaが10になるようにsort?
0066nobodyさん2005/11/28(月) 11:36:21ID:ig9+vMm1
再帰を使ったディレクトリ操作でつまづいてます。

function scan_directories($dir) {

$file_array = array();

if (is_dir($dir)) {

$dh = opendir($dir);
chdir($dir);

while (false !== ($filename = readdir($dh))) {
array_push($file_array, $filename);
}

closedir($dh);

foreach ($file_array as $file) {
if (is_dir($file) && !is_parent_or_current($file)) {
scan_directories($file);
} elseif (is_file($file)) {
//ファイルに関する処理
}
}
}

こういう関数を作ったんですが、ひとつのディレクトリを降りていくだけで、
ほかのディレクトリが無視されます。どうしたら全部のディレクトリとファイル
を見付けてくれるのでしょう?
0067662005/11/28(月) 11:37:26ID:ig9+vMm1
あれ、インデントが消えてる。読みにくくてすみません。
0068nobodyさん2005/11/28(月) 11:56:02ID:8B6mTUuj
>>67
まず、「is_parent_or_current」が何か教えてくれ(−−;
0069nobodyさん2005/11/28(月) 12:06:34ID:y2JYG8tO
>>66
$fileにディレクトリパスを含んでない
0070nobodyさん2005/11/28(月) 12:18:27ID:???
一生悩んでろ(・・;
0071nobodyさん2005/11/28(月) 12:39:49ID:???
>>70
あなたには聞いてません。文と顔文字があってないですよ(´_ゝ`)プ
0072662005/11/28(月) 13:42:01ID:ig9+vMm1
>>68
ああ、すみません。指定ディレクトリが親ディレクトリか
カレントディレクトリの場合trueを返す関数です。

>>69
そのとおりでした。ありがとうございます。

とかいってまだ動いてないんですけどね。
回答くださってありがとうございました。
0073nobodyさん2005/11/28(月) 13:51:58ID:???
>>66
再帰から返った時点でchdirで上に戻ってないからまずいんじゃないの?
0074nobodyさん2005/11/28(月) 14:23:13ID:???
>>73
それは無い
0075nobodyさん2005/11/28(月) 14:39:51ID:???
>>74
アホか。
・chdir一切せず、$fileには初期のカレントディレクトリから相対パス全体を保持
・chdirしながら$fileにはbasenameのみ保持、再帰呼び出し直後でchdir("..")
のどちらかだろ。
どーせ理解できてないんだろうがな。
0076662005/11/28(月) 15:20:50ID:ig9+vMm1
>>75 >>73
おっしゃるとおりでした。
気が付かなかった私はあほやね。

今度は動きました。m(__)m
0077nobodyさん2005/11/28(月) 16:49:17ID:???
さて。ここで質問するのがもっとも適しているかどうかはわかりませんが、
Win2000Pro + Apache + (PostgreSQL or MySQL)
にて、LAN内のみにおいて、ブラウザベースでの簡易なデータベース操作(データ登録、削除、表示)を行いたいと思います。
当方、PHPはだいたい使え、SQLも問題ありません。(と思う)

ここで問題となるのが、ブラウザで表示した表の印刷に関してです。
通常テーブルタグにて適宜データを列挙するのがブラウザベースのやり方だと思いますが、
A3やA4縦などの所定の用紙に印刷するために、みなさんはどのような方法を取っていますか?
0078nobodyさん2005/11/28(月) 17:08:50ID:???
帳票出力と言うことならExcelに出力してるよ
COMでね
0079nobodyさん2005/11/28(月) 17:14:54ID:???
>>77
PDF
0080nobodyさん2005/11/28(月) 17:31:48ID:???
>>77
まあPHPのPDF関数がどこまでできるのか知らんけど、PHP+SQLで普通のWebページ作るのに慣れてるんだったらCSSでなんとかするのも一つの方法ではないかと。
たしかCSSって元々は出版関係とかにも使えるような仕様だったと思うからそこそこ使える希ガス。
widthとかmarginとかはパーセントでもセンチでも指定できるし、page-break-*とか組み合わせればけっこういけると思う。
スレ違いだけど。
0081nobodyさん2005/11/28(月) 17:36:42ID:???
>>80
http://msugai.fc2web.com/web/CSS/media.html
0082nobodyさん2005/11/28(月) 17:42:21ID:???
一昔前だが、PDF関連のライブラリが有償のしかみつけられなかったから全部自前で用意した記憶が。
その辺りのコスト考えるとCSSの方が手っ取り早いと思う。

無償のPDFライブラリがあるなら是非俺も知りたい。
0083802005/11/28(月) 17:42:59ID:???
>>81
なるへそ。一つかしこくなったかも。
ありがとん。
0084nobodyさん2005/11/28(月) 17:47:24ID:???
>>82
http://fpdf.japansite.net/
0085822005/11/28(月) 18:10:34ID:???
>>84
おほ
商用利用もフリーなのか
ちょっくら調べてみますありがd
0086772005/11/28(月) 19:15:10ID:???
お返事ありがとう^^
スタイルシートが手軽そうですが、PDFだとカコイイですね。
とりあえずPDF関連は知識がないので、
CSSで作成後、随時PDFにチャレンジしていこうかとおもいます。
0087nobodyさん2005/11/29(火) 07:03:16ID:???
アップロードしたファイルにidを持たせ『aのファイルはid=1を持っているのでtest.php?id=1でダウソ』できるようにしたいのですがMysqlでidは書き込んだ順に1づつ上がるようにしたんですがファイルにとなるとわかりません。
どうかご教授ください。
お願いします。
0088nobodyさん2005/11/29(火) 07:05:16ID:???
>>87
最大値を保持するテキストファイルでも作れば?
0089nobodyさん2005/11/29(火) 07:48:29ID:gl3Jq/2L
>>88
MySQLでやれよ(w
MySQLあるのにテキストファイルって。。。
0090nobodyさん2005/11/29(火) 08:00:13ID:???
>>87
MySQLで発行したidをファイルに付けるだけのことなんじゃ・・・
0091nobodyさん2005/11/29(火) 08:42:59ID:???
要はシーケンスの使い方がわからないってことじゃ?
MySQLは使ったことないけど、確かautoとかをカラム名の前に
つけるんじゃなかったっけ?
0092nobodyさん2005/11/29(火) 08:43:37ID:???
>>89
たったそれだけのことにMySQLを稼動させるのもw
0093nobodyさん2005/11/29(火) 08:46:50ID:???
一応、テキストファイルを使った最適な方法をば。

flock 後、ファイルを上書きモードで開き、
格納されてる数値を読み取った後、先頭にseekしてインクリメントした数値を書き入れる。
0094nobodyさん2005/11/29(火) 08:49:05ID:???
工工エエエエ(゚д゚;)エエエエ工工
0095nobodyさん2005/11/29(火) 08:59:09ID:???
>>94
ゑ?
0096nobodyさん2005/11/29(火) 09:03:09ID:gl3Jq/2L
>>92
テキストファイル読む方が遅いだろう。
SQL発行する方が速いし。

>>93
flockしたまま終了しちゃってるとか、seekできなかったとか、書けなかったとか、例外処理がいろいろ面倒だけどね。
0097nobodyさん2005/11/29(火) 09:14:19ID:???
ファイルのパス、ファイル名をレコードに持っておけばいいだけのような

番号をテキストファイルで管理するのは、シングルクライアントだと言い切れるならいいかもしれんが...
0098nobodyさん2005/11/29(火) 09:16:00ID:???
常識人はお呼びでないよ
0099nobodyさん2005/11/29(火) 09:30:46ID:???
>>87
ディレクトリの中のファイル一覧を作成して、その中で最大数となるファイル名(数字)に
+1して行くしかないよ。仮にMySQLで発行されるIDと関連付けるならmysql_insert_id();
で新規追加されたIDを拾得してそれをファイル名に使えばOK。
0100nobodyさん2005/11/29(火) 09:38:42ID:???
同時アクセスがあったときにインクリメントだけでファイルの名前付けやってると
同名ファイルでかち合ったりしないかと危惧しているのですよ

ファイルのまんまバイナリでDB放り込むってのもアリではないですかと
0101nobodyさん2005/11/29(火) 10:37:45ID:???
>>100
そこまで読むかww
0102nobodyさん2005/11/29(火) 11:07:17ID:???
そこまで考えるなら、ロック用ファイルを最初から最後までロック。
0103nobodyさん2005/11/29(火) 11:18:43ID:???
>>96
flockはプロセス終了で自動的に解除じゃないっけ?

>>100
flockだけの単純な構造でも、同時アクセスでもかちあったりはしないよ。
連続でflockを囲んで1000回ファイルをアクセスを繰り返すスクリプトを、複数ブラウザから同時に起動させても、
ちゃんとカウントは ブラウザ枚数×1000 になる。
0104nobodyさん2005/11/29(火) 11:23:27ID:???
ていうか、うpろだを作るなら、ページ読み込みごとにフォルダ内検索でもあるまいし、
うpされているファイルのレコードを作成しておくのが自然だから、
(うptime, REMOTE_ADDR、オリジナルファイル名、ファイルサイズ、ファイル種別、等)
それでもって極めて普通に1レコード作ればいいんじゃ。
IDはシーケンス。
01051042005/11/29(火) 11:39:40ID:???
スマソ質問の意味を勘違いしていた。

とりあえず、UNIQ_IDでファイル名を保存しておいて、MySQLにインサートした後IDを取り出し、
それでもってファイル名を変更する。
でいいんじゃないかな?
0106nobodyさん2005/11/29(火) 12:11:28ID:???
キーフィールドを「auto_increment」にして、
ファイル名をuniqidで振りなおしてから管理しとけばいいんじゃねぇの?
0107nobodyさん2005/11/29(火) 12:14:13ID:???
PHPの質問マダァ?
0108nobodyさん2005/11/29(火) 14:38:43ID:???
んでは期待に沿ってPHPのちつもんです。

わたくし、PHP3国際化版にて日本語文字対応の掲示板を作成したことがあります。
さて、季節もうつろい、現在は国際化PHPというのではなく、JSTRINGというので日本語を対応していると聞きます。
ただ、JSTRINGという名詞しか知らないので、これからやろうとする私に、
よくわかるようにおしえていただけませんか?
0109nobodyさん2005/11/29(火) 15:05:44ID:???
膣門
0110nobodyさん2005/11/29(火) 15:18:42ID:oXQKlnSf
ファイルの先頭に追記したいんですがどうしたらいいですか?
一度ファイルの内容を退避して、新データ+退避データを全部書き込まなければいけないんでしょうか?
それだと時間かかるし、ファイルの最後に追記すると、出力するときにデータを最後まで読まなければいけないんで、
なんかいい方法plz!
0111nobodyさん2005/11/29(火) 15:19:39ID:???
これもFAQに入れといたほうがいいんじゃねーの
0112nobodyさん2005/11/29(火) 15:20:34ID:???
>>110
ファイルアクセスってそういうもんだよ
うまい方法なんてないよ
データベースでも使えよ
0113nobodyさん2005/11/29(火) 15:35:51ID:???
>>110
> 時間かかるし

実際、時間掛かったんでしょうか?
0114nobodyさん2005/11/29(火) 15:36:05ID:???
>>108
PHP4+でmbstring使ってください。

>>110
ファイルの先頭に挿入するには全体を書き換えるしかない
あ、末尾に追加する方で最後のデータの位置(ftellの返り値)だけ別のとこに保存しとく手もあるか。
サイトの規模や内容をよく吟味して決めてくれ。(読み込みが多いか書き込みが多いかとか)
多くの場合>>112の言うようにDB使えば無問題だけどね。

>>111
たしかにそうかも。
0115nobodyさん2005/11/29(火) 16:14:09ID:???
>>110
安全のため、別ファイルを新規作成しそれに書き込み、完了後前ファイルを消すなりRenameしてばくあっぷとるなりして、
新たに作成されたファイルをRename。

ここまで、最初にファイルを開く前からロックファイルを使うなりしておく。
0116nobodyさん2005/11/29(火) 17:04:57ID:???
fseekでファイルポインタを末尾(もしくは末尾付近)に移動してから読み込む
0117nobodyさん2005/11/29(火) 18:29:12ID:???
Pukiwikiみたいに/?○みたいな引数を受け取るにはどうすればいいですか?
0118nobodyさん2005/11/29(火) 18:31:11ID:???
くえりーすとりんぐ♥
0119nobodyさん2005/11/29(火) 20:06:04ID:???
ぱすいんふぉちゃうんかと
■ このスレッドは過去ログ倉庫に格納されています