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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/06/14 14:36ID:???
・PHP全般の質問スレです。
・新規質問の方は上げてください。age進行でお願いします。
・質問する際には環境も明記。
・正しい日本語で分かりやすく。
・レスがつかないからって逆切れする厨お断り。
・解決しなくてもこたえてもらったら礼を。


■本家
 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-4


抜けているものがあったら補足願います
052151704/06/30 17:37ID:???
>>520
すいません、もう少しヒントくれると嬉しです、、(´・ω・`) 変数宣言でマニュアルくぐっても何も出ずなので、、
0522nobodyさん04/06/30 17:38ID:???
>>521
レスありがっつぉございます。
やっぱexitしないといけませんですかぁ。
a.phpに複数ファイルを並べておいて、
順に落とせるようにしたいんですけど・・・
052351604/06/30 17:41ID:???
あ、間違えた。>>519さんでしたね。
強引にロケーションを戻すしかないかな。
0524nobodyさん04/06/30 17:50ID:???
>>510
糞コードで口座とか言ってるあたり、餌が安すぎるよなぁ。
0525nobodyさん04/06/30 17:56ID:???
>>522
何悩んでるのかよく分からんが、下のを実行しても「geko」が表示されることは無い。
(POSTだと長くなるのでGETで代用した。)
<?php
if(isset($_GET[file]) && $_GET[file] != ''){
header("Content-disposition: attachment; filename= test.txt");
header("Content-Type: application/octet-stream");
readfile($_GET[file].".txt");
}
?>
<html><body>
<a href="a.php?file=a">download</a>
<?php
if(isset($_GET[file]) && $_GET[file] != ''){ print "<p>geko</p>"; }
?>
</body></html>
052651704/06/30 17:58ID:???
>>520
って >>517 じゃなくて >>499 へのレスか。
勘違いした、、(´・ω・`)
052751604/06/30 18:16ID:???
>>525さん
あ、あれ・・・このサンプルでまさに意図していた通りの動きですよ?
強烈に何かを間違えている予感。
自分とコードを見つめ直します。
052851604/06/30 18:36ID:???
うぅっ。できました。えらい勘違いでした。申し訳ないです。
>>519さんので正解だったんですね・・・
スレ汚しすいませんでした。
0529nobodyさん04/07/01 00:31ID:???
>517
その通り。

>PHP の標準のエラーハンドラは完全にバイパスされることに注意して下 さい。
>error_reporting() の設定は影響せず、どの ような場合でもユーザが設定した
>エラーハンドラがコールされます。ただし、この場合でもハンドラで
>error_reporting() のカレントの値を読み、適当に動作させることは可能です。

と、PHP マニュアルの set_error_handler 関数のページに書いてある。
053051704/07/01 01:27ID:???
>>529
ありがとうございます。

見落とし杉、、_| ̄|◯||
0531nobodyさん04/07/01 14:28ID:???
http://jp.php.net/manual/ja/function.set-error-handler.php
にあるように
error_reporting(E_ALL);
set_error_handler("myErrorHandler");
をしても Parse error や Fatal error を捕まえられないわけですが、
どうしても捕まえたいです。別の方法、もしくはよいアイディアはないでしょうか?
# ob_get_contents() して Parse error などの文字を preg_match() させようとも思いましたが
# ユーザ側の入力で万が一でも Parse error と入力した場合も捕まえてしまいますし…。
0532nobodyさん04/07/01 15:39ID:???
>>531
そのページ内をparseで検索してみると、サンプルコードっぽいのが載ってるよ。
でもなんか強引すぎるような.....
0533nobodyさん04/07/01 16:28ID:???
>>532
ありがとうございます。
ob_* を使って「error</b>」で検索する方法や eval() ですよね。
eval() は怖いし、ob_* は万が一マッチしたら、という不安や、
長時間処理の時に ob_flush() が使えないのが困り者です。

PHP5 になったらプログラム全体を try ... catch で囲むとか…。
うーん。引き続き妙案募集です。
0534nobodyさん04/07/01 23:50ID:???
初歩的なことを聞いてすみません。
PHPでチャットを作ろうと思っているんですが、
発言内容をログファイル(log.txt)に
↓のように<>で一つの発言ごとに区切って保存してある場合

