トップページ⇒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 
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
0592nobodyさん03/08/03 02:11ID:???
保守
【PHP】初心者コーナー 3 Released【スローモード】
アホな質問であっても詳しく質問しろよ。 ネタはおもしろく書けよ。
0593nobodyさん03/08/03 02:16ID:???
>>592
え?この板って1時間でスレ落ちするほど保守せなあかんの?
0594nobodyさん03/08/03 02:20ID:XIyh3dEf
Parse error: parse error, unexpected T_CONCAT_EQUAL in …
といわれたんですがどういう意味でしょう?
バージョンは4.3.3RC2です。
0595 03/08/03 06:33ID:???
>>594
文法エラーです。
…で予期しないT_CONCAT_EQUALが
0596nobodyさん03/08/03 21:48ID:fj+ph+5s
上でも2回ほど出てる話題なんだけど、自分で調べたことと
ちょっと食い違いがあるんで質問させてください。

phpで掲示板作った場合、書き込んだ文字列に¥が勝手に
入ってしまう現象って、レンタル鯖での解決方法はstripslashes()関数を
つけることのほかに.htaccessで

php_flag register_globals on
php_flag magic_quotes_gpc off

と書いてアップすれば防げるって
ttp://www.komonet.ne.jp/report.htm
とか
ttp://www.e-provider.jp/server/php.html

に書いてあるんだけど、public_htmlフォルダ内に.htaccess置いても
防げません。.htaccessはメモ帳で「.htaccess.txt」として作成して、
アスキーモードで鯖にアプ後「.htaccess」にリネームしました。
テスト用のbbstest.phpは同じディレクトリにあります。
書くのはあの2行だけでいいんでしょうか?とりあえず2行だけに
しときましたが。

ちなみに鯖はaaa!cafeで、鯖HPのFAQには.htaccessは使えますって
書いてありました。

初心者な質問ですみませんが識者の方、どなたかお答え願えませんでしょーか。
0597nobodyさん03/08/03 21:57ID:???
>>596
aaaの.htaccessは当てにしない方がいい。
0598nobodyさん03/08/03 21:57ID:fj+ph+5s
…なんかディレクトリ指定とかしなくちゃいけないっぽいですか?
中途半端な質問ですんまそん。
調べてもどこもかしこも「php_flag〜の行を“含む”.htaccessファイルを」
と言ってるんで他にも書くことありそうだとは思って調べてるんですが…

.htaccessの正確な書き方が書かれたサイトが全然みつからん…
ミケネコのなんとかは分かりづらすぎ…
0599nobodyさん03/08/03 21:59ID:fj+ph+5s
>>597

アア、俺書き込み多すぎ。痛い。

そうですか、なんかあそこFAQの答え方がなげやりですもんね。
自作bbs置く香具師はめんどくてもコード書けってことか。ちくしょう。
0600nobodyさん03/08/03 23:44ID:???
>>596
書き方自体はそれでok
あとはユーザディレクトリの.htaccessが有効によまれるのか、
設定の上書きを許可しているのかとか
その辺
0601nobodyさん03/08/04 00:00ID:???
>>579
遅いレス。mysqlの「ソ」は私も悩んだ。
文末が「スマソ」とか「日本代表」だとエラーが出るんですよね。
phpinfoでmysqlの"Client API version"を4.*にすると症状は治まります。
どうも3.*のバグ(?)のようです。
mysql4.0+php4.3.2だとconfigureで--with-mysql=/usr/local/mysqlとかするといいみたいです。
0602nobodyさん03/08/04 01:07ID:QF7utWcH
>>600
サンクスコ
結局stripslashes関数で回避しました…
060357903/08/04 10:05ID:s0qIBXCy
>>601
ありがとうございます。
バグだったんですか^^;
どおりでおかしいと思いました。
では一度4に変えてみます^^
0604nobodyさん03/08/04 18:00ID:8zL9M6pT
スクリプトでgdライブラリがインストールされてるかどうかを
判断するにはどうした良いですか?
0605 03/08/04 18:24ID:???
>>604
適当なイメージ関数が定義されているか調べれ
0606nobodyさん03/08/05 01:16ID:???
>>604
http://www.php.net/manual/ja/function.extension-loaded.php
0607nobodyさん03/08/05 01:36ID:???
PHP5でregister_globals=On に変えても パラメータを渡せない
んだけど、もしかして無くなったのかな、どうよ。
0608nobodyさん03/08/05 08:57ID:V6DdtSg7
PHP初心者です。メール送信フォームの確認画面を設けているのですが、

