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

【PHP】質問スレッド Part5

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/09/11 14:15ID:FWA0CpdU
レスは気長に待つのが良い感じかも。


■本家
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-10あたりにきっと誰かが……。
0448nobodyさん02/10/17 20:10ID:???
>>444
ここのレスはすべてマニュアルをちょっと見ればわかるものだな。
0449nobodyさん02/10/17 23:11ID:???
>448
ここのレスだけじゃなくMLもな
0450nobodyさん02/10/18 11:07ID:???
php4.0.6(FreeBSD 4.2)での話なんですが

$mail_status = mb_send_mail($form["recipient"],$form["subject"],$mailbody,$mail_header);
の$mail_headerに一部日本語を含めてます(From:[email protected](名無しさん) みたいに)

で、mb_send_mail は、仕様として、最後の引数(ヘッダ)だけは文字コード変換してくれないのでしょうか?

上記のままだと、本文やタイトルは文字化けしてませんが、
From:[email protected](名無しさん) の日本語だけ、化けてます。

なので、
$mail_header = mb_convert_encoding($mail_header, "JIS", "JIS, eucjp-win, sjis-win");
としたら、文字化けは解消されたのですが。。。

こういう仕様なんでしょうか?
0451nobodyさん02/10/18 15:20ID:???
>>450
マニュアル
045245002/10/19 03:30ID:Rs0UFwL7
>>451
マニュアル見ても、string mb_language ( [string language])の設定によって、変換・エンコードされる
としか書いてないです。。。

やぱ、
boolean mb_send_mail ( string to, string subject, string message [, string additional_headers [, string additional_parameter]])
のstring additional_headersは、そのままスルーなんでしょうか・・・?
0453nobodyさん02/10/19 04:44ID:???
*.php以外のインクルードされるファイルは、htdocsの下には置かないほうが、
セキュリティ上望ましいと、聞いたことあります。
で・・・質問です。

<インクルードされるファイルは「*.inc、*.conf」の拡張子に限る>というルールをつくった上で、

<Files ~ "\.(inc|conf)$">
order allow,deny
deny from all
</Files>

をhttpd.confに加えれば、htdocsの下に「*.inc、*.conf」を置いても、セキュリティ上の問題は、
ないんじゃなかろうかと思ったんですが、実際、どうなんでしょう?
0454age02/10/19 10:02ID:???
php.ini の各項目の詳細を日本語で書いてるサイトないですか?
0455nobodyさん02/10/19 10:46ID:3cLIDoBp
>>453
それで安全だろ。
0456nobodyさん02/10/19 17:12ID:???
>>453
エディタが、拡張しPHPでないとphpのモードにならいので、
インクルードするファイルもすべて*.phpにしてmath
0457nobodyさん02/10/19 17:48ID:???
>>456
WinならTeraPadでも使えば?
MacならMi(ミミカキエディット)。
0458nobodyさん02/10/20 07:20ID:???
たとえば掲示板で、データをテキストファイルに1発言1行で格納してあるとします。

たとえばレスをはじめから10件読む場合には、
1行づつ読み込んで、10行目を読み込んだ時点でファイルを閉じればいいですね。

しかし、「最新のレス10件」を読み込む場合には、
レスの範囲を計算するためには、「全部で何行あるか」を調べなくてはいけませんね。

そうすると、feofまで読み込んで、fseek等をしつつ、行数を調べてから、
改めてファイルを読み込むと言うことになります。

それなら、fileで一気にファイルを配列に読み込んで、その後でarray_spliceなりを
施せばいいのですが、データファイルが200KB,300KBにもなるとそれは
さけたいですね。

アドバイスをお願いします。
045945802/10/20 07:25ID:???
すんません。下げちゃいました。
それにしても、この板、人口少ないですね。
0460nobodyさん02/10/20 08:06ID:???
>>458
> データファイルが200KB,300KBにもなるとそれは
> さけたいですね。

