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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/08/06 15:44ID:paJ4kjjQ
・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


抜けているものがあったら補足願います
0342nobodyさん04/08/13 22:04ID:???
>>341
表示と同時にワンアクションで処理を実行したいなら無理じゃないかな?
0343nobodyさん04/08/13 22:18ID:???
ob_flash
0344nobodyさん04/08/13 22:27ID:???
>>343
やはりflashですか。
それが幾らマニュアル読んでもさっぱりなんです。
どの様に記述すればいいのでしょうか?
034534404/08/13 22:28ID:???
flush()ですたOTL
0346nobodyさん04/08/13 22:32ID:???
>>313
>変数名に全角使えるとか発想できるんだろう
逆に発想出来ないのは、頭が固い証拠では?

マニュアルの「変数」の章の「基本的な事」参照
ttp://www.php.net/manual/ja/language.variables.php#language.variables.basics

>>338
flush()
0347nobodyさん04/08/13 22:33ID:???
文頭に
ob_implicit_flush(1);
while (ob_get_level()) ob_end_flush();
書けば、逐次表示されます
でもこれ、
mb_http_output('SJIS');
ob_start('mb_output_handler');
と併用するとうまくいかないんだよなー
エロイ人教えて
034834404/08/13 22:37ID:???
>>347
たった2行でできますたOTL
ネ申でつ。
以後覚えておきます。
ありがとうでした。
034929404/08/13 23:48ID:???
>287
参照先まちがえてますた。正しくは、
ttp://www.pat.hi-ho.ne.jp/dimension/sample/sample_class_dp_singleton.shtml

