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

【PHP】質問スレッド Part15

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/03/07 02:03ID:???
PHP全般の質問スレです。
上級者用や雑談スレを立てたくなった場合は後から適宜立ててください。

■本家
 http://www.php.net/

■日本 PHP ユーザ会
 http://www.php.gr.jp/

■PHP マニュアル
 http://www.php.net/manual/ja/

■PEAR マニュアル
 http://pear.php.net/manual/ja/

過去スレ, 関連スレ及び注意事項等は、 あふぉが居なけりゃ>>2-5
0331nobodyさん04/03/14 13:26ID:???
>>329
初心者だけどアドバイス
sleep(10);
とかじゃダメかな?
ttp://php.s3.to/man/function.sleep.html
033232004/03/14 13:37ID:???
>>326さん
できました。しかし、それだとmysql_queryとか全部に一回一回代入してから関数を実行するのでソースが汚いです。
>>325さんの方法だと、全部のパターン書かないとだめっぽいので
すなおにmysql_queryと書きます。DBが変わった時はclassの中だけpgとか書き直せばいいので、class使わないで書いていたソースよりははるかに
直す場所が少ないので我慢します。
0333nobodyさん04/03/14 13:56ID:???
質問させてください。
過去ログにあった、
http://pc.2ch.net/php/kako/1013/10139/1013919792.html
の>>473と同じくCSVのデータを変更したいのですが、
どのようにすればいいでしょうか?
fputcsvとかあればよかったんですが…
0334nobodyさん04/03/14 14:32ID:???
331さん、ありがとう。
やってみました。どうも、これだけではうまくいかないみたい・・・鬱
0335nobodyさん04/03/14 14:52ID:???
>>334
どこがどうダメですか?
100秒経過してからまとめてechoされる感じが気にくわないとか?
0336nobodyさん04/03/14 15:31ID:???
>335
そうなのです。そのとおりなのです。
まとめてechoされてしまいました。
0337nobodyさん04/03/14 15:33ID:???
バッファのフラッシュがどうのこうので〜
とかいってるけど、結局IEじゃぁどうあがいても10秒ごとに出力はしてくれないんだよな_| ̄|○
0338nobodyさん04/03/14 15:57ID:???
>>337
出力制御とダミーデータを組み合わせればできそうな気がする。

ob_implicit_flush(1);
while (ob_get_level()) ob_end_flush();
for($i=0; $i<10; ++$i) {
    echo "<!--" . str_repeat(".",1024) . " -->";
    echo "test<br />";
    sleep(10);
}
0339nobodyさん04/03/14 17:05ID:???
>>333
無理。
0340nobodyさん04/03/14 17:26ID:???
>>330
お前優しいな
0341nobodyさん04/03/14 17:49ID:???
>>336
JavaScriptのほうがええよー
0342nobodyさん04/03/14 19:11ID:???
>>305
アク禁だったので遅レスだが
>詳しい友達から聞くと
>関数はexe自体、クラスはlnkだ、つってたんですが・・・

訊き方が悪かったか、友人の回答に対する解釈(理解)が悪いのか、
詳しい友人とやらが言語仕様に対する実装が単一だと勘違いしてるとか、
その他プログラムがCPUで実際にどう動いているかの理解が不足してるか、
そのどれか。

ずっと同じような環境でプログラミングやってきた人は陥りやすいかも。
組み込み系だと、変数は3文字以内、クラス少なく、継承はしない
などが「良いJavaプログラミング」だったりします。
# あくまでも環境の違いによる考え方の違いの例であって、
# JVMの実装の違いによる考え方の違いの例ではないけどね>上の例
034330504/03/14 20:46ID:???
>>342
なんか、ファイルが複数ある場合、関数を呼ぶ時はそのファイルごとにincludeするから、無駄だっていってたんですが
クラスにしたって、必要のあるファイルごとでincludeしますよねぇ。。
よく分からないです。
関数は、exeをいろんなフォルダにコピーして動かしている。クラスはショートカットを作っているんだ、とも言ってましたが
0344nobodyさん04/03/14 21:38ID:???
>>333
それ僕も知りたい
やりかたわかったら教えて
0345nobodyさん04/03/14 21:55ID:???
あのねぇ
本家のところからPHPマニュアルダウンロードしてきたんだけどねぇ
文字化けしてるのか、中国語になってるのかで読めないんだよねぇ
ちゃんとphp_manual_ja.chmをダウンロードしたんだけどねぇ
これどういうことかねぇ
0346nobodyさん04/03/14 22:01ID:???
PHPで perlの"use strict;"なことをしたいのですが、
そういったものは用意されていますかね?教えてください!
0347nobodyさん04/03/14 22:56ID:???
>>344
一行が可変のテキストファイルを一部の行だけ変更するのは無理っしょ。
結局全て読んで書き出さないとダメだと思う。
頻繁に書き換えるなら、これからはSQLiteなんかを使うのがいいかも。
どうしてもテキストファイルだけで、かつ全ファイル一気読みを避けたいというなら、