その程度なら全部を配列に読みこんでも良いのでは?
0461nobodyさん02/10/20 09:19ID:3NSvh+yz
>>458
書き込み時に、何行書き出すか取得して、それを別ファイルに落とす。
んで、その別ファイルには何行あるか、と言う数値が1行ずつしか書き込まれない。
で、その別ファイルを10行分読み込んで、10行分の数値を全て足した数値+タグ分の数値で、
何行まで読み込めばいいか、処理出来ると思うが。
これだと、メッセージ編集した場合の書き換え処理が大変だが、メッセージ編集しないのであれば
これでいいと思われ。
0462redeclareさん02/10/20 11:43ID:TH9l9BrQ
同じクラスを2回以上includeすると
Fatal error: Cannot redeclare class logger in
c:\apache\htdocs\php\logger.php on line 2
と言われてしまいます。
Javaでは同じクラスを何度もimportできるのに・・・。
この場合どのような構成にしたらよいのでしょうか?
コードを以下に示します。
0463redeclareさん02/10/20 11:49ID:TH9l9BrQ
includetest.php
<?php
  include "hello.php";  $hello = new hello;
  include "goodbye.php";  $goodbye = new goodbye;
?>
<html><head></head><body><?=($hello->msg().$goodbye->msg())?></body></html>
hello.php
<?php
  class hello{
    function msg(){
      $msg = "Hello,2chWorld.<br>\n";
      include "logger.php"; $logger = new logger; $logger->log();
      return $msg;
    }
  }
?>
goodbye.php
<?php
  class goodbye{
    function msg(){
      $msg = "Goodbye,2chWorld.<br>\n";
      include "logger.php"; $logger = new logger; $logger->log();
      return $msg;
    }
  }
?>
logger.php
<?php
  class logger{function log(){}}
?>
0464nobodyさん02/10/20 12:12ID:???
>>462
include_once
require_once
0465redeclareさん02/10/20 12:21ID:TH9l9BrQ
>>464
できました!
今までリクエストが送られるたびに
初期処理的にfactoryクラスを呼んで
$GLOBALSに共通利用されるクラスをいれて使用するという
なんともまどろっこしいことをしてましたが
これで解決です。感謝!
0466nobodyさん02/10/20 16:50ID:jWiCSXPt
<? include("$HTTP_SERVER_VARS[DOCUMENT_ROOT]/common/footer.inc");?>

って、もっとスマートな書き方
($HTTP_SERVER_VARS[DOCUMENT_ROOT] なんて使わずに)
あります?

SSI include みたいな。
0467nobodyさん02/10/20 17:06ID:???
php.iniでinclude_path=.:{ドキュメントルートのパス}
でいいんじゃないの?
046845802/10/20 19:58ID:???
>>466-7

php.iniもさわれないし、.htaccessにもかけない環境の方は、

define("INCDIR",$_SERVER['DOCUMENT_ROOT'] . "/hoge/hage/");
として、

include(INCDIR . "foobar.inc");

でいいんじゃ?
0469s02/10/20 20:06ID:7cHVMr6a
http://yahooo.s2.x-beat.com/
0470 02/10/20 23:31ID:???
extract($_SERVER);
$INCLUDE_PATH = ini_get('include_path');
$new_include_path = "{$INCLUDE_PATH}:{$DOCUMENT_ROOT}/hoge";
ini_set('include_path', $new_include_path);
0471nobodyさん02/10/21 00:42ID:???
今、実行しているfunctionの名前ってとれないですか?
0472nobodyさん02/10/21 01:33ID:az6boZmG
perlでいうところのjcode.plのような処理をするには
自分でコードを書くしかないのでしょうか?
0473nobodyさん02/10/21 01:50ID:???
>>472
jcode.phpsがあるよ。
ttp://www.spencernetwork.org/
0474nobodyさん02/10/21 01:54ID:???
mb_convert_encoding
0475nobodyさん02/10/21 02:56ID:???
gzipを標準出力に結び付けている良い例はありますか?
$|=1;
open(STDOUT,"| /bin/gzip -1 -c");
この二つはPHPではどう書けるのでしょう。
0476名無しさん02/10/21 02:57ID:???
>>471
何に使うの?
0477nobodyさん02/10/21 03:06ID:???
>>475

ログ嫁。
047847502/10/21 03:12ID:???
>>477
検索しても見つかりませんでした。
このスレか、何番の過去ログかヒントだけでも
0479nobodyさん02/10/21 03:34ID:???
>>478