------ log.txt ------------------------------------------------
名前0 : メッセージ0<>名前1 : メッセージ1<>名前2 : メッセージ2<> ・・・・
---------------------------------------------------------------

次のように配列に代入するにはどうしたらいいですか?
$a[0] ‥‥ "名前 : メッセージ0"
$a[1] ‥‥ "名前 : メッセージ1"
$a[2] ‥‥ "名前 : メッセージ2"
      :
      :

$fp = fopen("log.txt", "r");から先がどう書いていいのかが分かりません。
よろしくお願いします。
0535nobodyさん04/07/02 00:14ID:???
>>534
fgetsで1行読み込んで、explodeで分割。
053653404/07/02 00:20ID:???
>>535
それはこういうことでしょうか?
$a = explode('<>', fgets($fp));
0537nobodyさん04/07/02 01:00ID:???
そいでもってデバッグのお約束print_r($a)を使うと、
あらまっ、奥さまっ
0538nobodyさん04/07/02 01:53ID:6/QnGsWt

オクサマッ534ミタ?( ´д)ヒソ(´д`)ヒソ(д` )アラヤダ
0539nobodyさん04/07/02 02:19ID:???
PHPでは文字列および1行の長さに制限は無いが、
デバッグとかでそれをファイルに書き出して見ようとすると
非常に見づらいので、適当に改行が入るフォーマットにするのが普通

ではないかと思ってみる
0540nobodyさん04/07/02 07:25ID:???
>>534
<>のかわりに改行で区切ったほうが楽だと思う。
それだと$a = file('log.txt');で終わり。
生のログファイルも見やすい。
0541nobodyさん04/07/02 13:29ID:???
汎用的なログイン機構を模索中なんだけど、模範解答ってある?
とりあえず認証成功したらユーザIDをセッションに保持するのを
書いたんだけど、動くんだけどどうにもしっくりこないです。
状況に応じて最適解は変わるってのは百も承知だけど
なんというか、基本的な部分だけに毎回車輪の再開発するのも
ちょっとイヤンな感じで。
0542nobodyさん04/07/02 13:41ID:???
PEAR::Auth とか LiveUser は?
0543nobodyさん04/07/02 16:56ID:???
>>541
模範解答という訳ではないが、何種類かのパターンの解説
「Web認証システムの作り方大全―Apache/IIS/PHP/Servlet&JSPそれぞれの場合」
http://www.amazon.co.jp/exec/obidos/ASIN/4797321490
0544nobodyさん04/07/02 20:57ID:proF8LyP
$a="[任意の長さの任意の文字列]●[任意の長さの任意の文字列]";
で最初の●より後に▲があったら全て×に置き換えたい(最初の
●のあとに再び●が出てくることも、出てこないこともある)

↑こういう変換をしたいのですが、どうしたらよろしいでしょうか?
かなり複雑なことをしないと無理ですか?
0545nobodyさん04/07/02 21:31ID:???
>>544
preg_replaceやereg_replace使えばできそうだけど?
054654404/07/02 21:45ID:proF8LyP
>>545
●より後の、▲以外の文字をそのまま残すということが可能でしょうか?
054754404/07/02 21:52ID:???
ああ、preg_replaceでならできそうですね。
やってみます。
ありがとうございました。
0548nobodyさん04/07/02 21:57ID:6Y75o+Jb
$new_text = nl2br($_POST[text]);
$fp = fopen("data.txt",a);
fwrite($fp,$new_text);
fclose($fp);
と改行コードを<br />に変換して出力したところ、<br />には変換されているのですが、改行されてしまっています。
代わりに str_replace("\n","<br />",$_POST[text]);とやっても同じでした。\r\nでもだめです。
0549nobodyさん04/07/02 22:21ID:???
>>544
preg_replace_callbackのほうが適任のような。