$html="
<pre>
<br>
<form method=post action=$file>
<table width=480 border=0 align=center>
TEXT1: $r[0]
</table>
</form>
</pre>
";

と記述するとTEXT1の文が長すぎると途中できれてしまうのです。自動で改行する良い方法
はありませんでしょうか?よろしくおねがいします。
0609nobodyさん03/08/05 10:22ID:???
>>608
<table>使わなけりゃいいんじゃないの
0610nobodyさん03/08/05 11:45ID:BUuQIqrM
文字コード変換にこのようなことをしようとしているのですが、

function convert_code (&$val,&$key,$code,$oldcode){
  $val = mb_convert_encoding($val,$code,$oldcode);
}
array_walk ($array, 'convert_code','EUC-JP','SJIS');

array_walk ( array arr, string func [, mixed userdata])
という仕様ですが、この場合、userdataは配列や複数の値を
渡せないのでしょうか?
061160803/08/05 11:53ID:V6DdtSg7
>>609
<table>使わないと全体的に左に寄ってしまいますよね。
バランスが悪いので何か対処法はありませんでしょうか?
0612nobodyさん03/08/05 12:27ID:???
>>608
HTMLの書き方が無茶苦茶。
PHPの勉強もいいですが、まずHTMLから始められてはどうでしょうか?
0613nobodyさん03/08/05 12:38ID:???
確かに。
よく見りゃつっこみどころ満載の「HTML」だ。
0614あぼーんNGNG
あぼーん
0615あぼーんNGNG
あぼーん
0616nobodyさん03/08/05 13:16ID:???
>>610
function convert_code (&$val,&$key,$opts){
  $val = mb_convert_encoding($val,$opts[0], $opts[1]);
}
array_walk ($array, 'convert_code', array('EUC-JP', 'SJIS'));

可変引数は渡せないから第3引数にmixed型を渡すように
なっている。
だから配列もしくはオブジェクトなら渡せる。
0617nobodyさん03/08/05 16:11ID:???
>608
CSSを使用すれば余白の制御など細かく出来る。
CSSが大変そうなら <blockquote> タグあたりでどうかね?
0618nobodyさん03/08/05 17:37ID:woPpy0rJ
php+MySQLでデータベースの入力フォームを作っております。

 前略
 mysql_query(insert into T1(f1,f2,...) values('$1','$2'...));
mysql_query(insert into T2(fA,fB,...) values('$A','$B'...));
mysql_query(insert into T3(fa,fb,...) values('$a','$b'...));

といったように、一つのphpファイルに連続して複数のテーブルに入力
しようとしても、最初のクエリのみしか受け入れてもらえません。
フォームからの変数は問題なく受け取っており、エラーになるわけでも
ありません。
どなたか、原因と対処を御教示下さい。 m(_ _)m
061961803/08/05 17:42ID:woPpy0rJ
ちなみにphpのバージョンは4.0.6です。(プロバイダがアップデートしてくれない (-_-;))
0620nobodyさん03/08/05 18:21ID:???
>>618
mysql_query("insert into ・・・");
にしないとエラーになるんですが。
062161803/08/05 20:07ID:HahDoJ1D
>>620さま

