トップページ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辺り
0005nobodyさん2005/11/27(日) 00:12:49ID:eBvjdczp
「エスパーきぼんぬ」「氏ね」「(゚Д゚)ハァ?」等のレスを貰う八ヶ条。
1. ハードウェア、OSのバージョン等には一字一句触れない。
2. 大切な個人情報が漏れるとまずいので、己の行った操作、変更などは秘密。
3. エラーメッセージの類は決して書かない。「エラーが出るんです」で留める。
  目の前で生じている現象をそのまま具体的に書くなどもっての外。
  事実より俺様の脳内解釈を優先すべし。
4. 独り言文体で必勝。
  「…なんだけど、どうすればいいのかなぁ」「何が悪いんだろう?」
5. 「急いでいます」「困っています」等、自分の都合を全面に押し出す。
6. もう試したことを得意げに指摘してくる奴には、厳しく対応。
  「それが駄目だったから質問してるんです」「それはもう試してみて駄目でした」
  "どう"だめだったのか、本当に実際それを行ったかどうかなんか問題じゃない。
7. ストレートに答えを書かないもったいぶったレスには、逆切れで対応。
  「だからどうすればいいんですか?」「分からないなら引っ込んでろやゴルァ」
  示されたURL等を参照するなんて態度は、回答者を甘やかすことに他ならないので
 絶対に避ける。
8. 情報は小出しに。

「エスパーきぼんぬ」 補足
上の八ヵ条を「一つでも」満たす者は質問者として不適格だということだ。
そのような悪い質問に対して答えられるのは,
質問者の意図をすべて汲み取ることのできるエスパーでもなければムリ,
という意味であって,決して,高度な技術を持つユーザに対する尊称でなはい。
まちがっても「エスパーの方,回答お願いします」なんて痛い質問するな。つーかカエレ。
0006nobodyさん2005/11/27(日) 00:13:27ID:???
華麗な誘導乙!
0007nobodyさん2005/11/27(日) 00:13:59ID:???
いじょ。●もたまには役に立つな。
0008nobodyさん2005/11/27(日) 00:15:07ID:???
>>6
いや、みんなよく1000get我慢してくれた。ありがとう、ありがとう。
0009nobodyさん2005/11/27(日) 00:37:48ID:???
ナイスな展開だったな
0010nobodyさん2005/11/27(日) 00:55:01ID:???
前スレ>>969
見つけました、で終わるんじゃなくて
質問したんだったら、どう解決したのかも書け
getID3(http://www.getid3.org/)だと思うが
0011nobodyさん2005/11/27(日) 00:57:00ID:???
peclの方じゃないの?
0012nobodyさん2005/11/27(日) 01:20:11ID:???
すいません、質問です
送られてきたクエリーがASCIIかどうか判定する関数が
欲しいのですが、そういう関数って用意されているのでしょうか
あったら教えてください。
0013nobodyさん2005/11/27(日) 04:12:56ID:???
WindowsXPでphp-5.1.0-Win32.zipをダウンロードしました。
PEARをインストールしようとgo-pear.batを実行し、
なにも反応がないのでENTERを3,4回叩くと、
以下のようなエラーが出てしまいます。

Fatal error: PEAR_Installer_Role::require_once(): Failed opening required 'PEAR/Installer/Role/Php.php' (include_path='.;c:\php\includes;c:\php\pear') in phar://go-pear.phar/PEAR/Installer/Role.php on line 80

どうすればよいでしょうか?
0014nobodyさん2005/11/27(日) 04:52:09ID:???
>>12
ageてね。
ASCIIかどうかってのが言葉通りの意味なら自分で書くしかないよ。

function ctype_ascii($str) {
 for ($i = 0; $i < strlen($str); $i ++) if (ord($str{$i}) & 0x80) return false;
 return true;
}

あとは目的としているものがctype_*関数でどうにかならないかどうかもチェック。
ctype_printとかは0x80以上でもtrueになる範囲があるので注意。

>>13
ageてね。
反応があるまで待ってみたら?
0015nobodyさん2005/11/27(日) 04:57:56ID:???
待って処理しても同じだろうけどなw
0016nobodyさん2005/11/27(日) 10:46:06ID:9sz9qgK1
ファイルの拡張子を取得するため、
例えばabc.jpgのファイルであれば
$array=explode(".",$filename)
$array[1]
でできるのですが、ほかの箇所に.があった場合にうまく処理できません。
どこに.があろうと拡張子を取得するにはどうすればよいでしょうか?
4.3.11を使用しています。
0017nobodyさん2005/11/27(日) 10:51:20ID:???
arrayを逆順にしてみたら?
0018nobodyさん2005/11/27(日) 10:57:28ID:???
>16
pathinfo
0019nobodyさん2005/11/27(日) 11:11:08ID:???
PHPとCGIは別物ですか?
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はシーケンス。
■ このスレッドは過去ログ倉庫に格納されています