1じゃネーノ?
0480nobodyさん02/10/21 06:56ID:???
PHP勉強しようと思ってるんですけど、
おすすめの書籍とかないでしょうか?
0481nobodyさん02/10/21 07:20ID:???
>>480

>>3
048247102/10/21 11:00ID:???
>>476
ログに$_SERVER[PHP_SELF]とfunction名と行を出そうと思ってるのですが
function名を文字列として渡すのは面倒&function名が変わったら修正増
ということでなんとかして関数その他で取れないかな、と。
0483nobodyさん02/10/21 14:26ID:???
>>480
そもそもプログラミング経験があるのとないのでは学習方法が違うから答えようがない。

経験あるならマニュアル読めば十分。
0484nobodyさん02/10/21 16:27ID:???
例えばaからzまでの配列を作る時に
・ひたすらがんばる
$array = array("a", "b", "c".......................................................);
・forでまわしてみる
for($i = ord("a").................................................)
というのが簡単に思いつくんですが、もう少し簡単で綺麗な
書き方はないでしょうか
0485nobodyさん02/10/21 16:59ID:RKsFdcBa
>>484
$alpha = 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z';
$a = explode(",", $a);
print_r($alpha);

こんなんで、どや
0486すいません02/10/21 17:00ID:???
ごめんなさい。最初に誤っておきます。
本当にくだらない質問なんですが
PHPで、ユーザーエージェントによって
携帯端末用とPC閲覧用で表示を変えたいのですが
どういう風にすればよいのでしょうか?
なんとなく形はわかるんですが、それを実際に
PHPで動作させるのがわかりません><
たぶん・・・
環境変数からユーザーエージェントを見て
i-mode/j-sky/ezwebならこっちを表示
それ以外ならアッチを表示・・・というプログラムになると思うのですが・・・。

どなたかお優しい方ご教授お願いいたします。
048748502/10/21 17:01ID:???
う、間違ってた
$alpha = 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z';
$a = explode(",", $alpha);
print_r($a);
0488nobodyさん02/10/21 17:01ID:???
>>483
そもそも配列にしない。

ord("a") + $iで使ってけば良いじゃん。
0489nobodyさん02/10/21 17:02ID:???
>>485
大正解。コーディングしなよ。

環境変数はマニュアルにもWebにも情報がある。
条件分岐なんて基礎の基礎だし。
049045802/10/21 20:12ID:Z25MjzcQ
>>486
UserAgentのデータベースを作りましょう。
http://www.hyuki.com/yukiwiki/wiki.cgi?UserAgent

サルにもわかる正規表現入門
http://www.mnet.ne.jp/~nakama/regexp1.html

制御構造について
http://homepage1.nifty.com/~takaot/prprpr/controlblock.html

PHPマニュアル
http://www.php.net/manual/ja/
0491hmk02/10/21 21:09ID:???
>>484,485
私は、$array = array("a", "b",...); にするべきだと思う。
他人がコードを読むときのことを考えると、意味がはっきりするほうが良いと思います。
049245802/10/21 21:14ID:Z25MjzcQ
>>491
同意。

たとえだと思うけど、a〜z間での配列を作る前に、それが本当に必要なのか、
検討すべきだと思う。
0493 ◆Kiss.FX29M 02/10/21 21:54ID:???
>>492
俺は、他人がコードを読むときなんてあんまりかんがえんが、
a-zと綺麗に並んだ配列を用意する時点で遠回りしている感じはするね。
で、1字づつの配列でいいのなら、
$array="abcdefg......";
でええのとちゃう。
0494nobodyさん02/10/22 00:47ID:n3viipFn
PHPを始めて2日目の者です。
簡易伝言板のようなものを作ってるんですが、ログファイルが変なことに。。。
---------
name<>mes<>date
name<>mes<>date

