トップページ⇒php
853コメント275KB

【PHP】初心者コーナー 3 Released【スローモード】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/06/11 06:24ID:???
PHPに関するアホな質問はここで、マターリやろな。
ファイル MySQL PostgreSQL 正規表現でも なんでもいってみ
でもな、アホな質問であっても詳しく質問しろよ。 ネタはおもしろく書けよ。

前スレ http://pc2.2ch.net/test/read.cgi/php/1048442813/l50

■PHPの普通の質問はあっちな、【PHP】質問スレッド Part8
 http://pc2.2ch.net/test/read.cgi/php/1050249148/l50
■PHPへ移行したいPerl信者はあっちな、【待望】PerlユーザのためのPHP入門
 http://pc2.2ch.net/test/read.cgi/php/1046326634/l50
■マニュアル嫁ってうるさいのがいるからちょっとは嫁な、
 http://www.php.net/manual/ja/
■おまえ初心者なら入門本くらいかっとけな、PHP関連の書籍(但しPHP出版系お断り)
 http://pc2.2ch.net/test/read.cgi/php/985315574/l50
■これはなズープスと読むらしいがあっちな、XOOPS
 http://pc2.2ch.net/test/read.cgi/php/1031736248/l50

でもな、ここで書きたかったらここで書き。 あとは関連な、>>2 
0491nobodyさん03/07/25 11:16ID:???
>>489
俺、make cleanやってねーよ。でも動いてるけど。
どうなんだろうね? 試してみたら?
0492あぼーんNGNG
あぼーん
0493nobodyさん03/07/25 11:31ID:???
make clean 必要無いよ
make clean が何をやっているのか考えてみましょう
0494nobodyさん03/07/25 20:46ID:???
index.phpから、count/count.phpを呼び出してカウンタとして使おうとしているのですがうまくいきません。
index.phpからinclude_onceで読むのはうまくいくのですが、
count.phpからこれと同じ場所にあるデータファイルのcount.datを開こうとして

$fp =@fopen( "count.dat", "r") ;

とすると、

Warning: fopen("count.dat", "r") - No such file or directory in *********/count/count.php on line 42

となってしまいます。includeされたファイルの中で別のファイルを開く場合、パスの表記はどのようにすれば良いんでしょうか? 
読み込み元のファイルのディレクトリを基準にするのか、読み込まれたファイルのディレクトリを基準にするのかが分かりません。

と言うより後者ならこれでうまくいくと思うのですが、これだと一つのカウンタで複数ページをカウントさせるのに
面倒な気がするので、もっと良い方法が無いかと探しているのですが…
049548203/07/25 21:19ID:???
>>494
count.datを絶対パスで読み込め
0496 03/07/25 23:54ID:???
↑非常にいい子とイった!
0497nobodyさん03/07/25 23:55ID:OQ729f+c
ズブの初心者なんですが
ネット上によくある、フリーCGIの配布サイトでは時々
「セキュリティホールが見つかったのでバージョンアップしてください」
というようなことが書かれてたりしてますが、
PHPでもセキュリティホールはあるんですか?
あるとしたら、どんなのがまずいんでしょうか

とりあえず、どこかのPHPスレではPHPが「index.php」を吐くのはマズイ、
と書いてありました
フォーム入力を受け付ける、掲示板みたいなものを作る場合、タグを
除去すれば大丈夫ですか?
0498nobodyさん03/07/25 23:57ID:???
>>497
あんめろ
049949403/07/26 00:00ID:???
>>495
分かりました。その方法でやってみます。
ただ思い付きでいろいろ足して分かんなくなってきたので、
一から書直そうと思いますが。ありがとうございました。
0500nobodyさん03/07/26 00:00ID:???
>>498
すいません
おっしゃる意味がわかりません
0501nobodyさん03/07/26 00:00ID:???
>>500
喧嘩売ってんのか?
0502nobodyさん03/07/26 00:02ID:???
>>501
違います
あんめろってなんですか?
0503nobodyさん03/07/26 00:08ID:???
なんとなく気が向いたのでマジレスしてみるテスト。
>>502
PHP自体のセキュリティーホールとヘタレなコーディングによる
セキュリティーホールを混同してない?
「あんめろ」は「あんたには向いてない、やめろ」の意。
(民明書房刊「よくわかるセキュリティホール」より)
0504nobodyさん03/07/26 00:16ID:???
>>503
回答ありがとうです
自分が知りたかったのは、へたれなコーディングによる…の方でした
どんなコーディングがマズイのかな、と思って