>>548
Windowsでは$fp = fopen("data.txt", "ab");としないと
テキストモードでファイルが開かれ、fwrite/fputsするたびに改行が入るわけだが、
OSは何をお使いで?
055054904/07/02 22:23ID:???
自己レス。"ab"の件は記憶違いだったかも・・・。
055154804/07/02 22:31ID:???
サーバはLinux(Vine2.6)です。プログラム作成・入力はWindowsです。
スクリプトはEUCを使用しています。
055254804/07/02 22:32ID:???
abでもだめでした。
055354404/07/02 22:41ID:proF8LyP
>>549
ありがとうございます。
難しそうですが、やってみます。
055454804/07/02 22:50ID:???
なぜか、出来ました。
str_replaceで。
055554404/07/02 23:16ID:proF8LyP
$a = preg_replace_callback ( "/^.*●.*▲.*$/" , "/^.*●.*×.*$/" , $a ) ;
return $a ;

こんな感じでやってみたら「第二引数が足りない」という趣旨のエラー
メッセージが出たのですが、どうしたらいいんでしょうか?
preg_replace_callback 関数の第二引数に他の関数かなにかを入れ
ないといけないのでしょうか?
055654904/07/02 23:34ID:???
>>555
たのむからマニュアルぐらい読んでよ。。。
ttp://jp.php.net/manual/ja/function.preg-replace-callback.php

お前さんのやりたいことはこのコードでできるはず。
function hoge($m) {
return $m[1] . str_replace("▲", "×", $m[2]);
}
$a = preg_replace_callback("/^(.*●)(.*▲.*)$/", "hoge", $a);

●や▲が半角英数字じゃないと期待通りには動かないこともあります。
055754404/07/02 23:45ID:???
>>556
どうもすいません。ありがとうございます。
0558nobodyさん04/07/03 00:04ID:???
>>556
"最初の●より後に▲があったら全て×に置き換える" ということなので、それでは
$a = 'test●▲●▲';
の時にはうまくいかないような・・・。

単純な置き換えだったら、preg_replace_callback() を使わなくても e オプションを使えば
いいような気がするので、以下のような感じでどう?

$a = preg_replace("/^(.*?●)(.*▲.*)$/e", '"\\1" . str_replace("▲", "×", "\\2")', $a);

マルチバイトを考慮したら mb_ereg_replace() を使うといいと思うけど。