ループの中で1行ずつ読み込む。
目的の行でなければ、そのまま新しいファイルへ書き出す。
目的の行なら変更して新しいファイルへ書き出す。
これをファイル終端まで繰り返す。
終わったら、新しいファイルを元のファイル名へリネームする。

こんな感じかな。以前、ちょっとしたファイルで使った方法。
一気読みだけど、PEAR_Authで認証情報の格納先にFileを指定した
場合に使われるFile_Passwdもテンポラリファイルに書き出してリネームする
方法を用いていましたよ。(今もそうかは知らんけど)
0348nobodyさん04/03/14 23:00ID:???
>>345
なってるなー

どっかで文字化けして無い修正されたの流れてるんだけど
どこだっけな・・・
0349nobodyさん04/03/14 23:16ID:???
継承がわけわからーん。。。。
class aとclass b extends aがあって、class aにメソッドbがあって
class bにコンストラクタを省略したらclass aのメソッドbが呼ばれるのは分かるけど、何の意味があるんだ・・・

<?php
class example{
var $x,$y;

function example($x=3,$y=4){
$this->x=$x;
$this->y=$y;
}
}

class example2 extends example{
var $x,$y,$z=2;

function total(){
return $this->x * $this->y + $this->z;
}
}

$obj=new example();
$obj2=new example2();
echo $obj2->total();
?>

これで14が返ってくるのを期待してたんですが・・
プロパティはそのまま使えるっていうのはどういうこと???
035034904/03/14 23:20ID:???
あれ・・・できた。

<?php
class example{
var $x,$y;

function example($x=3,$y=4){
$this->x=$x;
$this->y=$y;
}
}

class example2 extends example{
var $x,$y,$z;

function example2($z=2){
$this->z=$z;
}

function total(){
return $this->x * $this->y + $this->z;
}
}

$obj=new example();
$obj2=new example2();
echo $obj2->total();
?>

これじゃできないのに・・・
継承されるクラスにコンストラクタがあってはいけないということですか??
0351nobodyさん04/03/14 23:24ID:???
>>349-350
>$obj=new example();
これ不要。
0352nobodyさん04/03/14 23:26ID:???
つーか、$objと$obj2は別物。
0353nobodyさん04/03/14 23:32ID:???
>>350
$job2でのコンストラクタはexample2で、exampleは単なるメソッドにしか過ぎない。
継承するクラスにコンストラクタがない場合のみ、基底クラスのコンストラクタが働きます。
もうちっとマニュアル読めばわかると思うが。
035434904/03/14 23:39ID:???
>>352
いや、分かってるよ、それは

>>353
なるほどね
0355nobodyさん04/03/14 23:40ID:???
ふーん、PHPってそんなんだっけ。
コンストラクタしか継承しないのか、だめだめだな・・・
0356nobodyさん04/03/14 23:46ID:???
>>351 ちがいます。349,350のnew exampleは無意味だけど無関係。
>>350
350だと、example2 クラスで(constructorかどうかではなくて)、
継承出来ないように親=exampleクラスのmethodを上書きしてる
からだめなだけ。
class example{
var $hoge = 2;
function disp() {
return $this->hoge+1;
}
}
class example2 extends example{
$a = new example2;
print $a->disp();
}
だと3になるけど