$result1 = mysql_query("insert into T1(f1,f2,...) values('$1','$2'...)");
$result2 = mysql_query("insert into T2(fA,fB,...) values('$A','$B'...)");
$result3 = mysql_query("insert into T3(fa,fb,...) values('$a','$b'...)");

こんな感じで記述してあります。618は筆足らずでした。。
0622あぼーんNGNG
あぼーん
0623あぼーんNGNG
あぼーん
0624あぼーんNGNG
あぼーん
0625nobodyさん03/08/05 21:38ID:???
>>618
mysql_query()を呼んだ後は、返り値がTRUE(非ゼロ)またはFALSEのどちらかを確認して、
もし返り値がFALSEならmysql_errno()とmysql_error()を確認しよう。
さもなくば「エラーが出てない」とは言えない。
062661803/08/05 22:25ID:HahDoJ1D
>>625
感謝!!
早速確認してみます。  ・・・でも、localhostで動作確認したときは
問題なく全入力出来たのに、、、
どういう可能性が考えられるのでしょう?
0627nobodyさん03/08/05 23:04ID:???
>616
ありがとうございました。マニュアル眺めてるだけでは、なかなかわからんもんです。
0628nobodyさん03/08/06 09:32ID:TaNZWYB4
$_POSTなどでフォームのデータ受け取ると、"や'とか\が勝手にエスケープされてるのはなぜ?
仕様?
0629nobodyさん03/08/06 10:06ID:???
>>628
magic_quotes_gpc
で検索
0630あぼーんNGNG
あぼーん
0631あぼーんNGNG
あぼーん
0632nobodyさん03/08/06 12:52ID:9CpMMik0
ブラウザ上からquota見たいんですがのう。
popenでquota呼んだら
>Disk quotas for user xxxx (uid xxxx): none
しか来ないんだけど。
telnetだとusageとかgraceとか出るのにー

何か手ないすか?
0633あぼーんNGNG
あぼーん
0634nobodyさん03/08/06 13:31ID:???
> xxxx (uid xxxx):
伏字にしているのはエスパー募集だからですか?
0635nobodyさん03/08/06 15:15ID:???
>632
とりあえずシェルから quota 呼ぶのと PHP(HTTPデーモン経由)から quota 呼ぶのとで
ユーザーが違ってると言ってみる
0636nobodyさん03/08/06 15:24ID:???
>>632
xxxxを見ればわかりそうなものだ
wwwとかnobodyとか
0637nobodyさん03/08/06 18:46ID:wRB10Bh6
文字列をある程度の長さで省略したいんですけど、
日本語と英数が混じってると最後が・になったりして
おかしくなる場合があります。どうすれば上手くできるんでしょうか。
使ってるサーバーがmb関数使えないサーバーなんですけどできますかね。
0638nobodyさん03/08/06 20:10ID:+64gfyUC
te
0639nobodyさん03/08/06 20:21ID:???
>>637
漢字コード変換
http://www.spencernetwork.org/
0640nobodyさん03/08/06 20:52ID:???
>>637
文字コードが一定なら正規表現で1字ずつ数えれば良かろう。
([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})
とかね。似たような関数をperlから移植する手もある↓
ttp://www2u.biglobe.ne.jp/~MAS/perl/waza/strcut.html
0641nobodyさん03/08/07 15:46ID:oxPy+Rmw
PHP+MySQL環境でディレクトリー式メニューを実現しようとしていて、
「ID:ジャンル名:所属ID」
という再帰テーブルを作りました。
この場合、直下にあるデータ一覧は所属IDをIDで検索すればすぐ出ますが、
トップからのパスはジャンル>所属しているジャンルID>さらに上のID…>
トップと検索して配列にセット、それを反転してトップ>ジャンル>その下の
ジャンルと整形しています。
この場合何度もSELECT文を出さなければなりませんが、もう少し効率的に
やる方法はないですか?
0642nobodyさん03/08/07 21:33ID:???
>>641
ツリーにIDを1つ追加するときに、そのIDのフルパスを別のテーブルに登録しておけばよい。
0643404.HDML ◆StMXML.EXE 03/08/08 01:59ID:???
fsockopen関数から開いた、リモートファイルのポインタからファイルサイズを
取得する方法は有りますか?