name<>mes<>date
--------
といった感じに、改行数がどんどん多くなってしまいます。。。
表示などには特に問題は起きないんですが、ログファイルが見づらくなるので。。。
よろしければ対策を教えて下さい。
049549402/10/22 00:48ID:n3viipFn
ソースコード貼り忘れました(鬱
if($_POST{'name'} && $_POST{'mes'}) {
$name = $_POST{'name'};
$mes = $_POST{'mes'};

// 現在日時取得
$date = gmdate("d(D) h:i a", time() + 60 * 60 * 9);

// フォーマット
$data = "$name<>$mes<>$date\n";

$logs = file($logfile);
$fp = fopen($logfile, "w");
fputs($fp, $data);
$log_max--;
for($i=0; $i<$log_max; $i++) {
fputs($fp, $logs[$i]);
}
fclose($fp);
}
http://php.s3.to/tt/tt5.php
ここにあるサンプルのゲスブも同じ事態になりました。。。
0496nobodyさん02/10/22 09:50ID:???
trim
0497nobodyさん02/10/22 10:08ID:TXJWZ2fS
セッション管理について教えてください。
1台のサーバでApacheのVirtualHost機能を使って
aaa.hogehoge.com
bbb.hogehoge.com
を作るとします(ドメインは同じ)
この場合、aaa.hogehoge.comで登録したセッション変数を
bbb.hogehoge.comで参照することはできるのでしょうか?
同一サーバなので/tmpが参照できるから問題ないのかなあとか
思うんですけど、環境が作れなくて実験できません。
やったことのある方、すみませんが教えてください。
0498 ◆Kiss.FX29M 02/10/22 13:13ID:???
>>497
基本的には可能。
但し、cookie経由でSessionIDを取得することは普通出来ない。
相対リンクでないので、URLに自動付加もしてくれない。
で、PHPSESSID=....を自力で出力する必要があると思う。
049949702/10/22 16:46ID:TXJWZ2fS
498さん、ありがとうございます。

PHPマニュアルに「session.cookie_domain」ってのがあったんですけど
これを指定すればcookie経由で使えないですかね?
教えてクンでごめんなさい。
0500 ◆Kiss.FX29M 02/10/22 18:19ID:???
>>499
なるほど、
session.cookie_domain=hogehoge.com
ってことだな。
運営上セキュリティに問題がない場合はそれでいいんじゃない。
0501nobodyさん02/10/22 18:25ID:AaVCn9+u
>>494
\rコードを削除すればいい。
050245802/10/22 19:13ID:TmLjz4JJ
>>494
デリミタをタブやカンマじゃなくて<>にするのは、
流行ってるの? 壺の影響か?
0503nobodyさん02/10/22 19:45ID:???
>>502
俺もやっているが、俺はKENT氏の真似。つか、ログ互換にしたかったので使った。
<>は、htmlでは <> に変換されるから、内部表現に使えて便利。
カンマにしてcsvにしても良いが、カンマを含む文字列を使う時は""でくくる必要が
あるけど、fgetcsvを使うほうが効率的かな?
050445802/10/22 19:48ID:X7v1eaNo
>>503
fwritecsv(int fp, array data, str delimiter)
というのがあれば便利なんだけどね。
0505nobodyさん02/10/22 20:43ID:???
>>502
流行ってるとかじゃなくて単に普通の文書中では
まず使われる事がなく、且つフィールドの境界が
目で見て分かりやすいからじゃないのかな。
0506 ◆Kiss.FX29M 02/10/22 21:03ID:???
>>503 >>505
あなた方の言っている事は正しいと思うけど、
教えて君に<>を見せ付けられると、Uzeeeeee!
と思うのは私だけ?
ま、慣れの問題だとは思うがの。
050750302/10/22 21:12ID:???
> <>は、htmlでは <> に変換されるから
ぉぃぉぃ、俺は &lt;&gt; って書いたはずだぞ。
2chは & を & に変換しないのか?
0508nobodyさん02/10/22 21:24ID:???
>>507
言いたい事はわかるが努力が足りないようだ。
0509努力が&rlo;いなり足02/10/22 21:38ID:???
ようだ。
051050302/10/22 21:50ID:???
書き直し。。これでいいかの? >>508
> <>は、htmlでは <> に変換されるから
ぉぃぉぃ、俺は &lt;&gt; って書いたはずだぞ。
2chは & を &amp; に変換しないのか?
0511nobodyさん02/10/22 21:55ID:???
>>509は努力しすぎ
051250802/10/22 22:16ID:???
>>510
合格。だけど何かが足りない、何かが・・・
0513nobodyさん02/10/23 00:49ID:y/QVQMdn
もれは大量の改行とか以外は、投稿内容を as is でログに保存する
ことにしている。

読み出すときに、<>&"'などを「&xx;」に変換して表示するようにしている。
のでデリミタを<>はしないです。
0514nobodyさん02/10/23 02:04ID:???
デリミタごときで2バイトも使うなと言う意見が…
0515nobodyさん02/10/23 03:03ID:???
>>514
漏れのデリミタ変遷

\t
0516nobodyさん02/10/23 03:06ID:???
漏れのデリミタ変遷

\t オーソドクスに
↓
,  CSV
↓
| psqlマンセー
↓
<> Kentさん好き!!
↓
Unicode NULLモジ
↓
\t に戻る。
0517nobodyさん02/10/23 07:08ID:???
\tだと、ファイル見た時に横に長くなって見づらくねぇ?

0518nobodyさん02/10/23 11:08ID:???
>>517
縦に見ると項目が揃ってて見やすい。
0519nobodyさん02/10/23 11:25ID:???
項目の長さが違ったらずれるじゃん
0520nobodyさん02/10/23 13:02ID:knm2mfqY
ある連想配列に対して、array_pushのように、
末尾に要素を追加するにはどうすればいいのでしょうか?
0521nobodyさん02/10/23 13:25ID:???
>>520
$hoge_array[newkey] = 'newvalue';
0522486すいません02/10/23 17:28ID:???
ありがとうございました。
一応参考程度に自分がやったソースを・・・。

<?php
$test = explode("/",$HTTP_USER_AGENT);

if ($test[0] == 'DoCoMo')//←i-mode閲覧
{
●●●
}
else//←PC閲覧
{
○○○
}
?>
汚してすいません。
0523nobodyさん02/10/23 18:43ID:???
WebARENA使ってるんですが、そこのPHPは普通と違ってCGIで動くので
ファイルの先頭に#!/usr/local/bin/php4が必要だったりして、
Apacheの一部として動作するPHPと違ってたりするので、
PHP関連の書籍とか見ても、それに触れてるものを見かけません。
CGIでPHPを使うことに関して詳しいHPとか書籍とかあったら教えてください。
052445802/10/23 21:10ID:???
$ua = array("DoCoMo", "PDXGW", "ASTEL", "J-PHONE", "UP.Browser", "Lynx");
foreach ($ua as $val) {
if (preg_match("/$". $val ."\//", $_ENV['HTTP_USER_AGENT'])) {
$pda = true;
break;
}
}
if ($pda === true) {
携帯端末用処理;
} else {
一般向け処理;
}

マニュアルにはPOSIX準拠のeregよりもpregの方が早いと書いてある。
0525nobodyさん02/10/24 05:31ID:5F/44dYx
>>523
0526nobodyさん02/10/24 06:13ID:kpV1tydg
FORMにこのようにcheckboxを書いてPOSTすると、
同じ名前の最後の項目しか表示されません。何が悪いのでしょうか?
<input type="checkbox" name="1" value="あ">
<input type="checkbox" name="1" value="い">
<input type="checkbox" name="1" value="う">
<input type="checkbox" name="1" value="え">

foreach($_REQUEST as $key => $value) {
if($key == "1") { print $value; } //項目1を表示
}
052752602/10/24 06:15ID:kpV1tydg
>>526
同じ名前の最後の項目しか表示されません
↓
同じ名前のチェックした最後の項目しか表示されません
の間違えです。

whileでループさせても同じ結果です。
0528nobodyさん02/10/24 07:54ID:uytwvD+v
ひとつ質問なんですが、
PHPのincludeを使ってXSLを呼び出すことはできますか?
0529nobodyさん02/10/24 08:18ID:???
>>526
<input type="checkbox" name="1[]" value="あ">
<input type="checkbox" name="1[]" value="い">
<input type="checkbox" name="1[]" value="う">
<input type="checkbox" name="1[]" value="え">

それと、nameに数字はよろしくなさげ
$1とすると別の解釈される場合もあったような・・・
0530 ◆Kiss.FX29M 02/10/24 08:18ID:???
>>526-527
その動作で正しい。
名前を変えるか、配列に汁。
0531nobodyさん02/10/24 08:21ID:???
>>526
name="name[]"
で配列にしろ
053253102/10/24 08:23ID:???
ここの板でかぶるなんて珍しい。
0533nobodyさん02/10/24 12:58ID:7cFeMhsm
JavaでStringを文字列連結していてパフォーマンスが落ちてしまい
StringBufferで解決したという経験がありました。
PHPでは . で連結するよりよい(軽い)方法は
用意されていないのでしょうか?
. 連結でもさすがにJavaほど重くならないようですが。
0534nobodyさん02/10/24 14:09ID:rG1bP6Cf
MAC OSXで
IEやNNの右上についているツールや履歴の表示非表示を切り替えるボタンって
無効化できますか?
javascript の Openwindow()でツールバーやURLの表示無しオプションで
コンテンツ表示しているのに、そのボタンでURLなどが表示されてしまいます。
FLASHのゲームコンテンツなど、このボタンのおかげで困るケースがあります。



0535nobodyさん02/10/24 14:14ID:???
>>534
PHPでは出来ないと思います。
0536nobodyさん02/10/24 15:35ID:F6+LZK6Z
http://www.rescue.ne.jp/
レスキューってどうなったんですか?
0537nobodyさん02/10/24 15:46ID:???
>>533
ソースを見たわけじゃないんだが、phpはデフォルトでStringBuffer相当の
動きをしているのではないかとおもふ。
0538nobodyさん02/10/24 16:16ID:IkTbxMct
PHPってファイル書き込みで配列を書き込むことってできないの?
見たらArrayって入れられてたんだけど(fputs(),fwrite())
0539nobodyさん02/10/24 16:27ID:???
>>538
serialize();
054052602/10/24 17:44ID:kpV1tydg
>>530
あーそうなんですか。なるほど。
perlのときはそれでいけたような気がするけど。うーん。
0541nobodyさん02/10/24 17:49ID:???
すいません、教えてください。
mb_send_mail で添付ファイルを送信するやり方がよくわかりません。
どのように指定すればよいのでしょうか?
0542nobodyさん02/10/24 17:59ID:???
マニュアル嫁。
0543nobodyさん02/10/24 20:52ID:Ya2zNF/W
unset()の使い道って何?
変数を破棄すると、どんな利点があるの?
例えば、メモリが解放されるとか? <- この考えであってる?
0544nobodyさん02/10/24 20:58ID:???
>>536
どうなったんだ?活動やめちゃったのか??
0545hmk02/10/24 23:00ID:???
>>543
たとえば、ループ毎に、一時的に使っている配列を初期化したい場合とか、かな?
0546 ◆Kiss.FX29M 02/10/24 23:25ID:???
>>543
普通の変数を破棄するときはあまりないけど、配列を弄っているとき
例えば不必要な要素を破棄して並べ替えみたいなときに、たまに使う。
0547nobodyさん02/10/25 00:23ID:???
モジュールで動かすときってCGIで動かすときと違って何か気をつけなければいけないことってあるんですか?
負荷軽減のスレでちょっと話題になりかけていたんですが。
054853802/10/25 00:46ID:AgSiPFdD
何度もスミマセン
>>539
ありがとうございます。
これで保存はちゃんと出きるようになりました。
けど読み込みが上手くできません。。。
色々実験してみたんですが、
$file = file($filepath);
というように読み込んだ場合、配列として代入されるため
$file = unserialize($file);
としてもうまく動かないようなのですが。。。
とりあえず配列$fileを更にシリアル化して変数に直し、
それをunserialize()で配列に戻して、更にその要素をunserialize()で戻して
ファイルの各要素を取り出すという効率無視の処理をしているんですが、
何かもっと効率のいい方法はないでしょうか。
$file = file("$filepath");
$file = serialize($file);
$file = unserialize($file);
$file = unserialize($file[0]);
■ このスレッドは過去ログ倉庫に格納されています