【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
抜けているものがあったら補足願います
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を使うと♥等の文字実体参照ができなくなってしまうのですが、
対処方法はあるのでしょうか。
&を全て&に変換してから表示させれば実現できることを確認しましたが
それだと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 のループの中身もおかしい。
超初心者なら、まずプログラムの書き方を覚えないと
どっかで配布されているスクリプトを拾ってきて、それを読むのがいいかも
0467465です
04/07/27 05:13ID:???丁寧な解説ありがとうございます。
やはり基礎からやった方がいいのですね(ノД`)シクシク
頑張ってPHP覚えます。
あと、超初心者向けのPHP入門みたいなホームページをご存知でしたら教えて下さい。
0468nobodyさん
04/07/27 08:47ID:???0469nobodyさん
04/07/27 09:05ID:???コイツ最悪だ
0470nobodyさん
04/07/27 09:41ID:???スルーしとけば伸びてこないし何れ滅びる
0474nobodyさん
04/07/27 10:52ID:???includeで他ファイルを読み込むとき、
perlで書かれたCGIを呼び出すことは出来ますか?
試してみるとエラーが出たのですが、なにぶん初心者のため、
構文が誤っていた可能性もあって‥。
<? include("./cgi/bbs/bbs.cgi"); ?>
と記入したのですが
failed to open stream: Permission denied
for inclusion (include_path='.:/usr/local/lib/php')
の2つのエラーが出ました。
phpのパスが出ていたのでphpからperlは呼び出せないのかと‥
0475nobodyさん
04/07/27 10:54ID:???0476nobodyさん
04/07/27 10:57ID:???0477nobodyさん
04/07/27 11:06ID:???0478nobodyさん
04/07/27 11:09ID:???$id = $_GET['id'];
$file_data = file("data.csv");
foreach ($file_data as $temp_line){
if(preg_match("/$id/",$temp_line)){
$parts = explode(",",$temp_line);
$name1[] = $parts[0];
$name2[] = $parts[1];
$recipe[] = $parts[2];
$comment[] = $parts[3];
}
}
var_dump ($name1,$name2,$recipe,$comment);
?>
できたー俺もPHP勉強中!
0479軟式PHP
04/07/27 13:02ID:???$qvId = $_GET['id'];
$fp = fopen("data.csv","r") or die("(;´A`)");
while( $strData = fgetcsv( $fp, 1000, "," ) ){
if( $strData[0] == $qvId )
{
list($name1,$name2,$recipe,$comment) = $strData;
break;
}
}
fclose($fp);
echo $name1.$name2.$recipe.$comment;
?>
0480nobodyさん
04/07/27 14:19ID:???form から submit したときに文字化けします。
form のあるファイルは SJIS ですが、恐らく文字コードの問題ではないです。
文字化けというより、\記号(0x5C)もしくはそれを含む漢字の0x5C部分 がだぶって取得される、という現象です。
たとえばフォームに "\100" と入力すると、$HTTP_POST_VARS['xxx'] は "\\100" となりますし、
"ソノタ" を入力すると "ソ\ノタ" と取得されます("ソ" は SJIS で 0x83,0x5C)。
どこに問題があるかわかりますか?
0481480
04/07/27 14:20ID:uLhfG1jOageさせて。
0484nobodyさん
04/07/27 14:32ID:???URLを指定した、Webサーバ経由のincludeなら可能。
つまりcgiの出力結果のinclude。リモートファイルの
直接的なincludeになるので、セキュリティには気をつけること。
#リモートの出力が常に信頼できるものなら良いが。
0486Imo ◆.jC7ANgFY.
04/07/27 14:38ID:???ちょっと簡略化すればこんな感じかな。
$name1==$idの時という判断なら下のようなプログラムがいいかも。
# チェックせずベタで書いたから修正必要かもしれない
$id = preg_quote($_GET['id']); $k = ',([^\\,\\n]*)';
preg_match_all("/^($id)$k$k$k.*\$/m", file_get_contents('./data.csv'), $match, PREG_PATTERN_ORDER);
list($parts, $name1, $name2, $recipe, $comment) = $match;
var_dump($name1,$name2,$recipe,$comment);
0487軟式PHP
04/07/27 14:39ID:???0488Imo ◆.jC7ANgFY.
04/07/27 14:42ID:???こんなことしてみればいかが。# localhostについては検索すること。
include('http://localhost/〜');
でも出力だけしたいのであれば
echo file_get_contents('http://localhost/〜');
のほうがオススメ。
0489nobodyさん
04/07/27 14:52ID:VW36b+BW<IfModule mod_php4.c>
php_flag output_buffering Off
php_flag magic_quotes_gpc Off
php_value default_charset Shift_JIS
php_value mbstring.language Japanese
php_value mbstring.internal_encoding SJIS
php_value mbstring.http_input auto
php_value mbstring.http_output SJIS
php_flag mbstring.encoding_translation On
php_value mbstring.detect_order auto
php_value mbstring.substitute_character none
</IfModule>
文字コードをSJISで保存・出力したいのですが、これをディレクトリに置くと500エラーになってしまいます。
どうすれば良いでしょうか?
0490nobodyさん
04/07/27 15:01ID:???0492nobodyさん
04/07/27 16:02ID:???PHP+MySQLで日本語検索やりたいんですが、
レコード数が数十万件から100万件程度になると、
WHERE カラム名 LIKE '%検索したい文字%'
ってだけで救いようのないぐらい遅くなります。
なんかアイデア・対処方法は無いでしょうか?
MySQL頼みのFULLTEXTサーチは
日本語NGでしたし・・・。
0493492
04/07/27 16:11ID:???全角英数を半角にとか、
カタカナをひらがなにとか。
0494nobodyさん
04/07/27 16:16ID:???100万件でそんなに遅くなったっけか。Psqlなら遅くなりそうだが…。
インデックス効いてる?
0495492
04/07/27 16:27ID:???お返事ありがとうございます。
LIKE の 頭に ワイルドカードが入ると、
インデックスが効かないのです。
これはMySQLの仕様のようです。
100万件でインデックス効かないから遅いのは当たり前なんですが。
0496nobodyさん
04/07/27 16:40ID:???頭にワイルドカード入ってりゃ全件総ナメに決まってんべ
0497Imo ◆.jC7ANgFY.
04/07/27 16:44ID:???アイディアだけ。遅くなる率は高いけどもしかしたらというわけで。
・phpでbin2hexしたデータを追加し、それにFulltextIndexをかける。
データが2倍になるという欠点がある。
・2バイト文字列を2バイト英数字に変換し(不可逆)、それにFulltextIndexをかける。
意味不明なデーターがひっかかる可能性がある。
・独自で頻度表を作ってみる。
頻度表でどこまで処理できるかが問題。
・namazuを見習って単語リストを作ってみる。
とりあえず面倒。
0498492
04/07/27 16:54ID:???FulltextIndexですかね。やっぱり。
普通は LIKE '%キーワード%' よりは速くなるらしいですね。
ただ、スペースなどで単語を区切らないといけないので、
chasenとか外部プログラムが必要になるのですが、
ここら辺のサンプルなんか紹介しているようなWebページないでしょうか?
perlだと Text::ChaSenなんてモジュールがあるらしいですが・・・
0499nobodyさん
04/07/27 17:15ID:A3g22VFK上記のサイトを参考にして、複数のニュースサイトのヘッドラインを取得、
静的生成するスクリプトを作ってみました。
サイトを複数指定した場合、最終行に書かれたサイトのみしか取得できないのですが
どこか間違えているのでしょうか…?
どうぞ、ご教授お願い致します…。
sample.dat --------------------
%<a href=\"(.+?)\">(.+?)</a>%|http://www.yourdomain.com
%<a href=\"(.+?)\">(.+?)</a>%|http://www.hogehoge.net
0500nobodyさん
04/07/27 17:15ID:A3g22VFK<?php
define(HTML_FILE, "sample.html");//出力するファイル名
define(DAT_FILE, "sample.dat");//ログファイル
$urllist = file(DAT_FILE);
while(list(, $val)=each($urllist)) {
$list = explode("|", $val);
if ($fp = @fopen($list[1], "r")) {
while (!feof($fp)) $data .= fgets($fp, 1024);
fclose($fp);
}
$match_count = preg_match_all($list[0], $data, $items);
for ($i=0; $i< $match_count; $i++) {
$item_url = $items[1][$i];
$title = $items[2][$i];
$title = strip_tags($title);
$output .= "<a href=\""
.$item_url ."\" title=\""
.htmlspecialchars($title) ."\">"
.htmlspecialchars($title) ."</a><br>";
}
}
$fp = fopen(HTML_FILE,"w");
fputs($fp, $output);
fclose($fp);
?>
0501軟式PHP
04/07/27 17:45ID:???0502nobodyさん
04/07/27 18:06ID:???とりあえず、$dataの初期化が欲しいと違うことを言ってみる。
で、正解はファイル名に\nが入っているから。
0503nobodyさん
04/07/27 18:48ID:???printデバッグ汁
0504nobodyさん
04/07/27 19:21ID:???file() で読み込むと行の最後にある改行まで変数に入る。
rtrim() で不要な改行を取り除けば大丈夫。
$list = explode("|", rtrim($val));
0508nobodyさん
04/07/28 12:37ID:1Y3BKvIO職場で爆笑した責任を取ってもらおうか...
■ このスレッドは過去ログ倉庫に格納されています