class example{
var $hoge = 2;
function disp() {
return $this->hoge+1;
}
}
class example2 extends example{
function disp() {
return $this->hoge+2;
}
}
$a = new example2;
print $a->disp();
だと4になるというだけです。
0357nobodyさん04/03/14 23:53ID:???
351=352=353なのだが(;´Д`)
>>349-350をみると勘違いしているっぽく見えた。

>>356
どこのメソッドを上書きしてるのよ?
035835704/03/14 23:59ID:???
>>356
スマン、言いたいことを、またもや勘違いしていた。ゴメソ。
035934904/03/15 00:07ID:???
>>356
それはオーバーライドのことですよね?
0360nobodyさん04/03/15 02:37ID:???
textareaのPOSTで受け取った改行入りの文字列を
改行を無く出力したいのですが、どのようにしたらいいでしょうか?
0361nobodyさん04/03/15 03:39ID:???
>>360
対象の変数 $value に対して、

$newValue = strtr($value, "\x0d\x0a", '');

とすればいい。

http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Remove
0362nobodyさん04/03/15 09:34ID:???
セッションに変数を保存するとき
$_SESSION に連想配列で入れるのと
session_register() を使うのと
どちらが より一般的なのでしょうか

趣味?
0363nobodyさん04/03/15 10:58ID:???
>>361
できましたあぁぁ
ありがとうございました!
0364nobodyさん04/03/15 11:02ID:???
>>361
と、おもったらできてませんでした(´・ω・`)
0365nobodyさん04/03/15 11:20ID:???
>>363-364
ブラウザに表示させて確認してしまったっぽだなw
環境によっては改行コードがCRやLFのみだったりするから。

