【PHP】質問スレッドpart19【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/07/16 07:12ID:KvHeypq/・新規質問の方は上げてください。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
抜けているものがあったら補足願います
0367nobodyさん
04/07/25 06:17ID:???0368nobodyさん
04/07/25 09:25ID:???Windows版のほうはあんまり使ってなくてうろ覚えなんだけど、
php.iniでinclude_pathをC:\PHP\PEARとか、ちゃんと設定しる。
もしくはスクリプト冒頭でini_set('include_path', '.;D:\path\to\pear');とかそんな感じ。
0369nobodyさん
04/07/25 14:31ID:???global $hoge;
foo();
exit;
function foo(){
print ($hoge);
}
これは動きませんかね?
0370369
04/07/25 14:43ID:???これなら自分で確かめた方が早いです
0371369
04/07/25 15:01ID:???普段は偉ぶってるくせに無能揃いですね。
0372nobodyさん
04/07/25 15:15ID:???0373nobodyさん
04/07/25 16:17ID:???/ || ̄ ̄|| <⌒ヽ )) < >>371 はてさて、
| ||__|| < 丿 | どこを縦に読みゃいいんだ?
| ̄ ̄\三⊂/ ̄ ̄ ̄/ \___________
| | ( ./ /
0374nobodyさん
04/07/25 16:27ID:???0375369
04/07/25 19:37ID:???うちのお兄ちゃんは大学院に行ってるからはっきり言ってお前らより上。
もう偉ぶるのやめてね
0379nobodyさん
04/07/25 22:31ID:???今入退室を付けたチャットを作ってるんです。それで、入室時に名前、時刻、IPを
name<>date<>ip<改行>name<>date<>ip<改行>
の形式でログに保存して、最近の入室履歴ってことで、最新10まで[name 時刻:data]で表示させようと思います。
以下のでやってみたのですが、何も表示されず・・・。何が問題でしょうか。
$data = file('log.log');
for($i = 0;$i > 10;$i++){
$v = split('<>', $data[i]);
echo("$v[0] 時刻:$v[1]<br>");
}
0380379
04/07/25 22:35ID:???$v = split('<>', $data[i]);
↓
$v = split('<>', $data[$i]);
0381nobodyさん
04/07/25 22:45ID:???> for($i = 0;$i > 10;$i++){
このへん。
echoの中身も表示されないし、forループに問題があることにすぐ気づかないと。
0382379
04/07/25 22:49ID:???$i>10じゃ動くはずが無いと・・・。
どんなパズルもわかっちゃうと簡単すぎて笑っちゃうもんですね。
わざわざありがとうございました。
0384nobodyさん
04/07/26 00:03ID:???requireとrequire_onceはどう違うのでしょうか?
ヘルプを呼んだ限りでは、毎回読み込むか一回読み込むかの違いみたいに
書いてあったのですが、PHPはリクエストのたびにスクリプトを毎回読み込むのではないのですか?
一回しか読み込まないとはどういう動きをするのでしょうか?
0385nobodyさん
04/07/26 00:28ID:???0387nobodyさん
04/07/26 02:49ID:???すでにincludeしたファイルを再び読む込むように指定した場合の挙動の違い。
例えば、読むファイルをテンプレート代わりに使う場合はinclude、
共通ユーザー関数群の定義に使う場合はinclude_onceを使うといい
下手な釣りを見て思い出したが、PHPにはユーザーによる変数の
スーパーグローバル化やラベルジャンプがないのでちょっと困ることがあるな。
あれば楽できるのに・・・と思う局面がたまにある
0388nobodyさん
04/07/26 02:54ID:sMxRgzIjファイルをアップロードするスクリプトを組んでいるのですが、ファイルのサイズがある程度大きくなるとうまくいきません。
1) 651バイトの画像ファイルは正常にアップロードできました。
2) テスト用に文字列"1234567890"で埋めた 161,876バイトのテキストファイルは以下の様になります。
type : text/plain
size : 321880
error: 0
実際にUPされたファイルを見てみると
先頭に1,260バイト分 "1234567890"が入っていて次に
-----------------------------7d420b560c66
Content-Disposition: form-data; name="upfile"; filename="クライアント側のファイル名"
Content-Type: text/plain\r\n\r\n
その後最後まで"1234567890"が入っているようです。
(その後の部分は多いのでざっと目視しただけですが、少なくともodでダンプ取った範囲では 1164520=321,872まではデータが埋まってました)
環境は RedhatLinux9.0 PHP-4.2.2 Apache2.0.40 で
file_uploadsはOn
upload_max_filesizeは1M
に設定してあります。
同じスクリプトを別サーバにて動作させると正常に作動するのでどうにも原因がわからないです。
怪しそうな所をお教えください。
ちなみに動作するサーバでも似たような構成で動かしています。
RedhatLinux9.0 PHP-4.2.2-17(SRPMからMB_STRINGをONにして自分でコンパイルした)+ Apache2.0.40 です。
0389388
04/07/26 04:29ID:sMxRgzIj試にうまく動作している方のサーバから自分でビルドしたPHPのパッケージを動作していないサーバにFTPしてインストールしてみました。
php.iniもコピーしました。
結果は以前と同じでサイズが倍ほどに膨れます。
PHPの問題ではないみたいですね。
訳がわからなくなってきました。。
0390nobodyさん
04/07/26 05:49ID:IOiIX+Frvodafoneからだと見られないという報告を受けました。文字コードとうで
何か気をつけるべきことがあるのでしょうか?詳しい方教えてください。
0391nobodyさん
04/07/26 05:49ID:???POSTメソッドを使ったアップロードでFAQ的なところだけど。
0393nobodyさん
04/07/26 09:23ID:zfZRDkJ9ファイルのオーナーがapacheの実行オーナー(nobodyさん)になってしまいます。
これを、自分のアカウントがオーナーにしたいです。
また、ファイルの内容は変更することがあるので、その時には、ファイルのオーナーを
nobody さんに戻せないといけません。
よろしくおながいします。
0395nobodyさん
04/07/26 11:18ID:BnaAbQE9変数$foo['hoge'][$bar['huga']]を表記するにはどうすればいいですか?
単に、${foo['hoge'][$bar['huga']]}では
Parse error: parse error, expecting `'}''
となります。
0397nobodyさん
04/07/26 11:23ID:BnaAbQE9ありがとうございます。解決しました。
{$hoge[]}と${hoge[]}の文法的な違いってなんですか?
0398nobodyさん
04/07/26 11:32ID:zfZRDkJ9vodafoneのキャッシュ制限にひっかかってない?
非パケ端末は1ページ6kbyte以下ですよ。
0399nobodyさん
04/07/26 11:32ID:???マニュアルを読みましょう。「変数のパース」以下を読んでみて下さい。
http://www.php.net/manual/ja/language.types.string.php
0400nobodyさん
04/07/26 11:57ID:???まあ、一々宣言すればいいんだけど、$PHP_SELF位は
スーパーグローバルに登録された方が楽かな・・・とは思うもんで。
それともこういう書き方は(・A ・)イクナイ?
0401nobodyさん
04/07/26 13:06ID:U4MCK2zg1:タイムスタンプ名のディレクトリをumask設定してから作成
(他のサイトでumaskしたらいいと書かれていました)
$oldmask = umask(0);
$dir = mkdir($timestamp,0777);
umask($oldmask);
2:そのディレクトリに画像をアップ
3:$name = $dir."/1.jpg";
これでechoで$nameを出力させるときちんとjpg名が出力されるのですが、
is_file($name)等でファイルの存在を調べると、falseが返ってきます。
これはなぜなのでしょうか?知ってる方お願いします。
0402nobodyさん
04/07/26 13:20ID:???アップロード処理の例外処理とかちゃんとしてる?
0404nobodyさん
04/07/26 14:17ID:???Windowsではできてると言っているのに、、、
「Macでは試験したことが無いですが、Windows限定でよければ。」ってアフォか
0405nobodyさん
04/07/26 14:24ID:???そういうおもしろいのは↓へどうぞ
http://pc5.2ch.net/test/read.cgi/php/1090322290/
0406nobodyさん
04/07/26 14:29ID:???0407401
04/07/26 14:42ID:U4MCK2zg$nameを出力すると「123456789/1.jpg」みたいになります。
<img src=$name>
はきちんと画像が表示されます。画像はアップされています。FTPでも画像の存在を確認できます。
でもis_file($name)はfalseが返ってくるんです。
is_file("123456789/1.jpg") で確認するとTRUEなのですが、is_file($name)はFALSEなんです。
0408nobodyさん
04/07/26 15:07ID:???0409401
04/07/26 15:26ID:???フルパスでも無理でした。
mkdirで作成したディレクトリにあるファイルをis_fileで調べた場合FALSEを返すのでしょうか?
is_dir($dir)もFALSEでした。
※$dirにはmkdirで作成したディレクトリ名(フルパス)
0410nobodyさん
04/07/26 15:32ID:???0411nobodyさん
04/07/26 15:34ID:4tJVtMcehtmlspecialcharsを使うと♥等の文字実体参照ができなくなってしまうのですが、
対処方法はあるのでしょうか。
&amp;を全て&に変換してから表示させれば実現できることを確認しましたが
それだとhtmlspecialcharsの意味が無くなるし・・
よろしくおながいします。
0412401
04/07/26 15:42ID:???はい・・・file_existsもfilesizeも、mkdirで作成したディレクトリを含めその中にあるファイルの情報を
得ようとするとFALSEなんです。
if ( file_exists ( $name ) ) //FALSE
print "<img src='".$name."'>";//アップした画像が表示される
0413388
04/07/26 15:42ID:sMxRgzIjアドバイス有難うございます。
ApacheのPOSTデータの限度設定とはPHPのマニュアルサイトのUser Contributedにのっかっている
LimitRequestBodyのことでしょうか?
そちらを2Mで試してみていますがうまくいかないです。
0414nobodyさん
04/07/26 15:42ID:???0417nobodyさん
04/07/26 16:27ID:???そうそれ(うろ覚えでスマンね)。
現象が違う(倍に膨れる/該当するエラーが出てない)ので
違うとは思ったが、やっぱり関係ないね。
入ってるデータ見てるとWebクライアント自体がデータをマルチパート化して
その両方の形式とも送ってるみたい。使ってるのはIE?
別のWebクラインアントで試すか、送信データをキャプチャして見てみるのが良いかも。
0419nobodyさん
04/07/26 17:02ID:???0420nobodyさん
04/07/26 17:13ID:???自分もそんな気がしてるのですが、藁にもすがる思いで質問しました。
もう一度じっくり見直してみます。有難うございました。
0421nobodyさん
04/07/26 17:21ID:???401の$dir = mkdir($timestamp,0777);を実行して
$dirに作成したディレクトリ名が入るのか?
http://www.php.net/manual/ja/function.mkdir.php
0422nobodyさん
04/07/26 17:54ID:???0423nobodyさん
04/07/26 18:09ID:???>>412 の、これがわからんな
if ( file_exists ( $name ) ) //FALSE
print "<img src='".$name."'>";//アップした画像が表示される
0424nobodyさん
04/07/26 18:15ID:???と
>print "<img src='".$name."'>";//アップした画像が表示される
の参照ディレクトリが違うだけの話じゃないの?
0425nobodyさん
04/07/26 18:57ID:???読み取るにはどうすればよいでしょうか?
0427nobodyさん
04/07/26 19:11ID:???これで呼び出すと全部が変数に入るから
一番上のだけ読み込みたいと・・・
0428nobodyさん
04/07/26 19:12ID:???$msg[0]
0429nobodyさん
04/07/26 19:17ID:???「田中さん
山下さん
吉田さん」
だとすると
$msg = file(data.cgi);で
$msg[0] が田中さん
$msg[1] が山下さん
$msg[2] が吉田さん
となるのですか?
0430nobodyさん
04/07/26 19:17ID:???>is_file("123456789/1.jpg") で確認するとTRUEなのですが、is_file($name)はFALSEなんです。
↓は試した?
if ( "123456789/1.jpg" != $name ) echo '当然falseだ(゚Д゚ )ゴルァ!!';
>>411
適当に書いたので合ってるか分からんが、
$contents=preg_replace('/&([0-9a-z]+;)/i' ,'&$1', $contents);
等で、実体参照と思われる部分のみさらに置換し直す。
0432nobodyさん
04/07/26 19:24ID:???送信ボタンをクリックしたらAに1が
代入されるとかできますか?
0435nobodyさん
04/07/26 19:31ID:???0436nobodyさん
04/07/26 19:42ID:???$com = file($data);
$fp = fopen($data,"w");
fputs($fp, "$msg\n");
fclose($fp);
fputs(): supplied argument is not a valid stream resource
0437436
04/07/26 19:46ID:???0438436
04/07/26 19:48ID:???ヘルプキボンヌ
0439nobodyさん
04/07/26 19:50ID:???0440nobodyさん
04/07/26 19:53ID:???string(77) "やまもと,おはようございます,2004/07/26 19:52:51,YahooBB************.bbtec.net"
0441nobodyさん
04/07/26 20:10ID:???0442436
04/07/26 20:12ID:???ナンダコリャ
0443nobodyさん
04/07/26 20:33ID:???$fpか? まあ要はファイル開けないぞゴルァ!ってことだな。
if(!$fp=fopen($data,"w")){
echo "cannot open!";
}else{
fputs($fp, "$msg\n");
}
に変えて実行してみれ。
0444436
04/07/26 20:43ID:???0445nobodyさん
04/07/26 20:44ID:???if(!file_exists($data)){
echo "file not found."
}
だと思う。
typoしてないかどうかよーくソース眺めてみ。
0446436
04/07/26 20:46ID:???$dataではなく$logですた;;
0447nobodyさん
04/07/26 21:19ID:???おう、それと$fp=fopen($data,"w")だと$logの中身は常に最新の$msg一行だけになるから
$fp=fopen($data,"a");でオープンしとけ。
0449388
04/07/26 21:32ID:sMxRgzIjクライアントはIE6とネスケ7.1で試してます。
動いている方のサーバは
Redhat9.0を米国のスタッフが英語環境で(おそらくインターネットサーバとして)インストールして
その後、私がPHPをMB_STRING付&不要なオプションを削除してリビルド、
httpd.conf内の不要モジュール等の削除+バーチャルホストの設定を行っています。¥
ついでに手持ちのもう2台のサーバ(自分でRedhat9.0を日本語ベースでサーバインストール&PHPをMB_STRINGコンパイル
&apacheを上記サーバとほぼ同じ設定をしたもので試しましたがそちらでも動作しています。
対し動いて居ないサーバは
SAKURAインターネットのサーバでApache、PHPともインストールされたままのものを使用(1台はPHPのパッケージを昨日入れ替えました)
10Mプレミアムと10Mスタンダードの2台です。
普通に自力でやった物が動いていて、SAKURAのほうのみ動かない状況です。
これからTCPDUMPで内容解析してみます。
0450nobodyさん
04/07/26 21:44ID:???マニュアルちゃんと読んでない関数をよく使おうと思うな…
特に戻り値把握して無いって普通におかしいだろ?
その関数をそこで使おうと思った理由がスゲー気になる
0451388
04/07/26 21:57ID:sMxRgzIj概算ですが送信サイズは元のファイルのサイズです。
またhttpヘッダー部のダンプを見てみたところ
Content-Length:.162212 (PHP側では size : 321880と表示される)
の文字があったので送信されるHTTPヘッダーは正しいみたいです。
(まぁ同じクライアントで別サーバで動作するのでクライアント側から送信されるデータは正しいっぽいですね)
もう訳がわからなくなったので一度ApacheをSRPMからビルドしてみます。
0452388
04/07/26 22:19ID:sMxRgzIjhttpd.confのどこかに問題がありそうです。
これから箇所を特定してみます。
スレ違いになってしまいましたが箇所がわかったら書き込みますね。
0454388
04/07/26 22:45ID:sMxRgzIjAddType application/x-httpd-php .php
これを入れるとサイズが倍になります。。 う〜ん
たしかに自分で設定したほうには入れていなかったです。
これ設定しなくて良かったんでしたっけ?
ともあれ原因がこんな所にあるとは。。 奥が深いです。
アドバイスどうもありがとうございました。
0455nobodyさん
04/07/26 22:52ID:???アップロード元のhtmlで「enctype="multipart/form-data" 」
は指定されてるよね?
0456nobodyさん
04/07/26 22:59ID:???記述はいる筈だけど、それはRHL9(のRPMで入れた)なら
/etc/httpd/conf.d/php.confに書かれてるんじゃないかな。
.htaccessにも書けるし、設定は「上書き」であって
コンフリクトはしないと思うけど。
0457nobodyさん
04/07/26 23:10ID:ehBSQM9Lおながいします
0458Imo ◆.jC7ANgFY.
04/07/26 23:14ID:???所有者を自分にしたければCGI/perlから作ればよし。
0459388
04/07/26 23:19ID:sMxRgzIjもちろんマルチパートで送信しています。
手持ちのサーバの大部分はうまく動作しているのです。
最近引き継いだSAKURAインターネットのサーバのみダメな状態だったのです。
送信パケットでは正常なパケットを送信しつつ、ApacheからPHPにデータが渡る時点で倍に増えているような状況でした。
>454
php.conf にはAddTypeは書かれて居ないです。
入っていたのはLoadMduleとLimit関連、DirectoryIndexの3点だけでした。
grepしてみたのですが他にphpのAddTypeをしている箇所は無いようです。
何度か試しましたが[AddType application/x-httpd-php .php]を入れてhttpd再起動でサイズが倍に、
コメントアウトして再起動で正常なサイズでアップされます。
Apache,phpのバージョンの組み合わせの問題でしょうかね?
0460nobodyさん
04/07/26 23:42ID:???RedHat9にPHP4とGD入れるときのconfigureで、--with-gd --with-jpeg-dir=/usr/lib/したとき、
「configure: error: libjpeg.(a|so) not found.」ってエラー出る場合は、
「find /usr/lib -name libjpeg*」しても「libjpeg.so」が見つからないはず。
OSインストール時にパッケージの開発ツールで「Xソフトウェア開発」を入れれば解決。
</俺メモ>
0461nobodyさん
04/07/26 23:53ID:???RC1まではあってRC2で削除されたようですが。
よろしくお願いします。
#interfaceよりnamespaceの方が欲しかった・・・
0463nobodyさん
04/07/27 01:45ID:???0464nobodyさん
04/07/27 02:02ID:???0465nobodyさん
04/07/27 02:12ID:???あ,データA,データB,
い,データA,データB,
う,データA,データB,
としているデータを?id=あ
で一行目の列のみ検索して一致した場合その行のデータを取得して配列?に入れて表示したいんですけど教えて下さい。
適当に書いてみたんだけど↓(つд⊂)エーン全然ちがうよね??
<?PHP
$file_data = file("data.csv");
foreach ($file_data as $temp_line){
preg_match('/$id/',$temp_line,$parts);}
{
$parts = explode(",",$temp_line,4);
$name1[] = $parts[0];
$name2[] = $parts[1];
$recipe[] = $parts[2];
$comment[] = $parts[3];
}
?>
0466nobodyさん
04/07/27 04:03ID:???全然ダメ
そのものズバリ書くのも何なのでヒントを
preg_match の部分が変だし、preg_match は if 文じゃない。
foreach のループの中身もおかしい。
超初心者なら、まずプログラムの書き方を覚えないと
どっかで配布されているスクリプトを拾ってきて、それを読むのがいいかも
■ このスレッドは過去ログ倉庫に格納されています