「あんめろ」身に沁みました
0505nobodyさん03/07/26 01:21ID:???
>>497
>とりあえず、どこかのPHPスレではPHPが「index.php」を吐くのはマズイ、

なんでマズイの? 俺、吐き出してる。吐き出してる。 
0506あぼーんNGNG
あぼーん
0507あぼーんNGNG
あぼーん
0508nobodyさん03/07/26 03:13ID:83bOjRPY
PHPにファイルのアクセス時間と更新時間を変更するPerlのutimeに
相当するものはない?
てっきりfileutimeみたいな関数があるだろうと思ってマニュアルを
見てみたがどこを探してもない。
どうやって変えるのだ??
0509nobodyさん03/07/26 03:37ID:VZ1x6qD8
>>508
んなこたーない。
"ファイルシステム関数"という章をよく見る。
0510nobodyさん03/07/26 21:05ID:92eVqrLv
2chの掲示板URLみたいに
http://www.hogehoge.com/~hoge/test.php/20030724/2310
↑こんな感じにPHPへデータを渡す方法知りませんか?
0511 ◆AngelH/kMI 03/07/26 21:11ID:???
>>510
test.phpの内容を
<?php
phpinfo(32);
?>
にして結果見てみればわかる。
0512あぼーんNGNG
あぼーん
0513nobodyさん03/07/27 04:37ID:C5x2VQP+
>>509
更新変更はtouch()でやるのは分かったんだが、
最終アクセス変更をするのがやっぱり見当たらない。
0514nobodyさん03/07/27 09:42ID:???
>>513
Windowsなら単にreadしたりファイルサイズ取得関数とか使えば良し。
ファイルのプロパティ見てみ?いつも現在時刻だ。
0515nobodyさん03/07/27 22:48ID:0kmBdvtl
>>514
ファイルの中身を修正する前に、ファイルの時間情報を取得しておいて
処理が終わった後にファイルの時間情報は修正前のままにしておきたい
って場合にどうすればいいのかと。

つまり最終アクセス時間と最終更新時間を過去の時間に設定したい訳ですな。
Perlだとutimeで両方、任意の時間を入れてファイルの時間情報を修正できるけど、
PHPだとtouchで最終更新しか変更できないみたい(見つけられなかった)。

ちなみにPerlからPHPへの移植をやってる過程で出てきて???になった。
やってる移植では更新時間を見て処理に使ってるから、最終アクセスは
なくてもいいけど、なんらかの理由で最終アクセス時間の変更が必要に
なった場合はどうするんだろ?
0516nobodyさん03/07/27 23:33ID:???
touch()の3つ目の引数として最終アクセス時間
(UNIXタイムスタンプ)を指定できます。
しかしなんで公式のマニュアルには載ってないんだろ?
0517nobodyさん03/07/27 23:41ID:???
探した?あるよ。
0518nobodyさん03/07/27 23:53ID:???
あ、ほんとだ。いつもはmanual/ja見てるけどmanual/enにはばっちり載ってますね。
翻訳の遅れがあるみたいなのでこれからは英語版を見るようにします。
051951503/07/28 00:11ID:???
私も確認。Thanks. 本家php netからマニュアルにアクセスすると
自動で日本語版に切り替わるんだな。
touch (PHP 3, PHP 4 )
touch -- Sets access and modification time of file
bool touch ( string filename [, int time [, int atime]])
http://www.zend.com/manual/function.touch.php

