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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/10/25(火) 06:50:06ID:Q4oGlTH3
PHP全般の質問スレです。
【基本ルール】
・新規質問の方は上げてください。age進行でお願いします。
・質問者は2回目以降、最初のレス番号を名前欄に入れてください。
・回答者は質問者に対して>>(アンカー)をつけてください。
・煽り・荒らしは放置。荒らしに反応した香具師も荒(ry
・解決しなくてもこたえてもらったら礼を。
【質問テンプレ】
・マニュアルを調べたか、google検索したか(調べたキーワード)
・タイトル(禁:教えてください!etc) 例:requireとinclude
・内容 例:requireとincludeはどう違うのですか?
・質問する際には環境も明記。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークはそれぞれの該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
・オブジェクト指向については良スレがないから本を買え
・速さについては自分でベンチをとってここに書け(違う環境の人も調べてくれるかも)
【PHP マニュアル】
http://www.php.net/manual/ja/
※マニュアル上部の「search for」から検索を活用すべし(便利)。

過去スレ、関連リンク、FAQ等>>2-10辺り
0052初心2005/10/28(金) 12:02:45ID:???
早々のお返事ありがとうございます。
nobodyさん
先ほど>>49の例で試したところ期待した値が帰ってきました。
内容理解にがんばってみます。
0053初心2005/10/28(金) 12:03:30ID:???
>>52のアンカーミスです><;
0054nobodyさん2005/10/28(金) 13:04:04ID:???
>>53
意味わかんね
0055nobodyさん2005/10/28(金) 14:36:12ID:???
>>54
初心に変わってエスパーの俺が解説しよう
>>52の(レスに書いた>>49の)アンカー(は>>51の)ミスです><;
0056nobodyさん2005/10/28(金) 14:37:50ID:???
エスパーカコイイ
0057nobodyさん2005/10/28(金) 20:06:41ID:???
>>55
いや、エスパーパワーの使いどころ、そこじゃないし…
0058nobodyさん2005/10/31(月) 21:52:19ID:IQWjtyLi
環境PHP4 Apach1.3 MYSQL4 WINXP

質問:セッションIDが引き継げていない?

ttp://www.stackasterisk.jp/tech/php/php03_06.jsp
上記サイトを参考にしてローカルで試しています。

<<<<ここから>>>>
<?
session_start();
if (!isset($count)) $count=0;
session_register("count");
$count++;
?>

<html>
<body>
あなたは <?= $count ?> 回目の訪問です。
<a href="<?echo $PHP_SELF ."?PHPSESSID=". $PHPSESSID?>">カウントを増やす</a>
</body>
</html>
<<<<ここまで>>>>

試したソースは上記です。何回更新しても1回目のままです。

不審に思いifをちゃんと括弧でくくったりif内でechoさせたり色々試すと、
どうも!isset($count)が毎回trueを返して$count=0;を実行している模様。
elseをつけたり{}でくくりしっかりした書式にしても変らず。
windows\tempの中を覗いてみたらちゃんと変数はありました。

ご教授お願いします。
0059nobodyさん2005/10/31(月) 22:00:44ID:???
マニュアル嫁と言うべきだろうか?
0060nobodyさん2005/10/31(月) 22:08:21ID:???
>>58
そのサイトは
>この章で扱う PHP のバージョンは、PHP 4.0.3pl1 とします。 
なのに,
>>58 はPHP4.2以上を使ってるから.
0061582005/10/31(月) 22:31:17ID:IQWjtyLi
うー。ざっとしか目を通してないのでよく分からないんですが、
>PHP 4.2.3とそれ以前のバージョンのみに関係する問題があります。
> session_register()により新しいセッショ ン変数を登録する場合、
>グローバルスコープのエントリと $_SESSIONのエントリは、
>次の session_start()まで同じ値へのリファレンスとは なりません。
> すなわち、グローバル変数への修正は、$_SESSION のエントリには反映されません。
>PHP 4.3では修正されています。
ここいら辺の話でしょうか?
違うんであれば大体どの辺見ろとか言ってもらえると嬉しいです。
0062582005/10/31(月) 22:32:00ID:???
あ、あげちゃってごめんなさい。
0063nobodyさん2005/10/31(月) 22:46:11ID:???
・register_globals でググる
・新しいサンプル(PHP4.3.x,PHP4.4.x)を探す
0064nobodyさん2005/10/31(月) 22:48:27ID:???
session_register()なぞ使っているサンプルなんか捨てちまえ
0065nobodyさん2005/11/01(火) 00:48:13ID:cLPN4r6c
配列のチェックボックスで質問があります。

<input type="checkbox" name="test[]" value="1">
<input type="checkbox" name="test[]" value="2">
echo $_POST['test'][0];
echo $_POST['test'][1];

で期待通りに動作します。
しかし、[] がないサンプルを見かけました。

<input type="checkbox" name="test" value="1">
<input type="checkbox" name="test" value="2">
echo $_POST['test'][0];
echo $_POST['test'][1];

私の PHP4.4.0 の環境だと最後にオンになっている value しか表示されません。
PHP5 の環境だと OK ということなのでしょうか?
0066nobodyさん2005/11/01(火) 03:36:49ID:???
>>65
5でも同じ
[]が無い時は$_POST['test']だけ返って来る
0067nobodyさん2005/11/01(火) 05:52:12ID:XOKgx8G4
マルチバイト関数について質問です。

HPを移転させたら
Fatal error: Call to undefined function: mb_convert_encoding() in /home/hideaki/hideaki/mail.php on line 103
というエラーが出るようになってしまいました。
サーバによって違うものなのでしょうか?

phpinfo();
の結果をはっておきます。
http://www.1st-web.org/info.php

対処法など教えてください!お願いします。
0068152005/11/01(火) 07:24:14ID:???
>>67
読んで字のごとく
0069nobodyさん2005/11/01(火) 07:29:02ID:???
>>67
mbstring=sharedになっているのでスクリプトの先頭で
dl("mbstring.so");
とやってみる。
0070nobodyさん2005/11/01(火) 08:46:02ID:???
>>65
どこに載っていたサンプルか、言ってみ
0071nobodyさん2005/11/01(火) 08:48:29ID:???
array_pop(explode(':',$conf)); ってするとエラーになるんだね
Fatal error: Only variables can be passed by reference

はじめて気づいた・・・
0072652005/11/01(火) 09:13:05ID:???
>66
レスありがとうございます。
PHP5でも一緒ですか。

>70
ttp://www.lastcraft.com/form_testing_documentation.php
ここの下の方です。
0073nobodyさん2005/11/01(火) 09:37:51ID:???
>>72
そのページのサンプルに
 <input type="checkbox" name="test" value="1">
 <input type="checkbox" name="test" value="2">
で送られたデータを
 echo $_POST['test'][0];
 echo $_POST['test'][1];
という形式で受け取っている、とはどこにも書いてないだろ。
勝手に脳内補完するなよ。
0074nobodyさん2005/11/01(火) 09:48:05ID:???
>73
レスどうもです。
こちらのページ以外にもあったのですが、そちらは個人のサイトなので書いてないです。

配列のチェックボックスは、何通りの受け取り方があるのでしょうか?
0075732005/11/01(火) 10:07:33ID:???
>>74
鬱陶しい奴だな。自分で調べる気がないのなら素直に [] を付けりゃいいだろ。
配列もクソもPOSTデータを受け取る「方法」は一つ。
受け取ったデータをPHPが自動的に$_POSTに格納してくれているだけ。以下で確認しろや。

-- test.html --
<FORM action="test.php" method="post">
<input type="checkbox" name="test" value="1">
<input type="checkbox" name="test" value="2">
<input type="submit" value="send">

-- test.php --
readfile('php://input');
0076nobodyさん2005/11/01(火) 10:19:40ID:???
なんだかんだ言いつつ,丁寧にコード用意してくれる73萌え
0077nobodyさん2005/11/01(火) 10:25:22ID:???
>76
でも、質問の答えになってなく空回りしてるのがワロス
0078652005/11/01(火) 10:34:07ID:???
>75
どうもありがとう。
方法はひとつなのですね。

ttp://www.lastcraft.com/form_testing_documentation.php
自前でパースするのが前提のサンプルのようですね。
すっきりしました。
0079nobodyさん2005/11/01(火) 11:52:29ID:???
ちょっと質問です。
ftpでファイルを持ってくるのに
-----
for($i=0;$i<$max;$i++)
 file_get_contents("ftp://user:[email protected]/foo".$i.".txt")
-----
って感じで複数のファイルを取得してるんですが、10%弱の確率で
 331 password required for user
のエラーが返ってきます。
毎回起きてるならまだ分かるんですが、起きたり起きなかったりと
結果が不安定なので、何が悪いのかさっぱりな状態です…。

何か解決策はないものでしょうか?
(環境:php-4.3.11/Linux)
0080nobodyさん2005/11/01(火) 12:22:52ID:???
>79
$max がデカイとか?
ログファイルは?
0081nobodyさん2005/11/01(火) 12:43:24ID:7nOS7Rx3
htaccessを利用して、あるファイルを必ず読み込む方法が
あると聞いたのですが、実際の方法を教えてください。
0082nobodyさん2005/11/01(火) 12:49:18ID:???
つ [ auto_prepend_file ]
0083nobodyさん2005/11/01(火) 12:55:51ID:???
>>81
auto_append_file
これ以上のクレクレならくだ質逝け。
0084nobodyさん2005/11/01(火) 12:57:05ID:???
>>81
悪い、後から足してどうすると。
auto_prepend_file
が正解。
0085nobodyさん2005/11/01(火) 12:57:33ID:???
>>79
FTPサーバ側の設定かなんかじゃない?
再接続を繰り返しまくったらそういうエラーを返すように設定されてるとか。
fsockopenでつなげて、接続を保ったままgetで取得してみたら?
0086nobodyさん2005/11/01(火) 13:37:29ID:???
すみません。以下のperlをPHPでかいたらどうなりますか?

my $argv = shift @ARGV;
my $browser = LWP::UserAgent->new;
my $url = 'http://www.hogehoge.jp/cgi-bin/hogehoge.cgi';
my $response = $browser->post($url ,
[
foo => '2ch' ,
bar => 'orz',
file => [
undef, 'test.txt',
Content_Type => 'text/plain',
Content => $argv]
] ,
Content_Type => 'form-data'
);

die " Error!", $response->status_line unless $response->is_success;
print $response->content;
0087nobodyさん2005/11/01(火) 13:41:15ID:???
>>86
HTTP_Request を使う.

Perl→PHPの専用のスレがあったと思うけど?
0088792005/11/01(火) 14:22:49ID:???
レスありがとうございます。

>>80
$maxは今の所、最大6
該当エラーログの全文は
-----
Warning: file_get_contents(ftp://[email protected]/foo.txt): failed to open stream: FTP server reports 331 Password required for user.
in script.php on line 53
-----
と、こんな感じです。ホスト名あたりは実際のから置き換えてますが、その前後に
他のエラーは無いです。

>>85
fsockopenってことは、自前でFTPのコマンド出さないといけないんですよね?
出来ればその方法は避けたかったんですが、他に方法がなさそうだったら、
それで試してみます。
サーバー側の設定に関しては、これから調べてみます。
ちなみに、サーバーはProFTPD使ってます。
0089nobodyさん2005/11/01(火) 17:03:45ID:???
前スレが埋まったので再度質問させていただきます

foreach ($arr as $val) {
 …
}

で $arr が空の時 warning が出てしまうんですが
みなさんどう対処していますか?
empty()とかで最初に調べるのはあまりしたくないんですが。
0090nobodyさん2005/11/01(火) 17:06:20ID:???
「下らねぇ」スレが埋まってしまったので

995 名前:nobodyさん[sage] 投稿日:2005/11/01(火) 16:39:53 ID:???
セッションをURLに埋め込みたいんだが

<a href="./ahya.php?<?= SID ?>">リンク</a>

なぜかahya.phpへのURLにセッションIDが付与されない。
何か書きミスでもある?

だが

998 名前:nobodyさん[sage] 投稿日:2005/11/01(火) 16:52:25 ID:???
>>995
SIDが未定義とかエラーはでてないのけ
session_start()してる?

うん、ちゃんと冒頭でやってるよ

999 名前:nobodyさん[sage] 投稿日:2005/11/01(火) 16:59:51 ID:???
待て待て、セッションの渡し方がおかしい。

え、どこが?
0091nobodyさん2005/11/01(火) 17:19:39ID:???
えちょ?
0092902005/11/01(火) 17:22:45ID:???
きになったから

<?php echo SID; ?>

してみたんだが見事に何も表示されなかった。
session_start()すれば勝手に挿入されるんじゃなかったっけ?>>SID
0093nobodyさん2005/11/01(火) 17:36:11ID:???
>セッションIDがセッションクッキーに適切にセットされている場合には空文字列が入る。
なんて記述がマニュアルにあるが、これに該当してない?
0094nobodyさん2005/11/01(火) 17:38:45ID:???
session_id();ではあかんのか?
0095nobodyさん2005/11/01(火) 17:40:18ID:???
>>92
SIDが定義されるのは、
・cookie未使用
・cookie使用時は、一番最初の1回のみ
だと思うけど?

常に取得したければ、session_id()を使う


0096902005/11/01(火) 17:49:39ID:???
>>93-95
ウホッ(;´Д`)!
IEのクッキーをONにしているとSIDには変数が設定されないのか!

となると

<a href="./ahya.php?<?= SID ?>">リンク</a>

は、

<a href="./ahya.php?<?= session_id(); ?>">リンク</a>

に変えればいいのかな?
0097952005/11/01(火) 17:59:57ID:???
>>96
<a href="./ahya.php?<?= session_name()."=".session_id(); ?>">リンク</a>
だと思う。


0098902005/11/01(火) 18:50:54ID:???
>>97
お、ちゃんとURLに反映されたよ、ありがとう( ´∀`)ノ

ところでahya.php側でセッションを受け取るわけだけど、こちらで再度session_start()って宣言する必要
あるの?それとも$_GET['PHPSESSID']で直接session_id受け取って代入しちゃって良いのかな?
0099nobodyさん2005/11/01(火) 18:54:10ID:???
>>96 >>98
お前さぁ、少しは自分でやってみるって発想はないのか?
0100nobodyさん2005/11/01(火) 18:59:46ID:???
(´・ω・`)ショボーン
0101792005/11/01(火) 19:13:47ID:???
>>85
サーバー側にそれらしき設定は無かったです。
あと、クライアント側を改造してリクエストの間隔を10秒
あけてみても結果は変わらず。

ソースのftp_fopen_wrapper.cまで見てみたんだけど、なんで
この状態になるのかがさっぱり。
telnet使って再現実験やってみても、再現しなかったし…

引き続きどなたか思い当たる事があれば、情報をください(´・ω・`)
0102902005/11/01(火) 20:33:52ID:???
>>98
> ところでahya.php側でセッションを受け取るわけだけど、こちらで再度session_start()って宣言する必要
> あるの?それとも$_GET['PHPSESSID']で直接session_id受け取って代入しちゃって良いのかな?

自己レス。
さっきクッキーオフにして試してみたら、URLにsession_idをPHPSESIDに渡すだけで正しく
セッションが引き渡されていたよ、受け取り側ではGETとか使って細工したわけではないのに。
なんか不思議ぃ〜ヽ(´ー`)ノ
0103nobodyさん2005/11/01(火) 21:40:54ID:???
>>102 ワザとらしい例だが以下の実験で理解されたし。

--- 1.php ---
<?php
session_name('mysessionid');
session_start();
$_SESSION['test'] = 123;

$name = session_name();
$id = session_id();
echo "<a href=\"2.php?{$name}={$id}\">next</a>"
?>

--- 2.php ---
<?php
//session_name('mysessionid');  ワザとコメント
session_start();
echo $_SESSION['test'];
?>
0104902005/11/01(火) 23:23:04ID:???
>>103
2.phpで session_start(); するとき、

a) session_name('ほげほげ');
b) クッキー
c) URL

の優先順位でセッションを見つけていくというわけね。

で、今2.phpではa)がコメントアウトされていて、クッキーもオフにしているから
URLを参照しに行ったと。URLの引数の中でとある変数名ととある値の
組み合わせが、あらかじめストアされていたセッション名とセッションIDに
合致していたらセッションを引き渡すというのかな?

逆に言うと悪い奴があてずっぽでセッション名とセッションIDを当ててしまったら、
URLにその値をぶち込むことで他人のIDになりすましたりすることもできると・・・
0105nobodyさん2005/11/01(火) 23:48:55ID:2mWy/qga
ImageMagickでの文字の描画について

(【PHP】下らねぇ質問はここに書き込みやがれpart12 からきました)

ImageMagickをPHPから使用しています。(さくら:Apache.1.3 FreeBSD)

フォントはインストールされているものではなく、
/home/hoge/fonts/
というフォルダを作りttfファイルを入れているだけです。

<?php
$convert = "/usr/local/bin/convert";
$text = "Japan日本語";
$text = mb_convert_encoding($text, "UTF-8", "SJIS");
$font = "/home/hoge/fonts/ipam.ttf";
passthru("convert -encoding UTF-8 -size 620x100 xc:transparent -font $font -pointsize 72 -draw \"text 20,65 $text\" test.png");
?>

のように$tectの部分が「英語+日本語」なら表示されるのですが、
$text = "日本語";
のように「日本語のみ」の場合文字を描画することができません。

どこが悪いのでしょうか?
0106nobodyさん2005/11/02(水) 00:10:22ID:???
>>105
ImageMagickで日本語は無理じゃない?
GDで元になる画像作って、必要ならImageMagickで加工するってのがいいのでは?
0107前スレ9992005/11/02(水) 01:00:17ID:???
勘違いしてたら悪いけど

ナンチャラをonにすると勝手にリンクにPHPSESSIDを入れてくれる機能があるから、それを使ったらどうかといいたかった。
たしかsession.use_trans_sid。
0108902005/11/02(水) 01:05:29ID:???
>>107
自鯖では設定は変えられるんだけど今同時に使ってるレン鯖ではoffに設定されているみたい。
というわけでリンクに入れる方法で試してみるよ。
0109902005/11/02(水) 01:14:17ID:???
>>103
ん、実際にテストしたら予想と違った( ゚Д゚)
2.phpを次のように書き換えたんだが

--- 2.php ---
<?php
//session_name('mysessionid');  ワザとコメント
session_start();
echo $_SESSION['test'];
print "session_name = " . session_name() . "<br>";
?>

表示されるsession_nameはPHPSESSIDのままだった。
ちなみに「わざとコメント」の行のコメントを外すと'mysessionid'という
文字が表示された。

URLで渡したとき
echo "<a href=\"2.php?{$name}={$id}\">next</a>"
じつは2.phpでは$nameの部分は全く無視している(見ていない)?
0110nobodyさん2005/11/02(水) 01:23:23ID:???
すいません。ちょっと教えてください。
現在さくら専用鯖RH9 apache2.0.40 PHP4.2.2です

前任者が作ったサイトがあるんですが
HTMLスキンファイルをPHPで読み込ませ、index.phpに表示させるように
なってるんですが、何も表示されない(白紙=読み込まない)ので
困っています。
従来はちゃんと動いていたのですがphp.iniの設定(memory_limit=32M)
とpostgres.confを変更しpostgresとapacheを再起動したところ
上記症状になってしまいました。
該当のPHPエラーログは Allowed memory size of 16 bytes exhausted (tried to allocate 84 bytes) in Unknown on line 0
となっており、該当ホームディレクトリには.htaccessで
DirectoryIndex index.html index.php
php_flag log_errors On
#php_flag display_errors Off
php_value error_log "/home/sites/site1/web/php_logs/error_log.txt"
#php_value memory_limit "16M"
AddDefaultCharset EUC-JP
#AddType application/x-httpd-php .htm
memory_value)
と記述してあります。どなたか解決の糸口をご教示くださいませんでしょうか。何卒よろしくお願いします。
0111902005/11/02(水) 01:24:27ID:???
>>103
たびたびスマソ
「ワザとコメント」のままだとsession_id自体が引き渡されないね。

つまり受け取る側はsession_nameとURLの$nameが一致してないと
セッションの引き継ぎは行われないってことなんだね。
0112nobodyさん2005/11/02(水) 01:29:04ID:???
>>109
いい加減ウザいんだけど・・・。
てか、ちょっと考えればわかるだろ。

1.phpにてsession_name()でセッション名を定義しても、それが有効なのはスクリプト内、
つまり 1.php 実行中のみ。

2.phpにとってみれば、いきなり mysessionid = hogehoge とか渡されても、
これが「セッションIDを引き渡している」と分かるわけがない。
2.php でセッション名を定義していなければ、セッション名はデフォルトの"PHPSESSID"になる。
(※php.ini や .htaccess で定義していない場合)

> echo "<a href=\"2.php?{$name}={$id}\">next</a>"
> じつは2.phpでは$nameの部分は全く無視している(見ていない)?

ヒント: echo $_GET['mysessionid'];


0113nobodyさん2005/11/02(水) 01:35:17ID:???
> いい加減ウザいんだけど・・・。

くだらんスレもフカーツしたしそちらに帰りまつ
。・゚・(ノД`)・゚・。
0114nobodyさん2005/11/02(水) 01:40:13ID:???
>>110
くだらねぇ。
memory_limitの設定間違えて16byteに設定してしまって、メモリが足りないって怒られてるだけだろ。
英語がわからないなら辞書引けボケ
次からはくだしつで質問しろ。
0115nobodyさん2005/11/02(水) 01:45:56ID:???
(´-`).。oO(今度はこっちがくだしつみたいに・・)
0116nobodyさん2005/11/02(水) 03:14:55ID:???
>>115
大丈夫だ。前スレよりはくだらなくない。
0117nobodyさん2005/11/02(水) 07:40:57ID:???
>>110
せっかくエラーをログしても読まないんじゃ意味ない
01181052005/11/02(水) 08:37:47ID:k7ixpa6e
>>106
ありがとうございます。
> ImageMagickで日本語は無理じゃない?
日本語が含まれている文字が、表示されるのに日本語のみが表示できないのが不思議で…
やっぱり無理なんでしょうか?

> GDで元になる画像作って、必要ならImageMagickで加工するってのがいいのでは?
一応こちらの方向でも進行しています。
0119nobodyさん2005/11/02(水) 10:03:45ID:???
あれ?php5になってからmbstringあたりの設定変わった?
0120nobodyさん2005/11/02(水) 10:07:49ID:???
>>119
PHP-users ML の 27259 辺りに関係のあることが書いてあるかもしれない
0121nobodyさん2005/11/02(水) 13:59:03ID:???
とあるページのカウンタを回さないように読み込むことは出来ますか?
カウンタは上の方にあるので、カウンタを超えた行から読み込みたいのです。
0122nobodyさん2005/11/02(水) 14:12:51ID:VM69hIe2
PHPに重大な脆弱性が見つかったみたいだけど、
具体的に言うと、どんな不具合?
$_GLOBALSが上書きされる??

http://www.hardened-php.net/index.76.html
0123nobodyさん2005/11/02(水) 14:51:14ID:???
>>121
何で読むの?
0124nobodyさん2005/11/02(水) 15:33:17ID:???
>>121
とあるページのカウンタの仕様による。
ちなみにPHPでかかれているページについては、PHPで特別な処理をしていない限り、
HTTPでrange指定しても最初から全部処理して全部かえすぞ。
0125nobodyさん2005/11/02(水) 15:52:15ID:???
>>122
ファイルアップロードフォームの名前をGLOBALにするとやばいらしい
0126nobodyさん2005/11/02(水) 15:55:28ID:???
>>123
理由かな。どうやらカウンタの回り具合で訪問者をチェックしてるみたいなので、
回さずに見れる方法はないかなーと思いまして。

>>124
ソースを見たら<img src="counter?fafafa:ffc34c">とありました。
cgiに渡すもんじゃないのか・・・
0127nobodyさん2005/11/02(水) 15:56:14ID:???
>>122
これの本質は
 GLOBALSを使ってる時は、どこで上書きされるか分からんから気をつけろ!
って所じゃないの?
以前のバージョンでは外からGLOBALSを上書きする方法もあるから、
ここで示されてるPEARの仕組みと組み合わせると、任意の関数を呼ばれる事になる。

ちなみに、外からGLOBALSを上書きできるのは、4.3.10より前か
4.4.1より前、それ以降は既に修正済みのようです。
0128nobodyさん2005/11/02(水) 16:08:37ID:???
>>122
とりあえずPHP5.0.4での簡単な例。php.iniでregister_globals = Onにしないと発生しない。
今時、register_globals = Onにしているのもどうかと思うが、レンサバなんかだと気軽にOffにはできないのかな。

[test.html]
<form action="test.php" method="post" enctype="multipart/form-data">
<input type="file" name="GLOBALS">
<input type="submit" value="submit">
</form>

[test.php]
<?php
print_r($GLOBALS);
?>
0129nobodyさん2005/11/02(水) 16:28:35ID:???
シンボルテーブルへのリンクが失敗するのは分かったが
インジェクションの仕方が分からん。上書きはできないんじゃないの
0130nobodyさん2005/11/02(水) 16:38:58ID:???
すまん分かった。
0131nobodyさん2005/11/02(水) 16:50:53ID:???
>>126
それならブラウザを画像を表示しないように設定にすればいいよ
0132nobodyさん2005/11/02(水) 17:12:31ID:???
>>126
理由じゃないよ。
なにで読み込むのかな?
0133nobodyさん2005/11/02(水) 18:45:29ID:???
質問です。

配列の要素にヒアドキュメントを使うことはできますでしょうか?

$array = array(
'key1' => 'value1',
'key2' => <<<EOV
value2
EOV;
);

としたところ、

PHP Parse error: parse error, unexpected ';', expecting ')'

と怒られてしまいました。
文法的にNGなんすかね…

宜しくお願いします。
0134nobodyさん2005/11/02(水) 18:59:14ID:???
>>133
EOV;のセミコロンをはずそう
01351332005/11/02(水) 19:02:32ID:???
>>134

レス有難うございました。
問題なくいけました。

お恥ずかしい。。。
0136nobodyさん2005/11/02(水) 19:44:21ID:???
preg_match で正規表現に変数を使いたいんですが
$regex = '[0-9]';
preg_match( '/^($regex)+$/o', $str );
がうまく動いてくれません。

みなさんは正規表現に複数の変数を含めるときどうしてますか?
0137nobodyさん2005/11/02(水) 19:54:36ID:S6YoA3Rv
>>136
正規表現に変数なんてつかったことないけど、
「.」で連結してみてもダメ?

preg_match( "/^(".$regex.")+$/o", $str );
0138nobodyさん2005/11/02(水) 19:58:33ID:???
>>136
正規表現がどうこうではなくて、PHPでの文字列の扱い(' と " の違い)を
勉強しなおした方がいいのでは?
0139nobodyさん2005/11/02(水) 20:36:08ID:???
ダブルクォートで囲むと変数の内容に置き換わる。
シングルクォートで囲むと変数の内容に置き換わらない。
って、なんでいえないのかなあ。
呆れるわ
0140nobodyさん2005/11/02(水) 20:46:08ID:???
※PHP4.4.1は変数の扱いが変更されているそうです。
バージョンUPすると現行のアプリが動作しない可能性大ですので十分お気をつけて。

実際にはどの部分なのかな?
後気になるのが・・・
実際にアップデートした時に影響がどのくらい影響がでるのかが気になる・・・
対応しなきゃならないんだが・・・$GLOBALS使ってる箇所は全部直せってコトなんか・・・
そこが言及されてなくて今調べてる・・・orz
0141nobodyさん2005/11/03(木) 01:57:40ID:???
>※PHP4.4.1は変数の扱いが変更されているそうです。
×変数→○定数
0142nobodyさん2005/11/03(木) 02:53:13ID:???
>>140
ついでに空の変数を、foreachで回そうとするとエラーが出るようになる。
これのせいで4.3.11のパッチあてたの使ってる。

つか今回の問題騒ぎすぎじゃないか。
彼らが思っている程PEARは普及してないし
register_globalsはoffになっているのではないだろうか。
0143nobodyさん2005/11/03(木) 04:47:39ID:???
世の中にはメンテされていないサーバーが結構あると思われ
それらの中には古いPHPが稼動していたり、
スクリプトを書き換える事ができずにregister_globalsがonのままだったり・・・

$GLOBALSはよく使うけど、使わない方がいいのかな?
でも、globalで似たような問題が出てこないとも限らないし、
かと言って関数実行時に必要な変数を全て渡すのもナンセンスな気がするし
0144nobodyさん2005/11/03(木) 08:23:01ID:???
パッチ上がっていたけどWIN環境での当てかたが分からない('A`)
誰か知っている方ご教授お願いします・・・
0145nobodyさん2005/11/03(木) 09:39:22ID:???
>>144
パッチはPHP本体のソースコード(C言語で書かれている)に対して当てるものなので、
PHPのソースコード(phpの本家サイトでの表記を使うと「Complete Source Code」)をダウンロードし、
それに対してpatchコマンド(Windowsにもあるのか?)か
パッチファイルの中身を参考にしながら手動で書き換えて、それをコンパイル・リンクすればおk。

んでも、コンパイルする環境は整っているのかい?
参照 ttp://www.php.net/manual/ja/install.windows.building.php
0146nobodyさん2005/11/03(木) 15:05:23ID:xJeFN8dM
質問があります。大まかに以下のような継承関係があるとします。

class A {
  public static function factory() {
    return new <CLASSNAME>();
  }
}

class B extends A {
  :
}

B::factory()という呼び出し方をした時に<CLASSNAME>と表記した部分がBになるようにする良い方法はありますか?
今のところA::factory("B");のように引数にクラス名の文字列を渡すしか思い浮かびません。
(これだと生成したオブジェクトに対して、if ($obj instanceof A) のようなチェックなど、余分なものが必要です)
B::factory()で何とかならないものでしょうか?
0147nobodyさん2005/11/03(木) 17:54:47ID:???
ああこれ__class__で親クラスの名前が返っちゃうんだよね
限りなくバグっぽいけど修正されない

サブクラスにクラス名を返すインターフェイスを強要してもいいけど
ファクトリなんだからきっちりオーバーライドするべきじゃないの
0148nobodyさん2005/11/03(木) 17:59:24ID:???
いやバグじゃないか
get_class($this)に相当する別の定数は欲しいなあ
0149nobodyさん2005/11/03(木) 18:39:09ID:???
質問を書こうと思ったけどやめた。
お前らに頼ってたらいつになっても上達しない。
自分でやるから用はねーよ!!!
0150nobodyさん2005/11/03(木) 20:25:52ID:???
(´・ェ・)
0151nobodyさん2005/11/03(木) 20:45:53ID:???
>>149
ごめんにゃあ>w<
■ このスレッドは過去ログ倉庫に格納されています