【PHP】質問スレッドpart30【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/10/25(火) 06:50:06ID:Q4oGlTH3【基本ルール】
・新規質問の方は上げてください。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辺り
0175nobodyさん
2005/11/05(土) 16:21:46ID:???だけ生存期間を短くしたいのですが、
どうすればいいのでしょうか
誰かお願いします
0177nobodyさん
2005/11/05(土) 18:25:59ID:???1.メールアドレスを入力して送信
2.メールにURLが表示
3.URLをクリックするとアカウント登録完了
としたいのですが、URLを
***.php?[メールアドレス][日時][アドレスと日時のハッシュコード]
という風にしてハッシュの整合性をチェックして
アカウント作成、という風にしたら
何か問題があると思いますか?
ハッシュが解読されない限り大丈夫だとは思うんですが、何か心配です
0178nobodyさん
2005/11/05(土) 18:26:47ID:???0179nobodyさん
2005/11/05(土) 18:36:03ID:???0180nobodyさん
2005/11/05(土) 18:48:45ID:???どっちかを見分ける必要がありますよね
鍵付きのハッシュで鍵を長くしても駄目でしょうか
0181nobodyさん
2005/11/05(土) 19:12:30ID:???1.メールアドレスを入力させる
2.ユーザはメールアドレスを入力しPOSTする
3.システムがメールアドレスからハッシュを取得する
4.システムはハッシュ値と日付をどこかに保存する(DBとか)
5.システムが
http://example.com/hoge.php?[ハッシュ]
を含んだメールを入力されたアドレスに送信する。
6.ユーザが上記のアドレスにアクセスする
7.システムは保存されたハッシュを検索する
以下略
0182nobodyさん
2005/11/05(土) 19:29:17ID:???0183nobodyさん
2005/11/05(土) 19:43:57ID:???なるほど。
177さんではありませんが勉強になります。
0184nobodyさん
2005/11/05(土) 22:10:21ID:???GLOBALSに外部ユーザーからの値を受け取らないように組んでればOK
ってことだよね
若干騒ぎすぎな気がする。
0185nobodyさん
2005/11/05(土) 22:20:31ID:???0187nobodyさん
2005/11/05(土) 22:58:28ID:???0188nobodyさん
2005/11/05(土) 23:09:30ID:???0189nobodyさん
2005/11/05(土) 23:17:36ID:???0191nobodyさん
2005/11/05(土) 23:20:54ID:???0194nobodyさん
2005/11/06(日) 02:19:18ID:???サーバ上で呼び出されたのとを
区別する方法ってありませんでしょうか?
0196nobodyさん
2005/11/06(日) 02:44:47ID:???$argv は php.ini の register_argc_argv が On なら CLI じゃなくてもありますよ。(CLI では強制 On)
CLI + Apache モジュールなら php_sapi_name() 関数か PHP_SAPI 定数で判別できますね。
CGI としてインストールされてるなら判定用の環境変数を仕込むのがいいんじゃないかと。
0198nobodyさん
2005/11/06(日) 15:31:18ID:???メール本文はどこで定義していますか?
メール本文に受け付けたクエリを載せるとしたら
やっぱりそのプログラム内部に .= とか ヒアドキュメントとかで
書くしかないのかな?
メール本文だけ外部ファイルにして、
requireしようかと思ったけどなんか違う。
外部ファイルをevalしようかと思ったけどこれもまたなんか違う。
やっぱり本文に書くのみ!?
別変数で定義しておいて、
あとから参照しようとしても上と同じことになるし…
Perl使ってたときは、外部ファイルにして
クエリ載せるところは正規表現で全部置換してたんだけどなぁ
0200nobodyさん
2005/11/06(日) 15:42:46ID:???>クエリ載せるところは正規表現で全部置換してたんだけどなぁ
じゃあそすればいいじゃない。
つうか、別に正規表現使わなくてもできるよね。
0201nobodyさん
2005/11/06(日) 15:43:46ID:???どうしっくり来ないのか判らないんだけど、漏れは外部ファイルに置いて
文字列に取り込んでる。
$message = file_get_contents('mailtemplate.txt');
0202198
2005/11/06(日) 15:51:28ID:???駄文申し訳ない。別に問題ないことなんだけど、
周りはどうしてるのかなーと気になっただけです。
>>200
PHPらしく考えると、正規表現を使うよりは
変数展開の方がいいかなーと勝手に思ってしまったです。
そうなると外部ファイルに持つ方がしんどくなるので…
>>201
メール本文がクエリによって可変でないなら
file_get_contentsがスマートですね。
可変になったらどうしてます??
0204198
2005/11/06(日) 15:54:49ID:???なるほどどうもです。
PHPだと <?=$hoge?> で変数展開できるのに
変数毎に置換することを考えると
ちょっとしっくり来ないんですよね。
(どうでもいいことか…
0205201
2005/11/06(日) 16:11:54ID:???あ〜、なるほど。しっくり来ないのはその辺なんすね。
HTMLファイルなんかもそうだけど、テンプレートはあくまでもテンプレートであって
必ずしもPHPプログラマがいじる物とは限らないので、PHP色は排除してる。
もう少し具体的に書くと、こんな感じ。
これがベストとは思わないけど、ウチではこうやってるよ、ということで。
実際にはサニタイジング、文字コード変換等やっているので、その辺のツッコミはなしよ。
---mailtemplate.txt(テンプレートファイル)---
送信者:#FROM#
タイトル:#TITIE#
ご質問内容:
#MESSAGE#
---php---
$message = file_get_contents('mailtemplate.txt');
$message = str_replace(
array('#FROM#', '#TITLE#', '#MESSAGE#'),
array($_POST['from'], $_POST['title'], $_POST['message']),
$message);
mb_send_mail(SUBJECT, $message, ...);
0206nobodyさん
2005/11/06(日) 16:27:23ID:???なるほど、非常に参考になります。
外部ファイルの置換文字列自体を
<?=?>等のPHP変数にして、
本体からrequireしてしまえば
いいかなとも思ったんですが、
本体見ないと何してるのかわからないんすよね…
ってrequireじゃダメか…
となるとeval…となるとエスケープがめんどい。。
201さんのやり方が一番いいかもしれないすね
0207198
2005/11/06(日) 16:27:53ID:???0208nobodyさん
2005/11/06(日) 17:28:47ID:???require使いたければ
$hoge = "aaa";
$piyo = "bbb";
としておいて
require "orz.php";
----- orz.php
....
{$hoge}さまへのメール
{$piyo}のお知らせ
-------
とかでいいじゃね?
0209208
2005/11/06(日) 17:31:56ID:???---- orz.php
$mail_body = <<<EOF
{$hoge}さまへのメール
{$piyo}のお知らせ
-------
ということね^^;
0210nobodyさん
2005/11/06(日) 19:14:21ID:???0211198
2005/11/06(日) 21:25:54ID:???レスありがとうございます。
<?=?>にこだわっているというよりは、
PHPらしさにこだわっているってことでしょうか(汗
確かにrequireだと、ヒアドキュメントとかになっちゃうんですよね。
(そうなるとあまり外部にする旨みがなくなってしまうかな…)
0212nobodyさん
2005/11/06(日) 21:32:52ID:???ob_*を使って任意の変数に取り込めばいい
phpコードを含められるって利点くらいしかなさそうだけど。
0213198
2005/11/06(日) 21:39:10ID:???レスありがとうございます。
なるほど、ob_* って手もありましたね。
ただここまでくると、PHPコードで展開するか
既定文字列を置換するかどっちかですね。
今までどおりプログラム本体にヒアドキュメントが
一番楽でシンプルかな…
ありがとうございます
0214nobodyさん
2005/11/07(月) 00:19:44ID:VYJqOcB8アトリビュートの値)を抽出するようなライブラリはないでしょうか。
PerlだとTemplate::Extractというのがあるようです。
ttp://naoya.dyndns.org/~naoya/mt/archives/000833.html
XML_HTMLSaxでも実現可能そうですが、Template::Extractのように
ルール定義だけで抽出できるようなのを探しています。
0215nobodyさん
2005/11/07(月) 16:30:23ID:QyO81Mjh0216nobodyさん
2005/11/07(月) 19:07:15ID:???設置したのですが、GDは入っているのにGDを使う部分だけ動作しません。
GDを動かすにはどのようにすればいいでしょうか。ご教授願います。
環境は Vine Linux , Apache1.3 , php 4.4.1 です。
0218nobodyさん
2005/11/07(月) 19:13:03ID:???0220nobodyさん
2005/11/07(月) 19:34:47ID:O90JEyy/と
@fopen
の違いってなんでつか?
0221nobodyさん
2005/11/07(月) 20:12:54ID:???CGIの方ではGDが入っているかを判別して使わないようにしているようです。
どうやらPHPでGDが認識されてないみたいです。
>>219
やってみましたが駄目でした。
GD自体はapt-getを使用してインストールしました。
0223216
2005/11/07(月) 20:34:32ID:???ttp://rep2.net/up/data/630.txt
0224nobodyさん
2005/11/07(月) 20:49:47ID:???gdの文字を探しても見つからないから、
鯖の中にGDライブラリは存在するが、PHPと連携できるようになっていない。って所かと。
vineのrpmってこんなさっぱりしたconfigureなのかなぁ。。。
自力でconfigureするなら、--with-gd(必要なら=DIR)てな感じでgdを使うよーって指定してあげてください。
0226nobodyさん
2005/11/07(月) 21:01:33ID:???GD入ってるの確かならライブラリ入ってるPATHを
ld.so.confに念のため追加して
./configure --with-gd=PATH 追加してmake してみたら?
0227nobodyさん
2005/11/07(月) 21:03:59ID:???インストールできたらphpinfoで↓が出るはず。
gd
---------------------------------------
GD Support enabled
GD Version 2.0 or higher
FreeType Support enabled
FreeType Linkage with freetype
GIF Read Support enabled
GIF Create Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled
Jpeg GIF Freetype などのライブラリも入れるの忘れるなよ。
0228nobodyさん
2005/11/07(月) 21:05:10ID:???0229nobodyさん
2005/11/07(月) 21:13:03ID:???0230nobodyさん
2005/11/07(月) 21:19:54ID:???0231nobodyさん
2005/11/07(月) 22:27:26ID:vt3MtPM6$form->addElement('select ', 'address[]', '東京都中央区');
$form->addElement('select ', 'address[]', '東京都千代田区');
$form->addElement('select ', 'address[]', '東京都新宿区');
$form->addElement('select ', 'address[]', '東京都渋谷区');
と書きたいのですが、当然[]がsmartyの方でエラーになってしまい、使えません。
何かよい方法ありますか?
0233nobodyさん
2005/11/07(月) 22:37:12ID:???0234nobodyさん
2005/11/07(月) 22:37:33ID:vt3MtPM60235nobodyさん
2005/11/07(月) 22:56:57ID:vt3MtPM60236nobodyさん
2005/11/07(月) 23:29:36ID:+B+7rA332: $strXsl = "./test.xsl";
3: $obj=xslt_create();
4: $result=xslt_process($obj,$strXml,$strXsl);
xmlファイルをローカルに置いてやってみるとエラーもなく動くのですが
↑のように他のサーバーにあるXMLを読み込もうとすると
Warning: Sablotron error on line 1: XML parser error 4: not well-formed (invalid token) in /test.php on line 4
というエラーが出てしまいます
解決策がありましたらお願いします
0237216
2005/11/08(火) 00:17:30ID:???色々試してみましたが、どうもうまくいきませんでした。
path指定無しのGD付き指定configureだと状況変わらずだし。
path指定してみたら今度はファイルが足りませんと。むずかしいなあ。
まだやってない方法もあるのでまた試してみます。
レスしてくださった皆様ありがとうございました。
0238nobodyさん
2005/11/08(火) 01:27:12ID:???Linuxよく知らないんだけど/usrに色々入ってると仮定して、こんな感じで。(パスは適宜読み替えてね)
--with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-zlib-dir=/usr --with-freetype-dir=/usr/X11R6 --enable-gd-native-ttf
0239nobodyさん
2005/11/08(火) 13:44:53ID:SGMtFQHwで 末尾の{が、
preg_replace("/\{.*\}$/", "", $line);
で { hogehoge;} が消えてくれないんだけど、何か間違ってる?
0240239
2005/11/08(火) 13:46:30ID:SGMtFQHw0241nobodyさん
2005/11/08(火) 13:52:23ID:???俺のとこでは消えたけど。
ダメならこうしたら?
preg_replace("/\\{\$/", "", $line);
preg_replace("/\\{.*\\}\$/", "", $line);
0242239
2005/11/08(火) 14:40:48ID:SGMtFQHw変数に受け取ってませんでした(汗
ありがとうございました。
0244nobodyさん
2005/11/08(火) 14:57:23ID:???テンプレ側
{foreach from=$form.address item=element}
{$element.html}
{/foreach}
024586
2005/11/08(火) 15:30:56ID:???以下のPerlをPHPにしたいのですが、
とりあえず
>>87さんのおかげで(遅レスすみません)
PHPでPOSTメソッドで送信を行うには
HTTP_requestを使えばよいというのがわかったのですが、
cgiプログラムに ファイル 'test.txt'を
渡す部分が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;
0246nobodyさん
2005/11/08(火) 15:51:28ID:???ttp://www.1x1.jp/php/manual_pear/html/package.http.http-request.html
読んでからもう一度
0247"php include"で調べましたが、よく分かりません。
2005/11/08(火) 16:09:10ID:KaRV4LV5ssiでインクルードして表示させることは出来るようになりました。
<?php
error_reporting(E_ERROR);
require_once './rss_fetch.inc';//設定ファイル
define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
$url = 'hogehoge.rdf'; //rssのありか
$rss = fetch_rss($url);
$title = $rss->channel['title'];
echo "<h2><a href=\"$url\">$title</a></h2>\n";
foreach ($rss->items as $item ) {
echo "<dl>\n";
$title = htmlspecialchars($item['title']);
$description = htmlspecialchars($item['description']);
$url = htmlspecialchars($item['link']);
$time = $item[dc][date];
$time = Rtrim("$time","\+09:00");
$time = StrTr("$time","T-"," /");
echo "<dt><a href=\"$url\">$title</a></dt>\n";
echo "<dd> ($time)</dd>\n";
echo "</dl>\n\n";
}
?>
これをphpで実行させ、表示するとなるとどうすればよいのでしょうか。
つまり、ssiの<!-- #include virtual="./xxx.php" -->に相当する手法を知りたいです。
<? php include=('xxx.php')?>ではうまくいきません。どなたかご教示ください。御願いします。
0248nobodyさん
2005/11/08(火) 16:33:26ID:???つ【マニュアル】
0249nobodyさん
2005/11/08(火) 16:55:03ID:???HTTP_Request
void addPostData(string name, string value [, bool preencoded])
PEAR_Error addFile(string name, string file_path [, string content-type])
addFileが呼ばれると自動的にmultipart/form-data形式になる
0251247
2005/11/08(火) 17:49:51ID:KaRV4LV5あ、すみません。
.htaccessの設定がおかしいみたいです。
他のディレクトリでは普通にphpのincludeで出来ました。
お騒がせしました...orz
(でもおかしい設定は無いと思うのだけれど・・・
phpinfoさえも出来ないディレクトリってなんでだろう・・・)
0252247
2005/11/08(火) 17:52:50ID:KaRV4LV5無理なんじゃ・・・同一ディレクトリだったら問題ないし。
ああ・・・
0254247
2005/11/08(火) 18:08:09ID:KaRV4LV5ありがと。
おそらくそれかも。
すれ違いなのでこのあたりで・・・
0255247
2005/11/08(火) 18:13:54ID:KaRV4LV5その通りでした。
正常に動作しました。
お騒がせしてスミマセンでした。
0256216
2005/11/08(火) 22:01:33ID:???結局GDをうまく認識できませんでした。
そこで、最初のRPMによるインストールを見直すことにしました。
php pear を最初に入れて次にphp apache1 を入れるように二段階に手順を別けて
インストールしたところ、きちんとGDを認識してくれました。
自分のやり方が間違ってたようで、ご迷惑おかけしました。
0257nobodyさん
2005/11/09(水) 00:59:47ID:???ファイルを指定してきました。その結果ブラウザに表示させたいファイル、
ここでは例としてjpgファイルとします、が得られたとします。
/usr/local/public_html/pic/sample.jpg
この形式のままimgタグに当てはめてもブラウザには表示されません。
ブラウザに表示できるようなパスの形式に変換する方法、あるいは
関数はありますか?
0258nobodyさん
2005/11/09(水) 01:06:41ID:???/usr/local/public_html/を削ればいいじゃん
方法くらいPHPのマニュアル見ればわかるだろ。
しかし/usr/local/public_html ってのは普通はあり得ない設定だよな。
0259nobodyさん
2005/11/09(水) 01:07:25ID:???HTML上では
<img src="image.php">
のような形でPHPファイルを参照させておいて、image.phpでそのJPEGファイルを取得して表示させる。
sample.jpgだけでなく、色々なファイルを表示させたい場合は
表示したいファイル名を
image.php?file=hoge.jpg
のようにimage.phpの引数に渡してあげて画像ファイルを取得する。
0260257
2005/11/09(水) 01:17:04ID:???> /usr/local/public_html/がホームディレクトリなら
> /usr/local/public_html/を削ればいいじゃん
はい、まず初めに考えたのがその方法なんですが、環境が違うとき、
たとえばレンタル鯖にアップする前、自宅鯖で表示確認を行いたいときなど
/usr/local/public_html/
の部分が一般的には違うので、その環境に依存する違いをどう吸収させようか
という点で詰まってしまいまして。その鯖のホームディレクトリをはき出して
くれる関数があれば実現できるんでしょうが・・・
> しかし/usr/local/public_html ってのは普通はあり得ない設定だよな。
これは単なる仮定です^^;)
>>259
> <img src="image.php">
> のような形でPHPファイルを参照させておいて、image.phpでそのJPEGファイルを取得して表示させる。
なるほど、ImageCreateのような描画関数はサーバーの絶対パスを引数とする点を活用
しようというわけですね。そっちのほうから攻めると意外と解決は簡単かもしれませんね。
0261257
2005/11/09(水) 01:56:55ID:???> くれる関数があれば実現できるんでしょうが・・・
自己レスですが、ルートにPHPファイルを置いて、その中で
__FILE__なりで絶対パスを吐かせればサーバー毎の環境の
違いを吸収できそうですね。
0262nobodyさん
2005/11/09(水) 02:14:51ID:???というかそんな面倒なことで鯖互換とか考えるくらいなら
相対で書けばいいじゃないか
アプローチが間違ってない?
0263nobodyさん
2005/11/09(水) 02:27:31ID:???>/usr/local/public_html/
>の部分が一般的には違うので
環境に依存する部分だけ設定ファイルに記述して
必ずそれをincludeしたら?
0264nobodyさん
2005/11/09(水) 02:32:23ID:???define("MY_APP_HOME","/usr/local/public_html/"); として、
MY_APP_HOME . 'pic/sample.jpg' のように使うとか。
0265nobodyさん
2005/11/09(水) 02:58:37ID:???echo "<img src=\"".htmlpath(getcwd())."/hoge.jpg">;
function htmlpath($relative_path) {
$realpath=realpath($relative_path);
$htmlpath=str_replace($_SERVER['DOCUMENT_ROOT'],'',$realpath);
return $htmlpath;
}
0266nobodyさん
2005/11/09(水) 03:16:36ID:???hoge.jpgがphpと同じ場所かそれ以下にあればそれでいいけど、そうじゃない場合は困るね
ていうかそこまで手間かけるなら>>262だと思う
0267265
2005/11/09(水) 03:17:02ID:???htmlpath(getcwd()) getcwd()は不要だた。"./"でおk
それと
>/usr/local/public_html/
>の部分が一般的には違うので、その環境に依存する違いをどう吸収させようか
が気になったので一言
ブラウザからはDocumentRoot以上は見えないのでブラウザにとって / が一番上=DocumentRoot
ブラウザの/pic/hoge.jpg = サーバの/usr/local/public_html/pic/hoge.jpgだから
DocumentRoot以下を同じ構成にしておけば問題ない。
0268265
2005/11/09(水) 03:20:06ID:???/usr/local/public_html/が本番、テスト機で違うからということと
画像はサーバの絶対パスがわかってるから問題ないんじゃね?
0269nobodyさん
2005/11/09(水) 03:27:14ID:???つか俺この質問どこかで見たことあるぞ?
0270nobodyさん
2005/11/09(水) 03:29:57ID:???つか画像をphpで処理するわけでもないのに絶対パス指定する意味が全然分らん
>>257が激しく勘違いしてるとしか思えない
0271nobodyさん
2005/11/09(水) 03:44:14ID:???DocumentRoot以下の構造は同じってことだろ
なんでこんな面倒くさい話になってるの?
0272265
2005/11/09(水) 04:18:19ID:???<丶`∀´><asahi-netとキムチは寄生虫ニダ
0273257
2005/11/09(水) 14:16:28ID:???> 相対で書けばいいじゃないか
> アプローチが間違ってない?
PHPのスクリプトとjpegファイルの場所が全く違うものでして
その違いを吸収させるために楽な絶対パスを使ってきました。
でも最終的にブラウザに表示するには相対パスでやりくり
したほうが楽そうですね。
相対パスで記述できないか見直してみます。
0274nobodyさん
2005/11/09(水) 14:32:37ID:???例えば
http://hoge1.com/img/image.jpg も
http://hoge2.com/img/image.jpg も
各鯖内のhtmlで<img src="/img/image.jpg">と記述すれば表示できる。
DocumentRoot以下を絶対パスで表記してるからね。
ローカルの絶対パスなんて使う余地すらないんだけど、
phpの中で加工でもしてるの?
■ このスレッドは過去ログ倉庫に格納されています