日本語訳マニュアルをローカルに置いてそれを参照してたから
見つけられなかったよ。
英語版も随時参照すべしと自分に言い聞かせた次第。
0520nobodyさん03/07/28 00:13ID:???
ぅええ?あるよ。日本語も。
052151503/07/28 00:19ID:???
>>520
今ボチボチ本家見ててあるのに気が付いた。
普段、本家なんぞ見ちゃいないって事がバレバレな私。
0522nobodyさん03/07/28 00:26ID:???
あったでしょ。つっても
最近はけん日本語で検索できて便利よ。
ttp://www.phpoo.net
052351003/07/28 00:38ID:???
>>511
ありがとうございました。
0524nobodyさん03/07/28 15:06ID:???
phpで掲示板を作っているのですが、書き込みで「ソアラ」などとすると
ソ\アラというようにdataファイルに記録されています。
perlでつくった掲示板では普通にソアラと書き込めたんですが。
ローカルでshift-jisで書いております、eucでも試してみたんですがeucで保存すると
表示されないようです。php4.3.2を入れております。
ご助言願えませんか、ソースは下記のような感じでやってみました。
$carname = $_POST['carname'];
$newdata = implode(",", array($bango,$carname,$rap));
$kakikomi = fopen($datfile, "w");
rewind($kakikomi);
fputs($kakikomi, "$newdata\n");
0525nobodyさん03/07/28 15:22ID:???
>>524
国際化非対応だと文字が化けたりするもよん。
PHPはEUCで書く方が安心かと。
S-JISで受けたデータはjcode.phpでEUCにしてから内部で扱う。
んで、書出すときにまたEUC→S-JISに変換、と。

と言う事をどこぞで見たのだが。
052652403/07/28 17:36ID:???
>>525
ありがとうございます。EUCがいいんですね、調べてみます。
素人にとって文字コードは第一関門なんですかね。
0527nobodyさん03/07/28 17:36ID:???
質問です。

HTMLに値を埋め込む時に

<?= hoge ?>

という書き方の出来るサーバーと出来ないサーバーがあります。

www.php.net のマニュアルを見ると asp_tags という設定ディ
レクティブで設定可能なようなのですが、双方のサーバーで
phpinfo() で設定を確認すると両方offになっているのです。

出来るサーバーの方は Apache 1.x 系にPHP4.2.0 で、
出来ない方は Apache 2.x 系にPHP4.2.2です。
php.ini は特に置いてません。

上記の記法の出来る出来ないは asp_tags 以外に何か設定が
あるのでしょうか?
0528nobodyさん03/07/28 18:09ID:???
エエエェェ!!
052952503/07/28 18:30ID:???
>>526
俺も初心者なんで、あまり詳しい事は書けませんけど、色々とチュートリアルを公開しているサイトを見る限りでは
初めからEUCで扱う(無論出力されるHTMLなんかも)か、せめて内部ではEUCとして扱う方がトラブルが少ない様です。
元々UNIX系はEUCだったと思うし、jcode.phpは見た感じそれほど使い方は難しくなさそうなんで、間に噛ませても良いんではないかと。

このスレの前半の方にもそんな話があったので、探してみると役に立つやも。
0530 03/07/28 18:39ID:???
mb関数は使えんのか?

>>527
short_open_tag
0531nobodyさん03/07/28 19:24ID:???
>>524
$carname = strip_slashes($_POST['carname']);
0532nobodyさん03/07/28 19:27ID:hpj2UE6D
PEARとかPHPLIBとかよく聞きますが、PHPのクラスファイルを
ライブラリにする方法を知っていたら、誰か教えてくだすぁい。
0533あぼーんNGNG
あぼーん
0534nobodyさん03/07/28 23:51ID:???
2ch型というかほとんど2chと同じphpの掲示板ってないでしょうか。
自分でつくってるんですが行き詰まりを感じてしまって
0535 03/07/29 00:03ID:???
>>534
http://pc2.2ch.net/test/read.php/php/1055280252/
0536nobodyさん03/07/29 08:38ID:???
>530
THX