それとも、リモートファイルの内容を一時ファイルとして保存したものをfilesize
関数で読み出すべきでしょうか?
0644nobodyさん03/08/08 02:17ID:???
>>643
相手がHTTPで、且つそのヘッダでContent-Lengthが出力されてれば、
そこから取得することは可能。他のプロトコルは、やはり一度ナメるしかないんじゃないかな。
0645404.HDML ◆StMXML.EXE 03/08/08 02:30ID:???
>>644
リモートからContent-Lengthが返って来ない場合は取得不可なのですね。
有難うございます。

後、うっかり「HTTPでオープン」って書くの忘れてました。すみません。
0646404.HDML ◆StMXML.EXE 03/08/08 03:15ID:???
んと。fsockopen関数からHTTPとして開いたポインタから、予め上限を決めて
fread関数からデータを読みこみ、それをstrlen関数を使ってサイズを測る、、

という方法を試したら、何故か8192バイト以上が読みこめなかったので、
fgets関数をEOFを検出するまで回し、その過程で取得したデータを一本に
繋げてstrlen関数で読むという方法で何とかなりました。
0647 03/08/08 03:27ID:0z0bK8pF
freadって4.3.2から仕様変わった?
0648nobodyさん03/08/08 03:33ID:???
リモートファイルをincludeで呼び出しています・・・
サーバーが停止している場合はローカル上のファイルを
includeするようにしたいのですが、
どうすればいいのでしょうか?
0649 03/08/08 03:38ID:???
>>648
fopenか何かでリモートに繋ぎ、ダメだったらローカルを読む、と。
0650nobodyさん03/08/08 07:01ID:???
>>645
HEADメソッドでContent-Lengthだけ貰えば本体は貰わなくて済むよ。
ただしfopen()は使えないけど。
0651nobodyさん03/08/08 09:56ID:LraV0Dku
>642
ありがとうございました。

別の質問です。
MYSQLでAutoIncrementのフィールドがあるとき、INSERTしたあと
現在のその数を取得するには再びSELECTするしかないのでしょうか?

登録IDを作りたいと思っていて、PHP側でキーを生成してPrimary設定の
フィールドにINSERTするよりは綺麗な連番になるかと思ったんですが、
保存後にIDが何番になったか再取得しないと表示できないのです、、、
0652nobodyさん03/08/08 11:16ID:???
>>651
selectで再取得した方が確実。
さもないとチャットのように同時に10人とか発言されたら目も当てられない。
0653nobodyさん03/08/08 12:28ID:???
>>637
substr()/mb_substr()でなくてmb_strcut()というのがある。
便利です。
0654nobodyさん03/08/08 13:18ID:LraV0Dku
>652
ではどうやって再取得したらよいでしょうか。
今回の場合はそこまでクリティカルではないので問題ではないですが。

mysql_affected_rowsを利用するか、mysql_insert_idでしょうか。
前者の場合は再取得前に次の値がセットされればダメですし、
後者はいまいち使い方が分からない。。。
0655nobodyさん03/08/08 13:28ID:LraV0Dku
ちなみに、
$info = mysql_fetch_array(mysql_query("show table status from DB_USER like 'TABLE_NAME'",$MyLink));
$inserted_id=$info[Auto_increment] - 1;
という方法もありますが、これでもチャットレベルではダメかも。
0656nobodyさん03/08/08 14:17ID:???
>652

http://www.php.net/manual/ja/function.mysql-insert-id.php
マニュアルのとおり、単純に mysql_query した次の行で $foo = mysql_insert_id;
と書けば $foo にIDが取れる寸法のはず。

link識別子を使い分ける場合は明示的に指定する必要がある
■ このスレッドは過去ログ倉庫に格納されています