PHP 4.3.x は $instance = new Class(); としたときにインスタンスの
コピーを返します。
シングルトンパターンなどで、毎度同じインスタンスを利用したい時は
リファレンスを使います。くわしくは参照先で。
0350nobodyさん04/08/14 01:34ID:???
<?php
<html><head></head><body>
$opendir = dir(".");
$i = 0;
while (($ent = $opendir->read()) != FALSE) {
if (is_dir($ent) != FALSE) {//ディレクトリのみ
$i++;
$dirname[$i] = $ent;
echo '<a href="aaa.php?page='.$ent.'">'.$ent."</a><br>\n";
}
}
if ($page == $dirname[1]) {
echo "ああああああ";
}
echo "</body></html>";
?>
こういう風にしているんですが、$dirname[1]に当たるリンクを押しても
ああああああの文字列が表示されないんですが、いったい
どこが間違ってるんでしょうか・・・
0351nobodyさん04/08/14 01:49ID:???
>>350
print "_GET['page'] : ".$_GET['page']."; page : ".$page; を仕込んで
表示されるかどうか試してみ
0352nobodyさん04/08/14 03:10ID:???
readdir() は読み込む順番がランダムなので、多分それが原因。
0353nobodyさん04/08/14 03:32ID:RcWJyX8g
えっと。
function abcd($1,$2,$3) {

などで、この例えば$2に値が入っていない(入れ忘れてしまった)
場合には、phpがエラーを出すのですが、
この$2に値が入っているか居ないかを調べるにはどの関数を使えばいいでしょうか?

defined かなと思ってやってみたのですが、うまくいかなくて。
よろしくお願いします。

(使い方は
$2に値が無い場合(空)に予め用意したデフォルト値を代入?したいのです。ifとかつかってですが。)
0354nobodyさん04/08/14 03:47ID:???
> $2に値が無い場合(空)に予め用意したデフォルト値を代入?したいのです

これさえ満足させればいいなら
function abcd($1,$2='でふぉると',$3)
でいいんじゃないかい?
0355nobodyさん04/08/14 03:57ID:???
関数のデフォ値設定は 右に詰めなきゃいけないんじゃなかったっけ?
その場しのぎでいいなら、全部にデフォ値設定かなぁ。
0356nobodyさん04/08/14 04:36ID:???
>>354さん >>355さん 早速ありがとー

今からやってみます!
結果をまた書き込みにきます。
どもでした。
035735304/08/14 05:13ID:???
できました!
function abcd($1,$2="hoge",$3="moge") {
です。
デフォルト値を入れるのなら右側にしないとだめでした。

>>354さん>>355さんありがとうさんでした〜

ifとか使ってごにょごにょしないとだめかなと思ってたので大喜びですw

0358nobodyさん04/08/14 10:11ID:???
>>353 の方と少しかぶります。
関数の引数の初期値にグローバル変数を定義することはできますか?
具体的には、次のようなことがしたいのです。

---------------------------------------
1 $variable = "global variable";
2
3 function test($var="$variable")
4 {
5 print $var;
6 }
7
8 test();
---------------------------------------

このようなスクリプトを書くと、以下のようなエラーになってしまいます。
Parse error: parse error, unexpected '\"' in index.php on line 3

対処法がありましたら、教えてください。
0359nobodyさん04/08/14 10:32ID:???
>>358
はぁ・・頼むからマニュアル嫁でくれよ…ばっちり書いてあるだろ

ttp://www.php.net/manual/ja/functions.arguments.php#functions.arguments.default
>デフォルト値は、定数式である必要があり、 (例えば、)変数やクラスのメンバーであってはなりません。
036035004/08/14 12:13ID:???
非常に助かりました。GETで無事取得できました。
4時間ぐらい悩んでいたのが嘘のようです。
本当にどうも有り難う御座いました。
0361nobodyさん04/08/14 13:08ID:go/x2Owu
>>358
頭から水をかぶって、頭を冷やせば見えてくるよ
036235804/08/14 13:35ID:???
>>359,361

どうもありがとう。関数の引数のデフォルト値は、変数ではだめなのですね。
違う方法でやってみようと思います。
0363nobodyさん04/08/14 13:44ID:???
>>362
違う方法も何も、引数のデフォルト値に変数を利用するという発想自体がそもそもおかしい。
0364nobodyさん04/08/14 15:25ID:???
PHPのバージョンは5.0.1です。

<son>
<taro></taro>
<jiro></jiro>
<sab></sab>
<white></white>
</son>

上のようなXML文書を、 simplexml_load_fileで読み込んで、下のような形式で子ノードの一覧を出力したい
と思っています。
 son
 jiro
 sab
 white
その場合、どうすればいいのでしょうか?
0365nobodyさん04/08/14 15:28ID:???
son
jiro
 :
ではなく、
taro
jiro
 :
でした、すいません。
0366nobodyさん04/08/14 15:36ID:???
せっかく PHP5 やってんなら SimpleXML 使ったら?
ドキュメントがまだ十分に無いから、使い方とかどこかに書き残すと重宝されるよ。
0367nobodyさん04/08/14 16:18ID:???
教えてください。
現ディレクトリ以下の下位ディレクトリのファイルの取得は
どうすればいいんでしょうか。
0368nobodyさん04/08/14 16:22ID:???
>>367
./現ディレクトリ/下位ディレクトリ/ファイル
または
下位ディレクトリ/ファイル
036936404/08/14 17:11ID:???
すいません、説明がいくらなんでも ひどすぎました。
要するに、要素名を得たかっただけなのですが……SimpleXMLには、そういった関数が用意
されていないみたいです。じゃあ、どうやって要素名を得ればいいのか――が、今回の質問で
あります。
0370nobodyさん04/08/14 18:38ID:???
>>364
XML分かんないんでやっつけだけど、これで一応子ノード一覧取れるよ

<?php

function child_list($xml, $nest=0) {
  foreach ($xml->children() as $key => $element) {
    echo str_repeat(" ", $nest) . "$key\n";
    child_list($element, $nest+1);
  }
}

$xml = simplexml_load_string(
'<son>
<taro></taro>
<jiro></jiro>
<sab></sab>
<white></white>
</son>');

child_list($xml);
?>
037136404/08/14 19:15ID:???
>>370
! なるほど、そうすれば良かったんですか。
どうもありがとうございました、これでガリガリ作業が進められます。
0372nobodyさん04/08/14 19:41ID:???
function test($array)
{
 array_push($array,"test");
}
$a = array();
test($a);
print count($a);

このようなスクリプトを書いたのですが、$aに値が代入されず、最後の行で0と出力されてしまいます。
どのようにすれば$aに値が代入されるようになりますか。
0373nobodyさん04/08/14 20:19ID:???
>>372
function test(&$array)
{
array_push($array,"test");
}

もしくは

function test(&$array)
{
return array_push($array,"test");
}
にして戻り値を使う
0374nobodyさん04/08/14 20:57ID:???
>>373
「リファレンス」なるものがあるとは・・・はじめて知りました。
どうもりあがとうございます。
0375nobodyさん04/08/14 21:21ID:???
phpとかperl初心者って値渡ししかしらねーんだよな
0376nobodyさん04/08/14 22:17ID:???
参照渡し・値渡しはどの言語であるか問わず基礎

値渡し意識してるなら、普通にreturnで返すだろうし、
参照渡しを意識してるなら&ぐらい気づくだろうと思うのだが、
なぜ、 >>372 は それで値の変更ができると思ったのかなぁ。
0377Imo ◆.jC7ANgFY. 04/08/14 22:23ID:???
元VisualBasicユーザーならば可能性はなきにしもあらず。
# VBは省略すると参照渡しになる
0378nobodyさん04/08/14 22:28ID:8vlh+W98
非常に初歩的な質問かもしれませんが、
$timestamp = 年/月/01 という時間を入れた変数を
$timestamp = 年/月-1/31 というようにしたいのですが、
(つまり1日前日にずらす)
どのようにすればいいのでしょうか?
ご教授おながいしますm(_ _)m
0379nobodyさん04/08/14 22:31ID:???
includeで呼び出したページからフォームを使ってデータを変数に格納するのができないのは既出?
0380nobodyさん04/08/14 22:32ID:???
>>378
エポック秒に直して60*60*24を引けばいい
0381nobodyさん04/08/14 22:36ID:8vlh+W98
>>379
レスありがとうございます。
つまり、エポック秒に直して、ひいてまた
もとの形に戻すってことですね。

ついでで恐縮ですが、エポック病になおしかた、
戻し方も教えてもらえないでしょうか?
調べたのですが、エポックってぐぐってもあんまりでてこないようなので・・・
0382nobodyさん04/08/14 22:39ID:???
>>381
全部マニュアルに書いてあったよ
http://www.php.net/manual/ja/ref.datetime.php
0383nobodyさん04/08/14 22:39ID:???
>>381
/でexprodeして年・月・日に分割して、それからmktimeすればいいんじゃないかな
0384nobodyさん04/08/14 22:56ID:8vlh+W98
ありがとうございます。参考にします。
にしてもあれですね、1日戻すだけでも結構だるいもんですね。
0385Imo ◆.jC7ANgFY. 04/08/14 23:01ID:???
>>384
strtotimeもいろいろ使えるよ。一度見ておくといいかもしれない。
04/08/14とあったら解釈が違ったりするけどね。
(外国は年月日の順番が違うから
2004/08/14ならちゃんと解釈してくれる。
0386nobodyさん04/08/14 23:03ID:???
UNIXタイムスタンプってエポック秒とも言うのか
勉強になった
0387nobodyさん04/08/14 23:06ID:???
>>384
てか、わざわざ文字列で保持しておく必要があるのか?
最初からエポック秒で持ってれば手間全然掛からんのだが
0388nobodyさん04/08/14 23:10ID:???
普通そうだよ
エポック秒で格納しておいて
date()で書式変えて表示すればいい
0389nobodyさん04/08/14 23:10ID:???
$timestamp = strtotime ("- 1 days", $timestamp)


これでOKじゃね??
0390nobodyさん04/08/14 23:20ID:???
$timestamp = mktime(0,0,0,08,01,2004);
echo date("Y/m/d H:i:s",$timestamp);

$timestamp = mktime(0,0,0,08,date("d",$timestamp)-1,2004);
echo date("Y/m/d H:i:s",$timestamp).;
0391nobodyさん04/08/15 00:02ID:???
鯖の影響で変数に格納できないってことある?
変数に何入れても空白なわけだが・・・
0392nobodyさん04/08/15 00:12ID:ThpZR4Ya
C-BOARDで、投稿画面に追加したセレクトボックスの
投稿データチェック(未選択不可)を行いたいのですが、
どうすればいいのですか?

下記のところに、新しく追加したら大丈夫だと思うのですが..
チェックの仕方がわかりません。

#── メールアドレスをチェック
length($::FORM{'email'})
&& ($::FORM{'email'} !~ /^[!-?A-~]+@[!-?A-~]+\.[!-?A-~]+$/)
&& push(@error, 'メールアドレスが不正です。');

#── パスワードをチェック
($::FORM{'key'} =~ /[<>&"]/)
&& &::error(\('パスワードに「<, >, &, "」は'
. '使えません。'));
0393nobodyさん04/08/15 00:16ID:???
>>391
釣れますか・・
039439204/08/15 00:16ID:ThpZR4Ya
すいません、間違ってPHPのところに質問してしまいました。
申し訳ないです....
0395nobodyさん04/08/15 00:37ID:nLnvBjde
PHPLIBダウンロードしたら本家が切れてるんやけど。誰かおいてること知らない?
本家    http://phplib.netuse.de/index.php3
ファイル名 phplib-7.2c.tar.gz
039639504/08/15 00:37ID:nLnvBjde
「したいと思ったら」の間違い。すぽ。
039739404/08/15 00:42ID:nLnvBjde
虚無で探してたらすぽんと見つかった。逝ってきます。
https://sourceforge.net/project/showfiles.php?group_id=31885&release_id=44737
039839104/08/15 00:52ID:???
スマンが真剣だ
0399nobodyさん04/08/15 01:02ID:???
>>398
ありえんと思うが、検証できる最低限のコードを晒して味噌。
モノ好きが吊れてくれるやもしれん。
0400nobodyさん04/08/15 01:07ID:???
http://〜/index.php?mode=site

上のURLの上体で

〜〜〜〜〜〜〜
</TBODY>
</TABLE>
</TD>
<TD bgcolor="#5788b5" valign="top">
<?php
if ($mode != ""){
include "./page/$mode.php";
}else{
include "./page/main.php";
}
?>
</TD>
</TR>
</TBODY>
</TABLE>
</TD>
〜〜〜〜〜〜

にしてあるんだが
表示されるのはhttp://〜/page/main.php デツ
0401400(391)04/08/15 01:08ID:???
ちなみにindex.phpでもhttp://〜/page/main.php デツ
誰か釣れてやってください;;
0402軟式PHP04/08/15 01:15ID:???
<?php
のあとに
$mode = $_REQUEST["mode"];
をいれてみ。
0403軟式PHP04/08/15 01:17ID:???
UNIXタイムスタンプで管理って2038?年だっけかその辺までしか対応出来ないべ。
しかしお盆どうすっかなぁ( ´-`)
0404カポコン04/08/15 01:30ID:???
墓参り行くべ〜〜(´_`)§ll
040539104/08/15 01:32ID:???
>>402
ありがと、早速やってみま〜!
(と思ったら鯖落ちてるよ〜;;)
0406nobodyさん04/08/15 01:50ID:???
あれで鯖のせいにするとは鯖がかわいそう・゚・(つД`)・゚・
0407nobodyさん04/08/15 01:50ID:???
>>403
2037年になったら考えたらいいべ
0408nobodyさん04/08/15 01:54ID:???
つか、共用鯖でテストしてる悪寒…
0409nobodyさん04/08/15 04:03ID:???
くだらない質問かもしれませんが…
BBSのログ等を表示する際の処理は
for foreach while
どれが効率良いでしょうか。
ご教授願います。
0410nobodyさん04/08/15 04:25ID:???
だいぶ前にここで速度比較してたよね
その時の結論は忘れたけど
俺はあんまり気にせず、状況に合わせてソースがきれいに書けるやつを選ぶ
0411nobodyさん04/08/15 04:38ID:???
>>410さん
そうなんですか。
速さよりもどれが負荷が少ないかなと思いまして。
でもそんなには変わらないのですかねー。
有難うです!
0412nobodyさん04/08/15 09:01ID:???
WindowsでPHP5.0.1をインストールし、コマンドラインから使ってます。
なんか、namespaceとかprivateとかの新機能が使えないんですけど、なぜですか?
心当たりがあれば教えてください。
0413nobodyさん04/08/15 09:41ID:???
>>409
1.while 2.for 3.foreach と予測してみる
0414nobodyさん04/08/15 09:51ID:???
設定ファイルで設定した内容をプログラムのほうで変更することはできますか。
具体的にはinclude_pathに追加したい。
0415nobodyさん04/08/15 10:02ID:???
ini_setかな?そのあたり
0416軟式PHP04/08/15 11:53ID:???
確かにforeachは一番遅そうだなw
俺も410のように保守性を重視するよ。
0417nobodyさん04/08/15 12:11ID:???
<FORM method="POST" action="other/anq/index.php">
<SELECT name="sex">
<OPTION value="女" selected>女</OPTION>
<OPTION value="男">男</OPTION>
</SELECT>
<INPUT type="submit" name="action" value="送信">
</FORM>
としてるんだが、変数が格納サレマセン。なぜでつか?
0418nobodyさん04/08/15 12:16ID:???
>>417
action="info.php"として info.phpの中身はphpinfo();のみ。
表示されたhtmlの中でセックルを探してみ
0419nobodyさん04/08/15 12:23ID:???
Warning: Cannot modify header information - headers already sent byって何ぽ?
042041704/08/15 12:23ID:???
>>418
Request使えば変数が入るんだが・・・なぜだ?
0421軟式PHP04/08/15 12:44ID:???
>>419
いやそのままと思うけど。既にヘッダーが出力されているから
header()は使えないってことだよ。header()周り見てみ。
何か出力してるところがあるはず。
0422nobodyさん04/08/15 12:53ID:???
>>415
さんくす。
042341904/08/15 12:55ID:???
ちなみにこれだけでつ;;
<?php
$action = $_REQUEST["action"];
$age1 = $_REQUEST["age1"];
$age2 = $_REQUEST["age2"];
$Region = $_REQUEST["Region"];
$sex = $_REQUEST["sex"];
$server = $_REQUEST["server"];
$cls = $_REQUEST["cls"];
$monster = $_REQUEST["monster"];
if ($action == "送信"){
$data = 'data.cgi';
$age = $age1.$age2;

$input = implode(",", array($age,$Region,$sex,$server,$cls,$monster));
$fp = fopen($data,"a");
flock($fp,LOCK_EX);
rewind($fp);
fputs($fp, "$input\n");
flock($fp,LOCK_UN);
fclose($fp);
$ok = 1;
}
header("Location:http://**********/index.php");
?>
0424nobodyさん04/08/15 12:59ID:???
>>423
ヘッダー出力できない警告の前にほかのエラーか警告が出てるんじゃないの?
042541204/08/15 13:18ID:???
privateがエラーになったのは、「private $x;」と書かなければならないところを
「private var $x;」と書いていたためでした。ばかです。

namespaceのほうはやっぱりエラーになります。
namespace Foo {
 class Bar {
 }
}
これだけなんだけどな。
0426nobodyさん04/08/15 13:44ID:???
てか、PHP5のRelease版ってnamespaceサポートしてんの?
RC2で消えたんじゃなかったん?
0427nobodyさん04/08/15 14:11ID:???
>>426
もれもそうおもう
0428Imo ◆.jC7ANgFY. 04/08/15 15:00ID:???
>>423
Unicodeで作っているとか?
0429Imo ◆.jC7ANgFY. 04/08/15 15:10ID:???
>>413
実際は「1.while 2.foreach 3.for」っぽい。
後半の二つはファイルを全部読み込むのはいいけど配列にするため
(explode&配列アクセス)の処理で時間を食っている様子。
forとforeachが違うのは、forが$i++や$i < count($data)とかを
毎回通しているためのロスみたい。
とはいってもテキトーにしか調べてない(というか差が誤差の範囲で
しかでない)から正確にはよくわからない。

whileはファイルを1回だけ読むのなら適当。
ただ、私は何度チェックしても無限ループが怖い。
forは添え字を自分で管理でき、
前とか後とかをすぐに参照できるという点で良い。
foreachは添え字が数値でなくても、
ちゃんとすべて処理できるという点で良い。

こんなところ。ただし、これは私の考えなだけ。
0430nobodyさん04/08/15 15:43ID:???
>>336の続き
>>337のやり方で拡張子無しのファイルをPHPとして認識させるにはどうしたらいいですか?
または、別のやり方でできるのでしょうか?
0431nobodyさん04/08/15 16:17ID:???
<?php
$mode = $_REQUEST["mode"];
if ($mode != ""){
include "./page/$mode.php";
}else{
include "./page/main.php";
}
?>

もし、modeに「aiueo」が格納されているとして
「./page/aiueo.php」がない場合に他の処理を行いたいんだが・・・
どうすればよい?
0432nobodyさん04/08/15 17:09ID:???
>>431
あきらめることをお勧めします。
0433nobodyさん04/08/15 17:20ID:???
>>431
file_existsじゃ不満なのか
0434nobodyさん04/08/15 17:43ID:???
>430
<Files ~ "^[^\.]+$">
ForceType application/x-httpd-php
</Files>
0435nobodyさん04/08/15 17:45ID:???
<?php
$mode = $_REQUEST["mode"];
if ($mode != ""){
if (! file_exists(./page/$mode.php){
include "./page/$mode.php";
}else{
include "./page/404.php";
}

}else{
include "./page/main.php";
}
?>

これでいいのかな・・・・
0436nobodyさん04/08/15 17:58ID:???
>435
よく見直した方がいい
0437nobodyさん04/08/15 19:04ID:???
is_fileよりfile_existsを使った方が良いのですか?
is_fileの「filenameが存在して、かつそれが 通常ファイルであればTRUEを返します。」と
ありますが、この通常ファイルとはCGI以外という意味なのでしょうか?。
043843504/08/15 19:31ID:???
全然ワカンネ
0439nobodyさん04/08/15 19:42ID:???
>>438
エラーはログになって画面表示にしてないのかなぁ
どちらにしろ1からマニュアルを読むなり、ぐぐるなりした方が良いよ^^;
0440Imo ◆.jC7ANgFY. 04/08/15 20:29ID:???
>>437
ファイルを読めるかを調べるのにはis_readableを使うことをすすめます。
0441nobodyさん04/08/15 20:58ID:???
>>440
userIDの事まで考えるとis_readableが良さそうですね^^
これからはこちらを使う事にします。
■ このスレッドは過去ログ倉庫に格納されています