short_open_tag でビンゴでした。
マニュアルでも asp_tags のすぐ上に書いてあったし(ウトゥ
0537nobodyさん03/07/29 23:27ID:???
http://techside.net/i_shot_p/vi.cgi
ここの画像投稿BBS、どうやって画像に文字を埋め込んでいるんだろう?
0538 03/07/29 23:52ID:???
>>537
設置者に聞けよ。
GDかなんかじゃないんか?
0539nobodyさん03/07/30 00:48ID:???
文字列中の空白、カッコ、ハイフンを削除したいのですが、もっと上手い方法ありませんでしょうか?

$str="ほ げ(ほ げ)-ほ げ";
$char1=" ";
$char2="(";
$char3=")";
$char4="-";
$char5="";
$str1=str_replace($char1,$char5,$str);
$str2=str_replace($char2,$char5,$str1);
$str3=str_replace($char3,$char5,$str2);
$str4=str_replace($char4,$char5,$str3);
echo "$str4";
0540 03/07/30 01:33ID:???
>>539
preg_replace
0541nobodyさん03/07/30 02:30ID:2CHAOdfR
>>539
マニュアルより
>PHP 4.0.5 以降では、str_replace() への全てのパラメータは
>配列とすることが可能です。

0542あぼーんNGNG
あぼーん
0543nobodyさん03/07/30 03:43ID:+xTBPNpJ
PHP で perl の様な配列のスライスへの代入って出来なかったっけ?
昔、phpのメーリングリストで見たような気がしたんだけど、
googleで調べたら出来ないって書かれたサイトが出てた。
0544nobodyさん03/07/30 11:15ID:???
>perl の様な配列のスライスへの代入
ここを説明しないと。(w
0545nobodyさん03/07/30 12:12ID:???
@hoge{ 'a', 'b' }
こういうことあじぇ?
0546nobodyさん03/07/30 13:50ID:WV3lkWy5
PHP4.3をWinにインストールしてANHTTPD使ってCGIモードで
動かしてます。とりあえず
<?php phpinfo() ?>
は正常に表示されるので動作自体はしてると思うんですが
<? echo "てすと"; ?>
とかやると思いっきり文字化けしてしまいます。
winnt/php.ini へも日本語が使えるように設定はしたんですが
(default_charset = "Shift_JIS"とか)
なんか他に設定すべきところとかありますでしょうか?
0547nobodyさん03/07/30 16:24ID:L2kAsoKq
>>546
mbstringsでググレ
0548nobodyさん03/07/30 17:09ID:???
@hoge{ 'a', 'b' }
ここを説明しないと。(w
0549nobodyさん03/07/30 19:01ID:QNOIDVkY
PHP初心者です。
レッツPHPのちゅーとりあるで紹介されている
一行掲示板をいろいろとこねくりまわしているのですが、
オート・リンクの機能を付けることに躓いています。
ご指導の程、よろしくお願いします。
0550あぼーんNGNG
あぼーん
0551あぼーんNGNG
あぼーん
0552nobodyさん03/07/30 20:55ID:???
>>549
正規表現で文字列を調べて、URI(URL)があれば
それを抜き出して、アンカータグと組み合わせて
置換する。

マニュアルで置換をする正規表現関数を調べて、
それが実際どのように使われているか、レッツPHPさんの
他の配布スクリプトを見て研究してみては?
055353903/07/30 21:11ID:???
>>540-541
ありがとう
やってみます。
0554nobodyさん03/07/30 22:02ID:???
>>552
ご指摘を受けて、
マニュアルを読みましたら、つぎのような部分がありました。

例 3URLをリンクで置換する

$text = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]",
"<a href=\"\\0\">\\0</a>", $text);

これでうまくいきました。
ありがとうございます。
0555sage03/07/30 23:32ID:EqJM85qg
>>543
できない。
あればあったで便利だし、perlからの移行が楽だが
phpは配列操作の関数が比較的豊富なので
なければないで何とかなる。
0556nobodyさん03/07/31 02:11ID:DkZYq6f/
送られてきた変数を全部表示したいんですけど、
どうやったらよいでしょうか。
0557nobodyさん03/07/31 02:23ID:???
>>556
phpinfo() や foreach($_REQUEST as $value)
0558nobodyさん03/07/31 02:30ID:???
ここはひとつ豪快に var_dump(get_defined_vars());
0559nobodyさん03/07/31 04:20ID:???
phpで2進数の表記はどうすればいいのでしょうか?
0560nobodyさん03/07/31 05:08ID:???
echo '01010101';
0561nobodyさん03/07/31 09:57ID:???
>>559
$num = bindec("10101010");
0562nobodyさん03/07/31 14:45ID:UI9TuZ6S
初心者です。
特定の文字列から特定の文字列までを置換したいんだけど、どうすればいいでしょうか?
hogehoge<REPLACE>2ちゃんねら</REPLACE>hogehoge
       ↓
hogehogeDQNhogehoge
こんな感じで。
0563あぼーんNGNG
あぼーん
0564nobodyさん03/07/31 15:09ID:UI9TuZ6S
562です。
追加質問していいですか?
置換した回数をカウントしたいのですが、str_replaceやereg_replaceでは
全置換されてしまうじゃないですか。
ひとつずつ置換をする関数ってないのでしょうか?

よろしくおねがいします。
0565nobodyさん03/07/31 17:33ID:???
>562
preg_match
preg_match_all
あたりを見てみては?
056656503/07/31 17:42ID:???
補足

正規表現が良くわからず調べてもう〜んと唸るようであれば、泥臭くやるしかないかな。

strpos 等で開始タグの位置を見つけて前後の文字列で置換する文字列をサンドイッチ
して元の変数に格納という一連の処理を開始タグが見つかる限り繰り返せば結果は得
られると思うけど。

ただメモリーへのアクセスが頻繁になるからWebなんかで不特定多数のアクセスがある
ような処理につかうのはおすすめできない・・・。
0567梨03/07/31 17:52ID:Vgd/NQeb
fsockopenでHTTP/1.1接続を試みた場合に、レスポンスボディに、
数KB(?)に一度、 \nXXX\n のようなゴミ文字列が挿入されてしまいます。
(\nは改行で、XXXの部分は [0-9a-f]{2,3} のような文字列)

環境はWindows 2000で、
PHP 4.3.2 (cli) (built: May 28 2003 15:10:38)です。

再現は(他人様の物で恐縮ですが)以下のソースでも可能です。
tp://www.spencernetwork.org/memo/tips-3.php

ただし、HTTP/1.0接続をおこなった場合にはゴミは発生せず正常動作します。

phpのバグを疑った所、fsockopenがメモリを破壊する問題は、
4.3.0で発覚して4.3.2では解消されているとの事でした。


わかる方いましたら教えてください。
わからなかったらとりあえず再現を試してくれる方募集っす。
0568nobodyさん03/07/31 18:12ID:???
>567
とりあえずリクエストするサンプルサイトのURLをキボンヌ
0569nobodyさん03/07/31 18:23ID:???
よくよく考えてみたら PHP4.3.x 系の入ってるマシンが無いわ(爆)

FreeBSD4.4
Apache たぶん 1.2
PHP 4.2.0
で2chの1000までいったスレをそのスクリプトで表示してみたがゴミは無いようだった

考察はちょっとまってな。
0570nobodyさん03/07/31 18:26ID:???
あーよく見たら上のソースは HTTP/1.0 で接続してるのな。
これを HTTP/1.1 に変えてやってみればいいのか・・・
0571あぼーんNGNG
あぼーん
0572あぼーんNGNG
あぼーん
0573nobodyさん03/07/31 18:32ID:???
>567

とりあえず
>570 の変更をした上で >569 のように2chのスレを取得してみたらたしかにゴミが検出されたよ。
まぁ正確にはゴミじゃあないんだろうけどね。
ちょっと調べてみるよ。
0574梨03/07/31 18:39ID:???
>>573
スンマソ。お手数かけます。

yahooが大丈夫だけど、php使ってるサイトはだめだった。関係ないか?
ちょっと、アクセス先については根拠のある事が言えない。

>>569の環境で出るという事であれば、バグでは無いっぽいのかな。
あとで他の言語でも試してみます。
0575nobodyさん03/07/31 18:41ID:???
まぁ、fsockopen+HTTP/1.1を使うヤシでchunkを知らないわけは無いと思うから
chunkの線は無いと思うが、がんがってphp4.3.2のバグを探してくれ。
057657303/07/31 18:44ID:???
>575

漏れ的には chunk っぽい気がしてるんだけどね(爆
HTTP/1.1 なんて生で触ったこと無いからプロトコルから調べてるよ
057757303/07/31 18:52ID:???
とりあえずこちらで出てる症状としては4096バイトごとに
\r\n1000\r\n
という文字列が挿入されてるってことかな。
fgets の読み取りバイト数かと思って 512 と 1000 で試したけど変化なし。
マニュアルの fsockopen では fread を使ってたので試しにこれに変えてみても変化なし。
ちなみにレスポンスヘッダは

HTTP/1.1 200 OK
Date: Thu, 31 Jul 2003 09:41:49 GMT
Server: Apache/1.3.26 (Unix) AuthMySQL/2.20 PHP/4.1.2 mod_gzip/1.3.19.1a mod_ssl/2.8.9 OpenSSL/0.9.6g
Last-Modified: Wed, 30 Jul 2003 12:53:28 GMT
Transfer-Encoding: chunked
Content-Type: text/html
X-Pad: avoid browser bug

こんな感じで返って来てる。
0578梨03/07/31 19:01ID:???
漏れが悪かった。

ともあれ、ありが�d>>573, >>575

RFC2068にも書いてある(RFC2616を読んでね)けど、

CRLF受信バイト数の16進CRLF

が来てるって事よね。
ちょいとクライアント側の正しい実装がどんなのになるのか調べ中。
0579nobodyさん03/07/31 22:01ID:CgHqCW+i
フォームフィールドに"ソ"を入力して送信すると
"ソ\"になってしまいます。Mysqlにも"ソ\"そのまま入ります。
php.iniのmagic_quote行をoffにしてやると直ったんですが
そのままMysqlに登録すると化けてしまっています。

stripslashes()をつけてやるとこれも直るんですが
フィールドごとにいちいちつけるのは面倒くさいので
他に何かいい方法はないでしょうか?
0580あぼーんNGNG
あぼーん
0581あぼーんNGNG
あぼーん
0582梨03/07/31 22:23ID:???
使い捨てツールだったので、さぼってHTTP/1.0で実装しますた。スンマソ

>>579
mysqlのcharset設定をsjisにするとか。
0583梨03/07/31 22:23ID:???
ごめ。

「つーかeucにしろよ」と言いなおす。
0584Re: 配列のスライスに代入03/08/01 02:01ID:S9mJFNQO
返事ありがとぉ。
出来るかどうか知りたかっただけでした。
一応、マニュアルとMailing-listのアーカイブ検索したけど、それらしい記述がなかったので。
ここが最後の頼みだったんだけど、やっぱ出来ないのかぁ。残念。
0585あぼーんNGNG
あぼーん
0586あぼーんNGNG
あぼーん
0587nobodyさん03/08/01 09:04ID:???
>584

遅レスすまそ。
array_splice() でどう?

ttp://www.php.net/manual/ja/function.array-splice.php
0588nobodyさん03/08/01 18:21ID:???
>579

現象的には確か「ソ」の2バイト目が「¥」のコードと
同じなんでエスケープ処理されるってことだな。

だから stripslashes すれば消えるのはあたりまえで、
もし鯖の設定を変えられないのであればいちいちかか
なきゃならんのはしょうがない。

まぁめんどくさかったら $_REQUEST をループ回して
格納し直したらどうよ。いろんなソースに書かないと
いけないとしてもコピペで済む(あるいはクラスを書くかだな)。
0589山崎 渉03/08/02 02:21ID:???
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0590ぼるじょあ ◆ySd1dMH5Gk 03/08/02 04:50ID:???
     ∧_∧  ∧_∧
ピュ.ー (  ・3・) (  ^^ ) <これからも僕たちを応援して下さいね(^^)。
  =〔~∪ ̄ ̄ ̄∪ ̄ ̄〕
  = ◎――――――◎                      山崎渉&ぼるじょあ
0591nobodyさん03/08/03 01:26ID:???
>>588
>>266-268
■ このスレッドは過去ログ倉庫に格納されています