$a = mb_ereg_replace("^(.*?●)(.*▲.*)$", '"\\1" . str_replace("▲", "×", "\\2")', $a, "e");
0559nobodyさん04/07/03 00:14ID:???
>>558
なるほどー。そういう手がありましたか。
自分はマルチバイトを含む文字列をトリッキーな置換するときは
UTF-8決め打ちでpreg_replace_callbackでuオプションを使ってますが
将来mb_ereg_replace_callback関数ができたらそっちも使ってみたい。
あとpreg_*でUnicodeプロパティーのサポートも希望したいですね。
0560nobodyさん04/07/03 01:02ID:???
DoCoMo/2.0 YYYY(c10;serXXXXXXXXXXXXXXX;
こっからserXXXXXXXXXXXXXXXだけを取り出したいのだがどうすればいい?
問題はYYYYが必ず同じ長さではない。
つまりser以降指定の文字数を得たいのだが…
0561nobodyさん04/07/03 01:07ID:???
>>560
すぐ上で正規表現がでてきてるのに、そんなこと聞きますか...
0562nobodyさん04/07/03 02:36ID:???
正規表現を使うまでもない。文字列関数で
0563nobodyさん04/07/03 02:59ID:???
>>561
スマン、正規表現でがんがったんだがさっぱりわからん、、、。

>>562
それも考えてみたんだが問題が。。。
FOMA
DoCoMo/2.0 N2001(c10;serXXXXXXXXXXXXXXX; iccxxxxxxxxxxxxxxxxxxxx)
PDC
DoCoMo/1.0/X503i/c10/ser***********
こんな風に違うんだよな…。
さらにVodaなんか
http://www.dp.j-phone.com/dp/tool_dl/web/useragent.php
J-PHONE/4.0/J-SH51/SN************ SH/0001a Profile/MIDP-1.0 Configuration/CLDC-1.0
Ext-Profile/JSCL-1.1.0
0564nobodyさん04/07/03 05:38ID:???
全部に対応する正規表現を書くより
機種によって振り分けた方がいいんじゃな?。
0565nobodyさん04/07/03 07:59ID:???
>>563
正規表現の書き方がわからんのなら、正規表現スレで抽出条件を詳しく書いて聞けばいい。
とりあえずDoCoMoの分だと、serに続く文字列で ; もしくは行末までって条件でいいのなら
(ser[^;$]+)
0566てふてふ04/07/03 11:22ID:Upkf89lK
すみません。質問です。phpdev5をwindowsXPにインストールして
日本語の文字化けがおきてる方っていませんか?
0567nobodyさん04/07/03 16:10ID:???
私も文字化けおきまくったのでPHPは捨てました。
0568nobodyさん04/07/03 16:52ID:wzmmIfWr
PHPで、自分のファイルの文字コードを参照するいい方法はありますか?
そのままファイル自体を読み込んで調べるしかないのでしょうか?
0569nobodyさん04/07/03 17:00ID:???
ファイルを読まずして文字コードを知れるか?
0570nobodyさん04/07/03 17:17ID:???
*参照*する以上、読まざるを得ないね。
*自分の*ファイルなんだから、PHPでそのファイルを読まなくても知る術はあるけど。
0571nobodyさん04/07/03 18:33ID:n3s5B9BG
http://www.aardvarkind.com/


ここのPHPの詳細おねがいします。英語読めません。
0572nobodyさん04/07/03 18:51ID:???
>>571
読めなかったら勉強するか翻訳サイトでも利用しろ
0573nobodyさん04/07/03 20:57ID:???
>>568
$encoding = mb_detect_encoding(file_get_contents($_SERVER['SCRIPT_FILENAME']));
0574>>571 です04/07/03 21:50ID:n3s5B9BG
>>572
ごめんなさい
0575nobodyさん04/07/03 22:28ID:???
>>573

うおーっ、ありがとうございます!!mm
mb_detect_encodingですか、勉強になりました。
0576nobodyさん04/07/04 00:34ID:fnOHrUgA
jcode.phpを使ってメールフォームを作ってるんだけど、
届いたメールの題名が文字化けします。

題名部分は $title = JcodeConvert("題名", 0, 3); で、
文字コード指定は1,2,3どれも化けます。
環境は、Win XP Pro + Apache + PHP4.2

どこがいけないの?
0577nobodyさん04/07/04 00:49ID:???
573の思考レベルと575の反応に驚愕した。
脳ミソの変わりにくらげとか入ってないか調べたい。
0578nobodyさん04/07/04 01:22ID:???
>>576
メールの件名は特別だから。
詳細をググって調べるべし。
↓と同じ感じでjcodeつかってできるようにがんがれ。
$title = "件名";
$title = "=?iso-2022-jp?B?" . base64_encode(i18n_convert($title, "JIS")) ."?=";
057957604/07/04 01:49ID:???
>>578
以下2行の追加で直りました。

$title = base64_encode($title);
$title = "=?iso-2022-jp?B?" . $title . "?=";

ありがとうございました!
0580nobodyさん04/07/04 06:26ID:???
>>573は釣りだろ。間違ってはいないけど、
「100円のものを1000個買いました。全部でいくらですか」
という問題を100を1000回足して答えを出すのに近いな
0581nobodyさん04/07/04 07:41ID:???
例えがおかしい。
釣りか?
なぜネストの話が
つーかALUでは加算の繰り返(ry
0582nobodyさん04/07/05 10:41ID:???
$encoding = mb_detect_encoding('美乳');
0583nobodyさん04/07/05 13:28ID:???
美乳コードキタ━━━━━━(゚∀゚)━━━━━━!!!!
0584nobodyさん04/07/05 16:02ID:???
<?php
$LV3 = $LV2 - $LV
$STR3 = ($STR2 - $STR) / $LV3;
$CON3 = ($CON2 - $CON) / $LV3;
$DEX3 = ($DEX2 - $DEX) / $LV3;
$INT3 = ($INT2 - $INT) / $LV3;
$LUCK3 = ($LUCK2 - $LUCK) / $LV3;
$CHA3 = ($CHA2 - $CHA) / $LV3;
?>


Parse error: parse error, unexpected T_VARIABLE

と出るのでしょうが・・・
T_VARIABLEというのは何でしょうか?
0585nobodyさん04/07/05 16:05ID:???
>>584
$LV3 = $LV2 - $LV
セミコロンがないです。
0586nobodyさん04/07/05 16:06ID:???
だぁぁ!しまった!こんな初歩的なミスを・・・
>>585様有難うございます><
058758404/07/05 16:09ID:???
教えて君すみません・・・
Division by zero in とはどういう意味なのでしょうか・・・ガクガクブルブル
0588nobodyさん04/07/05 16:11ID:???
0で割っただろ!
それくらいの英語読め
0589nobodyさん04/07/05 16:14ID:???
あれ?おかしいな・・・
$LV2に8、$LVに4入れても同じエラーが・・・
0590nobodyさん04/07/05 16:22ID:???
LV3の中身を確認しながら実行しれ
確認の仕方はマニュアル読んで調べろ
0591nobodyさん04/07/05 16:30ID:???
if($LV2 = 0 or $LV = 0){
print "レベルが入力されていません。";

}else if($STR2 < $STR or $CON2 < $CON or $DEX2 < $DEX or $INT2 < $INT or $LUCK2 < $LUCK or $CHA2 < $CHA){
print "入力した値がおかしいです。";

}else{

}

これを使ったあと全部に0が入ってた〜(なぜだ
0592nobodyさん04/07/05 16:34ID:???
>>591
あはははは。
0593nobodyさん04/07/05 16:36ID:???
某ゲームの作ってるんだが・・・
ttp://cgi.f44.aaacafe.ne.jp/~phpworld/002/seityo.php

値を出した後、ページが表示されない・・・
ソースを見ればHTMLがあるのに
0594nobodyさん04/07/05 17:13ID:???
>>591
最初の行
0595nobodyさん04/07/05 17:14ID:???
if($LV2 = 0 or $LV = 0){
もし$LV2=0で$LV=0なら じゃないんですか!?
0596nobodyさん04/07/05 17:18ID:???
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
★                                             ☆
☆ 質問者が返信する時は名前欄に「最初に質問したレス番号」を入れろ ★
★                                             ☆
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

>>595
お前はアホか・・・
$LV2=0、$LV=0にして>>584の計算をしてみろよ
0597nobodyさん04/07/05 17:20ID:???
>>595
"で"でつなぐならand
日本語の勉強もしなさい
0598nobodyさん04/07/05 17:28ID:???
>>584
比較演算子が間違ってますよ
くだらねー
0599nobodyさん04/07/05 17:31ID:???
>>593
<TITLE><TITLE>

<TITLE></TITLE>
とすれば解決。
何が原因が分からない時は問題の絞込みってやつをするといいyp。
0600nobodyさん04/07/05 17:56ID:???
今日はおもしろいですね
0601nobodyさん04/07/05 18:10ID:???
>>597
待て
0602nobodyさん04/07/05 18:19ID:???
っていうか、
>>584
>>587
>>591
>>593
が同一だったのか。
0603nobodyさん04/07/05 20:00ID:???
>>595
if文の時は == にしないとダメなんじゃなかったっけ??
0604nobodyさん04/07/05 21:01ID:???
「if文の時は」とか意味不明なことを言うなよな。

>>595
= は代入演算子だから比較の意味では使えない。
比較には == や === などを使う。詳しくは下記を読め。
http://www.php.net/manual/ja/language.operators.comparison.php
http://www.php.net/manual/ja/language.operators.assignment.php
0605nobodyさん04/07/05 21:01ID:???
>>603
if文というよりも、比較演算子'=='と代入演算子'='は別物。
0606nobodyさん04/07/05 21:02ID:???
一時間後でかぶるなYO ヽ(`Д´)ノ ウワァァン!!
0607nobodyさん04/07/05 21:07ID:???
おい!もまいら!
unexpected T_IF
ってなんだYO!
0608nobodyさん04/07/05 21:18ID:???
今日は変なやつが一匹紛れ込んでるな。
0609nobodyさん04/07/05 21:25ID:???
>>607
ファイルに保存されないぽ
これのエラーを直せたら教えてやる


if($action == "action"){
if(($NAME != "") && ($COMMENT != "")){
$NAME = htmlspecialchars($NAME);
$MAIL = htmlspecialchars($MAIL);
$COMMENT = htmlspecialchars($COMMENT);
$COMMENT = nl2br($COMMENT);
$COMMENT = str_replace("\r", "", $COMMENT);
$COMMENT = str_replace("\n", "", $COMMENT);
$input_msg = implode(",", array($NAME,$MAIL,$COMMENT,$time,$host));
$message = file($data);
$fp = fopen($data, "w"); //書き込みモードでファイルを開く
rewind($fp);
fputs($fp, "$input_msg\n");
if($data_max <= sizeof($message))
$msg_num = $data_max - 1;
else
$msg_num = sizeof($message);
for($i = 0; $i < $msg_num; $i++){
fputs($fp, $message[$i]);
}
fclose($fp);
unset($message);
}
}
061060904/07/05 21:30ID:???
スマン、普通にアホなミスしとったわい・・・
fputs($fp, "$input_msg\n");
これで保存したんだがデータが上書きされる・・・
0611nobodyさん04/07/05 21:43ID:dk5OZx2a
setcookieで書き込みはできるんですが
消す場合はどうしたらいいのでしょうか?
0612nobodyさん04/07/05 21:45ID:???
>>610
>$fp = fopen($data, "w");
あなたの書いた通りに動いているだけです。
PHPマニュアルのfopenのページをご覧あれ。
0613nobodyさん04/07/05 21:46ID:???
>>611
そんな時のためのマニュアルですよ?
0614nobodyさん04/07/05 21:47ID:???
>>603
もうちょっと勉強しようぜ
0615nobodyさん04/07/05 21:51ID:???
CGIでフレームがないけどフレームみたいなページできたよね?
あれってPHPでもできんのけ?
0616nobodyさん04/07/05 21:52ID:???
>>609
>fputs($fp, $message[$i]);
上書きされるのはwriteでファイル開いてるんだから当然として
とりあえず改行コードが抜けているぞ。
0617nobodyさん04/07/05 21:57ID:???
>>615
JavaのSiteMeshみたいな?
できるかできないかでいえば「できる」けど書くのが面倒なら
そのCGIに任意のHTMLやPHPスクリプトを読み込ませてもいいんじゃない?
プロキシみたいなもんで、ブラウザの代わりにURIにアクセスして
レスポンスボディをレイアウトし直したり、リンクのURIを書き換えたりしてるだけだと思うから。
0618nobodyさん04/07/05 21:58ID:???
T_VARIABLE や T_IF の意味がわからない人は

「PHP まぬある 付録 P. パーサトークンの一覧」
ttp://www.php.net/manual/ja/tokens.php

を読んでけれ。

"Parse error: parse error, unexpected T_VARIABLE" などという
エラーが表示された場合は、「私ってば PHP の構文解析をして
いるパーサですが、あなたの書いたソースを読んだら構文解析
に失敗しますた。予期せぬ位置に変数が表れたわよ。」と読む。

大抵の場合、パースエラーの出た変数の手前に問題があって、
セミコロン忘れてますた。括弧を閉じ忘れてますた。とかそういう
ことだたーりする。


だと思う。
061961804/07/05 22:04ID:???
「誤」
>大抵の場合、パースエラーの出た変数の手前に問題があって、
「正」
大抵の場合、パースエラーの出たイ "トークン" の手前に問題があって、

マチガエタ。サヨウナラ。サガサナイデクラハイ。
0620nobodyさん04/07/05 22:07ID:???
掲示板の多重投稿拒否はクッキー使わないとムリかな?
0621nobodyさん04/07/05 22:20ID:???
>>618
しってるよばーかマヌケ

>>620
スレとかんけーねーよ無能
■ このスレッドは過去ログ倉庫に格納されています