$NewValue = mb_ereg_replace("\0x0d|\0x0a","",$Value);
で、いいんじゃね。
0366nobodyさん04/03/15 11:50ID:3OJL3637
session_save_path("/home/user/hozon”);
としてセッションの保存先を変更しているのですが、
どうも/tmpにできてしまいます。
0367nobodyさん04/03/15 12:27ID:???
>>365
それでもできないみたいです(´・ω..;: ∵.
0368nobodyさん04/03/15 12:41ID:???
>>367
地道にやれ

$a = str_replace("\r", "", $Value):
$b = str_replace("\n", "", $a);

これでおかしかったら他がおかしい。
0369nobodyさん04/03/15 13:26ID:???
>>368
ありがとうできました(*´ω`*)
0370nobodyさん04/03/15 13:30ID:LUBZXH8j

phpで2chのdatファイルを取得する方法について、どなたかよろしいでしょうか。

ttp://www.monazilla.org/document/や
ttp://age.s22.xrea.com/talk2ch/などの資料があるのですが、
よくわからないながらもできるだけ参考にして以下のようなスクリプトを書きました。

<?
ini_set( 'user_agent', 'Monazilla/1.00' );//これは念のため

$fp = @fsockopen("pc2.2ch.net", 80);
if($fp){
fputs($fp, "GET /php/dat/1078592587.dat HTTP/1.0\r\nUser-Agent: Monazilla/1.00\r\n\r\n");

while (!feof($fp) && $o != "\r\n")
$o = fgets($fp, 512);
while (!feof($fp))
echo fgets($fp, 4096);
fclose($fp);
}

?>
0371nobodyさん04/03/15 13:31ID:LUBZXH8j
(↑の続き)
リクエストがあるたびに毎回、datファイル全体を読み込みなおせばいいのですが、
それではものすごい負荷がかかってしまうので>>17氏に従いfsockを使う事にしています。

ひとまず差分の事などは置いておくとして、
dat全体をまず読み込めるようにしよう!と思ったのですが、、

>>370のようにすると何も返ってこないのです。
接続先をwww.2ch.netにした場合は人大杉のページが表示されました
HTTPの基本的な事で間違えているような気がします。
どなたか、簡単なフォーマットのようなものでもいいのでご教授お願い致します。m(_ _)m

0372nobodyさん04/03/15 16:05ID:Di4hYbsQ
すんません、質問なんですけど
ファイルのロックって例えば、1つのログファイルを共有している2つの掲示板スクリプトから
同時に書き込んだ時も大丈夫ですか?
0373nobodyさん04/03/15 16:11ID:???
>>372
はい
0374nobodyさん04/03/15 16:18ID:???
>>372
それは大丈夫じゃない
0375nobodyさん04/03/15 16:20ID:???
>>372
大丈夫
0376nobodyさん04/03/15 18:28ID:???
スクリプト中で、n秒経ったらこの関数を実行、というような事はできないでしょうか?
037737204/03/15 18:37ID:???
>>373-375
大丈夫って事でいいのでしょうか。
ありがとうございました。
0378nobodyさん04/03/15 18:55ID:???
>>377
ちゃんと作れば大丈夫
0379nobodyさん04/03/15 19:00ID:???
>>376
マニュアル嫁
隅から隅までじっくりとな
038022104/03/15 19:13ID:???
あの、、、僕のはどうなんでしょう
038137604/03/15 19:24ID:???
>>379
時間がもうあまり・・・
何かキーワードだけでも
0382nobodyさん04/03/15 19:28ID:???
>>381
「寝ろ」
038337604/03/15 19:29ID:???
あ、因みにこれは別プロセスというか、メインの処理は普通に進行しつつ、
決められた時間になったら強制的に関数を起動という意味です
sleepではありませんので念のため・・・
038437604/03/15 19:37ID:???
実は>>328の続きというか、未だにこれが解決してないので別の方法を探している所なのです

set_time_limitとset_error_handlerを設定した上でエラー時にエラー名を調べて
タイムアウトと判断した際に自前のメッセージを出す関数を作れば>>321が可能な事は
わかったんですが、ウチのレンサバがPHPをSafemodeで起動しているせいで
set_time_limitが使えないことが判明し、また振り出しに戻ってしまいました
0385nobodyさん04/03/15 19:47ID:???
>>384
なんで*たまにだけ*極端に長くなるのか、何の処理をしてるのかその辺も書いてもらわないと
誰も分からないと思うよ。あと、"質問者の情報の小出し"はやめよう。

あと、実行時間が極端に長くなるような(どれくらいか知らんけど)スクリプトを動かすのは
結局そのレン鯖に迷惑がられるんじゃない?
038637604/03/15 19:56ID:???
>>385
fsockopenでの読み出しで止まっているようです
socket_set_timeoutも使ってるんですが何故か効かない・・・
これ以上はサイトがバレバレなので控えたいです
0387nobodyさん04/03/15 20:26ID:???
>>380
session_destroyはセッション変数をクリア(NULLにしたり解放したり)しているわけではない。
session_destroy後もセッション変数に代入された値は生きている。
マニュアルをよく読めば判るが、セッションに登録されているデータを破棄している。
要は、session変数を保存しているファイルそのものを削除してしまう。

session_unsetはsession変数を解放する。session変数を保存しているファイルそのものは
存在するが、中身は空っぽ(に近い状態)になる。
038836204/03/15 21:01ID:???
ところで今日の晩御飯はなんだった?
$_SESSIONを使うのが一般的だとすると
session_register()は何のためにあるのか
さっぱりわからんし
0389nobodyさん04/03/15 21:20ID:???
てか、マニュアルのセッションのページを小一時間読め

話はそれからだ
0390nobodyさん04/03/15 21:21ID:???
>>386
それsocket禁止されてんじゃあ・・
ちなみにforで65535ループ2重くらいにすればphpすぐタイムアウトするよな
萎えすぎる
0391nobodyさん04/03/15 22:15ID:???
>>386
fsockopen で開いた後の fread か fgets で止まるということかな?
その場合は、非ブロックモードにすれば止まらなくなるはず。
PHP 4.3.0 以上でしか使えないし、扱いが難しいけど。
039236204/03/15 22:19ID:???
>>389
セキュリティとコードの可読性のために$_SESSION (またはPHP 4.0.6以前は$HTTP_SESSION_VARS)の使用 が推奨されます。

これね。そういえばうちは秋刀魚だったよ。
0393nobodyさん04/03/15 22:54ID:???
誰か文字化けしてないマニュアルくださいよ
0394nobodyさん04/03/15 23:08ID:???
ttp://www.php.gr.jp/project/doc/
0395nobodyさん04/03/15 23:35ID:???
>>290>>393
新しいので作ってみた
chm版
http://up.isp.2ch.net/up/031d77c3b544.zip

どうでもいい話だが、本文は別に文字化けしている訳じゃない。
対応フォントを表示できない環境で見ようとしているだけ。
0396nobodyさん04/03/16 00:03ID:???
>対応フォントを表示できない環境で見ようとしているだけ
それを見た側から言うと文字化けというのじゃないだろうか
0397nobodyさん04/03/16 00:06ID:???
>>395
乙。まだロダが混んでいていただけてませんが。
で、聞くけど、対応したフォントをインストールしていると
そのままでも読めると言うことかな?
どのフォントを使っているの?
0398nobodyさん04/03/16 00:13ID:???
PHPで配列の数をカウントしたい場合どうすればいいんでしょ。
一つ一つ$array[i]があるかどうかしなきゃならないなんてことはないですよね?
0399nobodyさん04/03/16 00:15ID:???
>>398
count()
0400nobodyさん04/03/16 00:19ID:NGiTkHYy
>>399
Thx
0401nobodyさん04/03/16 01:43ID:???
>395
マヂサンクス
いただきました。
これでマニュアル嫁る
0402追記04/03/16 06:56ID:???
>>370-371は、PHP4です・・・。
0403nobodyさん04/03/16 07:51ID:???
>>402
user agentだけじゃなくhostも送りましょう。
040436204/03/16 11:04ID:???
ところで、session_xxx() を使わず $_SESSION を使えというのは
可読性はともかくセキュリティで何か問題あるの?
0405nobodyさん04/03/16 11:31ID:NZM27FO2
セッションの保存先を変更したいと思っております。

まずpublic_htmlのsessionディレクトリをchmod 755 session
として書き込みを出来るように致しました。

そして、セッションの保存先の記述はsession_start()よりも前に書き、保存先が
変更されるように致しました。

<?php
session_save_path("/home/xxx/public_html/session");
session_start();

?>
しかし、保存先は変更されず、設定を変えているにも関わらず、
書き込みができないというエラーが出てしまいます。

どこか原因があるのでしょうか?

0406nobodyさん04/03/16 11:40ID:???
>>404
ない。

>>405
保存先ディレクトリはhttpdが動いているユーザ(一般にはnobody,www,apache等)
の書き込み権限が必要。
0407nobodyさん04/03/16 12:40ID:NZM27FO2
ご回答ありがとうございます。
ちょっとおっしゃられていることと違うことをやっていたら
ごめんなさい。
chown:chown /home/xxx/public_html/session
とすべきということでしょうか?
0408nobodyさん04/03/16 12:54ID:NZM27FO2
すみません。間違いました。
chown nobody:nobody /home/xxx/public_html/session
0409nobodyさん04/03/16 13:08ID:???
つーか755では書き込み権限は無いっしょ。
0410nobodyさん04/03/16 13:11ID:???
>>408
いいんじゃないのそれで。
ついでにパーミッションも0700に変更しとけ。
chmod 0700 保存先ディレクトリ

#SafeModeでやるとどうなるか知らんが、動くんなら気にするな。
0411nobodyさん04/03/16 13:41ID:RN6yU9c4
Cobalt サーバにPHPをインストールしたいと思っています。
GUIの画面で「pkg」拡張子のファイルを指定しろと出るのですが
PHPのパッケージって一体ドコにあるのですか?
ちなみにサーバ自体は触れません。 winのマシンでリモートで
コントロール画面をいじるような環境にいます。
CobaltはRAQ3ってやつです。 
散々webを回ったんですが、用語すら難しくてわかりません。
テルネットやLINUXの知識は皆無なんです。
よろしくお願いします。
041240204/03/16 14:28ID:???
>>403
レスありがとうございます、しかしHost:を送ったり、
fputs($fp, "Accept-Encoding: gzip");などとしてみてもだめでした。

一応、Hostを送る場合も送らない場合も「人大杉」の画面は出ました。
でも他の専用ブラウザのようにdatの内容を取得することができなかったです。

phpとあまり関係ないところで間違えてるのでしょうか、、、
もしアドバイス頂ければ、どなたかお願いします。
041336204/03/16 14:37ID:???
>>406
まじ?
じゃあなんでマニュアルに セキュリティのため なんて書いたんだろう
なぞだなぁ
0414nobodyさん04/03/16 16:27ID:???
>>411
Cobaltはパネルを通して管理するスタイルのために
他のUnix系の管理とは異なることも多く、その分 Cobaltの
コミュニティがちゃんと存在するので、そっちいって訊きな。
今のバージョンのPHPのパッケージを作ってる人がいるかもしれん。

純正のやつなら、Cobalt買ったときにメディアが付いて来たろ。
バージョンは古いけど。なけりゃCobaltのサイト(まだあるかな?)
にも置いてあったな。

>散々webを回ったんですが、用語すら難しくてわかりません。
>テルネットやLINUXの知識は皆無なんです。
別にCobaltならtelnetやLINUXの知識はなくてもいいが、
逆にCobalt独自の管理知識しらないとやっていけないぞ。
それを勉強するのに用語が判らないのなら、前提となる
Unixの一般知識も勉強しな。
0415nobodyさん04/03/16 16:44ID:???
ファイルからファイルを読み込んで、指定した文字数を超えると
「..」と語尾につけたいのですが、どのようなスクリプトを書いたらいいでしょうか?
041641504/03/16 16:45ID:???
あ、因みにそのファイルは、半角と全角が混じってます。
0417nobodyさん04/03/16 16:58ID:???
仕様にさえ合えば mb_strimwidth() が楽。
0418nobodyさん04/03/16 17:06ID:???
>>417
できましたー(*´ω`*)ありがとうございました。

PHPには色々便利な関数がありますね
0419nobodyさん04/03/16 17:11ID:???
入力された文字列に2バイト文字があるかどうか判別したいんですが、
正規表現かけるのが定石なんでしょうか?
英語向けサイトで文字化けを防ぎたいのですが。
0420nobodyさん04/03/16 17:32ID:???
>>419
mb_detect_encoding() は?
0421nobodyさん04/03/16 17:33ID:???
echo (mb_strlen($str) != mb_strwidth($str)) ? 'マルチバイト文字有り' : 'マルチバイト文字無し';
0422nobodyさん04/03/16 17:37ID:???
>>421
頭いいな
0423nobodyさん04/03/16 17:48ID:???
>>420
>>421
サンクスです!
>>421で出来ました。
0424nobodyさん04/03/16 18:03ID:6IiWiqvl
掲示板などに書き込む前に
「この文章でよろしいですか?Y/N」みたいなアラートを出したいのですが
vbでいうmsgboxみたいなもの教えてください。
0425nobodyさん04/03/16 18:07ID:???
>>424
ブラウザは何使ってる?
IEならJavaScript使えばいいし
ネットスケープならJavaScript使えばいい
そのほかなら自分で調べるしかないけど
0426nobodyさん04/03/16 18:08ID:???
>>424
JavaScript板に行け
0427nobodyさん04/03/16 18:08ID:???
>>402
<?
$fp = @fsockopen("pc2.2ch.net", 80);
if($fp) {
fputs($fp, "GET /php/dat/1078592587.dat HTTP/1.0\r\nHost: pc2.2ch.net\r\nUser-Agent: Monazilla/1.00\r\n\r\n");
while (!feof($fp) && $o != "\r\n") $o = fgets($fp, 512);
while (!feof($fp)) echo fgets($fp, 4096);
fclose($fp);
}
?>
これで読めるけど。
0428nobodyさん04/03/16 18:15ID:???
>>424
alert出すならJavaScript。板違いなのでぐぐってからWeb制作板へ。
確認画面出すならPHPでできるがな。
0429nobodyさん04/03/16 18:21ID:6IiWiqvl
>>428
確認画面を出したいです。

phpで書いてある掲示板なのでおなじsubmitのところにはjavascriptは無理なのでは?
javascriptの中にphp書くのも不可能じゃないんですか?

たぶん相当バカな事いってると思いますが心を仏にしてお願い致します。
0430nobodyさん04/03/16 18:46ID:???
>>429
お前はまず他人に物を教わる時の作法を覚えてこい
なにが「心を仏にしてお願い致します」だアフォ
■ このスレッドは過去ログ倉庫に格納されています