1 :
nobodyさん :
04/02/07 23:10 ID:51P8HEN4
7 :
nobodyさん :04/02/08 01:06 ID:FOP948Uy
<?php header("Content-type: text/xml"); echo <<<__END__ <?xml version="1.0" encoding="UTF-8" ?> <message>こんにちは!</message> __END__; ?> このようなPHPをIE6.0で表示させて、リロードボタンを何度も連打すると 3回に1回ほどエラーが表示されたりします。Mozillaではこのような症状は 出ません。なぜなんでしょう???
>>7 php,WebサーバーのOSなどの環境を書いてください。
9 :
nobodyさん :04/02/08 01:24 ID:FOP948Uy
Apache/2.0.47 (Win32) PHP/4.3.3 です。
>>7 エラーって何のエラーよ
ブラウザのXMLパーサのエラー?それともPHPのエラー?
パーサのエラーです。XSLは使ってないのに以下のエラーが出ます。
XML ページを表示できません
XSL スタイル シートを使用した XML 入力は表示できません。エラーを訂正してください。 [更新] ボタンをクリックするか、または後でやり直してください。
--------------------------------------------------------------------------------
テキストの内容に無効な文字が見つかりました。リソース '
http://localhost/XML/hello.php ' の実行エラーです。ライン 4、位置 10
<message>
ファイルはEUC-JPでしたが、文字コードが原因ということがわかりました。 mb_http_output("UTF-8"); で解決しました! ありがとうございました。
>>11 うちのAnHTTPd1.42k/php4.3.4の環境でShift_JISで保存した場合は、
XML ページを表示できません
XSL スタイル シートを使用した XML 入力は表示できません。エラーを訂正してください。 [更新] ボタンをクリックするか、または後でやり直してください。
--------------------------------------------------------------------------------
テキストの内容に無効な文字が見つかりました。リソース '
http://localhost/php/a.php ' の実行エラーです。ライン 3、位置 10
<message>
というエラーでした。
UTF-8で保存した場合は、
XML ページを表示できません
XSL スタイル シートを使用した XML 入力は表示できません。エラーを訂正してください。 [更新] ボタンをクリックするか、または後でやり直してください。
--------------------------------------------------------------------------------
XML ドキュメント内では最上位の要素に限り、使用できます。リソース '
http://localhost/php/a.php ' の実行エラーです。ライン 2、位置 2
<b>Warning</b>: Cannot modify header information - headers already sent by (output started at d:\httpd\user\php\public_html\a.php:1) in <b>d:\httpd\user\php\public_html\a.php</b> on line <b>2</b><br />
-^
というエラーでした。
何度かリロードすると、50回に1回ぐらい正常に表示されました。
15 :
11 :04/02/08 03:24 ID:???
>>12 多分前者のエラーはXMLで宣言したエンコード形式(UTF-8)をUAが認識する前に、
PHPの出力エンコード形式(うちはEUC-JP)をUAが認識した結果エラーになるんじゃないかと
考えました。
mb_http_output("UTF-8");でPHPの出力をXMLにあわせるか、
<xml encoding="EUC-JP" ?>でPHPの出力に合わせる方法でもうまくいきました。
16 :
11 :04/02/08 03:25 ID:???
17 :
nobodyさん :04/02/08 16:20 ID:77WdReT/
19 :
17 :04/02/08 16:36 ID:???
寂しいレスだ。。
しつこいぐらい既出の質問をするからだ
21 :
17 :04/02/08 18:06 ID:???
もう一個質問してもいい?
スルーされないだけマシと思え。
23 :
17 :04/02/08 21:47 ID:???
「ディズニーランド」をGoogleで検索すると 暗号化されてURLの一部になりますが、 この暗号化と同じ仕組みの関数を作りたいです。
>>23 別に暗号化されているわけではないってYO。
urlencode()
Pear_Auth を使って認証したいんですが、うまく認証してくれないみたいです。 require "Auth.php"; $params = array( "dsn" => "pgsql://username:password@localhost/mydb", "table" => "userlist", "usernamecol" => "account", "passwordcol" => "passwd", "cryptType" => "md5" ); $auth = new Auth("DB", $params, "loginFunction"); $auth->start(); # 認証開始 if ($auth->getAuth()) { echo "Success"; } else { echo "Fails"; } 何度やっても Fails が表示されるんですけど、原因が分かりません。とりあえず Auth.php からのエラーメッセージを取得したいんですけどどうしたらいいですか? 今の段階だと何が起こってるのかすら把握できないです。
xslt変換するときにXMLデータ内に<ruby>が含まれてるとエラーで 止まるみたいなんだけどSablotronて<ruby>内では言語の方のRubyが 実行される、とかあるの?ruby要素使えないYO!
27 :
nobodyさん :04/02/08 23:34 ID:TeCxfeQP
28 :
991 :04/02/08 23:36 ID:???
29 :
nobodyさん :04/02/09 00:52 ID:WNqOFc1P
>>28 一応確認。rtrim($value)はしてみた?
ファイルポインタ・ファイルハンドルの概念がいまいちわかりません。 以下のコードで「書込失敗 2」となるときはあり得るのでしょうか? $fp = @fopen( $filename, "r+" ) or die( "書込失敗 1" ); if( $fp ){ @fputs(); @fclose(); }else{ die( "書込失敗 2" ); }
その失敗1と失敗2は同じだから片方だけにしとけ。
>>32 失敗1と2は確かに同じだけど、fputsを失敗したときの対処が...
といってみるテスト。
レンタルサーバーの制限により PHPをCGIモードで使ってます。 PHPから出力したソースを見ると PHP出力部分の先頭に #!/usr/local/bin/php4 が印字されてしまいます。 どうしてでしょうか? 叉どうすれば回避できますか?
もしかして #!/usr/local/bin/php4 を書かないでも動くんじゃない。
おそらく、サーバから見える位置(cgi-bin等)に phpの実行ファイルがあって、拡張子に関連付けして そのphpをファイル名付きで実行する設定になってるのでは それだと、cgiモードでも先頭の#!/.. は無くても動く
39 :
36 :04/02/09 17:31 ID:???
自己解決しました。 本体のスクリプトにインクルードされるファイルの先頭に #!/usr/local/bin/php4 が書いてあって それが そのまま文字列として出力されているのが判明しました。 皆さまありがとうございました。
40 :
991 :04/02/09 17:33 ID:???
>>29 >>31 rtrim($value);でもchopでもソース変わりませんでした・・・・
41 :
991 :04/02/09 17:37 ID:???
あ、できました・・・・ chop($value); だけやってました。 chop($value)をechoに書くか $value=chop($value);ってしないとだめなんですね・・
質問です。 下記のイメージのような 複数の戻り値を返す自作関数はどういう風に書けばいいのですか? (戻り値を受け取る変数側の書き方もよろしくお願いします。) function returnmulti($a , $b , $C){ return a; return b; return C; } $hoge = returnmulti($a , $b , $C);
>>42 function foo(){ return array(10, 20, 30); }
list($a, $b, $c) = foo(); // 受取側
46 :
42 :04/02/09 18:39 ID:???
バッチシわかりました。サンクスです。
うは
48 :
25 :04/02/09 19:34 ID:???
ほんとにAuthの使い方分からないんですけど、何かヒントもらえませんか? スクリプトをいじってるうちに 404 Not Found が表示されたりすごい謎な 現象が起きてるんですけど。。Apacheのログにもその時のアクセスログが 残ってません。
50 :
nobodyさん :04/02/09 21:21 ID:PxmqRGij
RSS読むPHPサンプルスクリプトってどっかにない?
>>50 Pear_XML_RSS をつかったサンプルならCVSリポジトリにあるけど。
require "XML/RSS.php";
$r =& new XML_RSS("test.rss");
$r->parse();
foreach ($r->getItems() as $value) {
echo $value['title'] . ": " . $value['link'] . "\n";
}
こんな感じでパースした結果を配列で受け取れるみたいだからあとは
どうにでも出来るんじゃない?使ったことないから実際に動くかは不明。
53 :
50 :04/02/09 22:10 ID:iTx5KfOx
>>51-52 Pearって全く意味わかってなかったんだけど、今見て理解できました。
ありがとうございました。
結城さんの方のも簡単でよさそうですね。
ありがとうございました。
mb_http_output('EUC'); mb_internal_encoding('EUC'); $tmp = mb_convert_encoding($in_word, "UTF-8", "EUC-JP"); $out_word = mb_convert_encoding($tmp, "EUC-JP", "UTF-8"); 上のスクリプトで大体の文字はきちんと変換できるのですが "鳥"とか"瀬"とかがうまく変換できません。 どうしてでしょうか? 環境はApache2.0+PHP4.3.4です
55 :
nobodyさん :04/02/10 00:05 ID:cRFRp3Th
Perlでの $left =~ s|/||; はPHPではどう書いたらいいんでしょうか
$left = preg_replace("/\//","",$left);
57 :
55 :04/02/10 00:19 ID:cRFRp3Th
その場合だと/がいくつも入力された場合すべてにヒットしますよね? 最初に現れた所のみを変換したいんですが、そういうときにはどうしたらいいんでしょうか。 ^を使うらしいのですが良くわからなくて
>>57 それは始まりの文字だろ・・・
最初に現れたのを変換ってのは、正規表現のパターンマッチであったような
置換回数の指定だったら、 $left = preg_replace("/\//","",$left, 1);
単にでは? $left = preg_replace("|^/|","",$left);
61 :
nobodyさん :04/02/10 04:42 ID:Qp1GaFEv
ファイルを開いてなんか書く というのを system("echo $text > $file"); とやってるんだけど、もうちっとスマートに書けないかな。 シェル使えない環境だとまずいし。
>>60 最初に現れた所のみ変換って言ってるし、
>>55 通りに解釈するなら ^ は違うんじゃない?
>>61 ファイル開いて fopen, 何か書く fwrite
$left = "/aka"; $left = preg_replace("|^/|","b",$left); echo $left;
>>63 baka
だからぁ、
>>55 が言っている Perl での $left =~ s|/||; は最初に現れた / のみを置換。
行頭の / を置換だったら $left =~ s|^/||;
>65 fputs この関数はfwrite()のエイリアスです。
マニュアル眺めてたら、こんな関数が ... (PHP 5 CVS only) file_put_contents?--?文字列をファイルに書き込む int file_put_contents ( string filename, string data [, int flags [, resource context]])
>>67 file_get_contents -- ファイルの内容を全て文字列に読み込む
の逆の関数だね。でも書く方(file_put_〜)はPHP5以降にしかない。
だから、普通にfopen()〜fwrite()〜close()するしかない。
file()の逆も無かったなぁ・・・。
69 :
nobodyさん :04/02/10 09:52 ID:8azjFNfV
質問させてください。 ・画面Aから新しいウィンドウで画面Bを開く ・画面Bでデータを選択すると画面Aに反映される。 ということを行いたいのですが、PHPでは可能でしょうか?
>>69 PHPはサーバサイドで動作するスクリプトですので,画面Aと画面B(どちらもクライアント)
間のやりとりの内容を知ることはできません。
そういうのはJavaScriptなどクライアントサイドで動くスクリプトでやりましょう。
71 :
nobodyさん :04/02/10 10:40 ID:0wXG4uwX
リモートファイルの画像サイズを知る方法はありますか? 今のところ、EOFまでfreed()するぐらいしか思いつかないのですが。。。 freed()自体をカウントしたり、ftel()したり。
>>71 int filesize ( string filename)
>>70 それはPHP-GTKでプログラム書いてる俺に対する挑戦ですか(笑
バッチリ、PHPで可能。JavaScript(JScriptも同様)もサーバサイドでも動くし、
今やどんな言語も用途が広がっている。
しかし、正式に1.0が出て結構経つのにちっとも盛り上がらんな>PHP-GTK
75 :
69 :04/02/10 11:49 ID:???
>>73 PHPでサブウインドウから・・・ってのはGTK関係無しにPHPでできる。
って認識でいいですか?
ググってみたけどいいものが見つかりません。
なんかいいページ知ってたら教えて下さい。
LAMP環境での開発って、 文字コードはどうしてるんですか? 一括して、EUCですか? 文字化けとか、検索ひっからないとかの問題が 起こらないのにしたいのですが、ご教授ください。
77 :
70 :04/02/10 12:46 ID:???
>>73 んなこた知ってるけど、初心者向けの回答としてはあれくらいで良いでしょ。
>>76 EUC-JP で統一するのが一番トラブルが少ないね。
ユーザは SJIS 利用が多いから半角カナや機種依存文字に注意する必要があるけど。
ここら辺の情報って散在していてるか、辺に詳しすぎるページしかなくて悩むよね。
>>78 即レスどうもです。
色々調べても、結局のどころ無難なのが何なのかわかりませんよね。
何も気にしないでWindowsで開発するとSJISになるし・・・。
とりあえずEUC-JPが一番ですか。
前に2文字までの文字列が化けたことがあったので、少し躊躇してます。
>>80 ,81
たぶん、'auto'で失敗していたと思います。
mb_detect_order()は頭になかったので、解決してないままです・・・。
それにしてもリンクまで張ってもらえて、助かりました。
問題は起こるのかもしれませんが、EUC-JPにしようと思います。
83 :
71 :04/02/10 14:59 ID:0wXG4uwX
85 :
71 :04/02/10 19:43 ID:0wXG4uwX
>>84 ご教授ありがとうございます。
しかしワンモアヒント・プリーズ!
HEADメソッドはheader()のことではないですよね?
いろいろ調べて見たんですが、ソケットを使うんでしょうか?
(どうやって使うのかは分からないのですが。。。)
86 :
nobodyさん :04/02/10 20:34 ID:2ejXuIg/
PHPで自分のサイト内のとあるHTML内の記事を検索して結果に出す スクリプトってありませんか?
>>85 HTTPレスポンスヘッダのContent-Lengthフィールドの事じゃない?
HEADでリクエストすれば本文は受信しなくて済むから帯域が節約できる。
ただ、MUSTじゃないから資源によっては取得できない(PHPとかは最後
まで本文のサイズが分からないけど先にレスポンスヘッダ送らないといけな
いから普通は付いてこない)けど画像は大丈夫だと思う。
Pearの
HTTP::headつかうか 、
http://www.arielworks.net/articles/2003/1220a/ これを適当に改造するかすれば良いと思う。
自作の方はレスポンスヘッダの最後の改行削ってないから返ってくる配列
にゴミ付いてくるね・・・。適当にtrim()したほうがイイかも。
explodeとかで改行とかで区切ったりするより、 serializeって効率いいんですか? 使いやすいだけ?
>>89 用途の違うものを比べてどちらが効率いいとか言われてもな。
複数のデータをまとめて送りたいということか?
serializeを使えば連想配列をそのまま遅れるから便利は便利だな。
index.php?a ?以降にaがあったときに表示するにはどうすればいいですか? Perlで言う$ENV['QUERY_STRING']なんですけど、 PHPでそのようなのが見つからず index.php?mode=a として if($_REQUEST['mode']=="a" とやってる状況です。 よろしくお願いします。
$_SERVER['QUERY_STRING']
前スレdat落ちしてるやん
95 :
71 :04/02/11 13:54 ID:???
後藤って誰のことだ? 元ネタとかあったらキボン
( ´∀`) 誰も書いてないよ
>>76 内部エンコーディングとプログラムはEUC-JP
出力はShift-JIS がいいと思うんだがどう?
Winや携帯からのアクセスには最適だし、UNIX系のブラウザも大抵Shift-JISには
対応してるよ。
get_element_by_id()がまともに動いている方、いらっしゃいましたら挙手願います。 メソッドは存在してるのにノードが取得できないのはなぜ・・・。
>>104 DTDでID型定義しないと動かないよ。DOMの仕様書嫁
PHPのマニアルって、ダウンロードできないんですか? いちいち、サイトにアクセスして見に行くのに疲れましたよ・・・
ダウンロード出来るが。 本家の、documentation→downloads
109 :
108 :04/02/12 01:51 ID:???
qあswでfrtgyふじこlp;@:「
112 :
84 :04/02/12 09:31 ID:???
>しかしワンモアヒント・プリーズ!
>>85 <?php
require_once('HTTP/Request.php');
$a = &new HTTP_Request('
http://jp2.php.net/images/php.gif ');
$a->setMethod(HTTP_REQUEST_METHOD_HEAD);
$a->sendRequest();
$header_info = $a->getResponseHeader();
echo 'File size is ' . $header_info['content-length'] . " bytes.\n";
?>
こんだけのこと
マニュアルの 「はじめに」「言語リファレンス」「機能」 位は読んでほしいと思う今日この頃
114 :
nobodyさん :04/02/12 15:55 ID:2qhlO1k3
初歩的な質問ですません。 main.phpでsub.phpをrequireします。 で、sub.php内に定義してある関数を使いたいんですが、どうやって呼べばいいのでしょうか。 関数が function test(){ } こんなだったら。
こんな感じ。 main.php------------ <? require 'sub.php'; //ここでtestを呼びたい。 ?> sub.php------------ <? function test(){ print "test関数だよ"; } ?>
>>108 ダウンロードできましたね。スマソ。
でも、これ、文字化けして読めません。
「プリンターは好意的である。」
って、どうゆう意味なんでしょ???
>>116 いや、日本ユーザー会のほうからダウンロードできないから
分かりずらいと思うよ。
どのファイルをダウンロードして、何を使って閲覧してるか
とかの環境書いてくれないと答えようがない。うちの環境で
は普通に読める。タグの閉じカッコが全部行頭にあって気持ち
悪いけど。
>「プリンターは好意的である。」 Printer Friendly=印刷向け 英語版のマニュアルも読もうぜ
>>114 一回くらい試してから質問しろ。
試したことがあるなら,何をやってどう期待どおりにならないのか端折らずに提示しろ。
main.php------------
<?
require 'sub.php';
//ここでtestを呼ぶYO!
test();
?>
>>114 これで満足か?
※※ 2ちゃんねる緊急アンケート! ※※
以下のスレにてアンケートにお答えください。
http://book.2ch.net/test/read.cgi/ehon/1076577467/ 1) 好きな絵本の題名を1つだけ教えてください。(例:てぶくろを買いに)
2) どんなところが好きですか?(例:子ギツネがかわいい。店の人間が優しくて驚いた)
3) どの板からきましたか?(例:このアンケートが貼られていたスレの URL をお知らせください)
ご協力ありがとうございました。
発表は発表をもって代えさせていただきます。
発起人:絵本明
123 :
117 :04/02/12 22:46 ID:???
ダウンロードしたファイルは、GZファイルって 書いてあります。 ウインドウズを使っていまして、EKエディターを 使ってみたら文字化けしてました。 IEは起動しませんでした。
>>123 知らんことは別に構わんが、ちっとは調べるってことしろ。
Windowsでもvector行けば処理できるソフトぐらい転がってる。
>>124 つーことは、117はgzを直接エディタで開いたってわけかw
126 :
117 :04/02/13 00:04 ID:???
あ、なんかまずかったですか? ビクターに早速行ってきます。
変数aと変数bの要素を入れ替えたいのですが、やっぱりtempとかを作って $temp = $a; $a = $b; $b = $temp; とやる以外方法はないのでしょうか?
>>127 あまりうれしくないが。
<?php
$a = '1';
$b = '2';
print '$a => ' . "$a\n";
print '$b => ' . "$b\n";
list($b, $a) = array($a, $b);
print '$a => ' . "$a\n";
print '$b => ' . "$b\n";
?>
マニアックな関数だな(w
if(!$_GET['mail']){ $buf = _sendcmd("USER $user"); $buf = _sendcmd("PASS $pass"); } if(!$_GET['mail']){の中に $buf = _sendcmd("USER $user"); $buf = _sendcmd("PASS $pass"); を書くと Call to undefined functionで$buf = _sendcmd("USER $user");をエラー指摘されます。 未定義の関数を使おうとしているという意味のようですがもしかするとif()の中には _sendcmdを書いても使うことができないということでしょうか? サーバーは対応してます。
132 :
nobodyさん :04/02/13 02:36 ID:pB7L1c91
fackingjapくらい分かるよ馬鹿野郎
>>129 マニュアルに載ってないよ(ぉ
定義するなら、こんな感じかな。
function var_swap(&$a, &$b){ list($a,$b) = array($b,$a); }
...で何処の関数なの?>var_swap
自作関数かよ
>>123 すまんがワラタ。
アホですかアンタは。。
大丈夫さ。俺も一年前はtar.gzなんて知らなかった。
cgiのエキストラパス的なもの無いですか?
>>131 その_sendcmd関数は他の部分で使うとちゃんと動くの?
ifブロックの外で、_sendcmd("USER hanyan"); とすると
ちゃんと動いているの?
>>137 PATH_INFOかな。
GIF画像の処理(リサイズとか)をしたいんですが、PHP4.3.4バンドルのGD2.0.15ではGIFを扱えないと聞きました。 PHPに連携して使えるイメージ処理のライブラリがあったら紹介してもらえないでしょうか? シェアウェアでも市販のパッケージでもなんでも構いません。お願いします。
imagemagickってのがあったので、これ使ってみます
141 :
123 :04/02/13 15:10 ID:???
無事解凍できました(^_^;) どばっとファイルが出てきたけど・・・
初心者ですが質問させてください。 PHPでフォームを作るとボタンの下に無駄な改行ができますが あれどうにかならないのでしょうか?
何とかなる
>>142 それは PHP ではなくブラウザの問題じゃない?
PHP ではなく、HTML でそのフォームを作ってごらん。
145 :
nobodyさん :04/02/13 18:14 ID:xKncvR4W
以下を実行するとstrposはFALSEを返します。 どこが間違っているのでしょうか。 $mystring = 'zh-CN'; $findme = 'zh'; $pos = strpos($mystring, $findme);
>>142 HTMLをまったく意識していないなって...
チョト(・∀・)カコイイ
>>145 FALSEを返しているのではなくて 0 を返している。
マニュアルに対策もずばり書いてあったはず。
148 :
145 :04/02/13 18:41 ID:xKncvR4W
すいません、対策とは、===演算子を使うという事でしょうか。 $mystring = 'zh-CN'; $findme = 'zh'; $pos = strpos($mystring, $findme); if ($pos === False) { echo "The string '$findme' was not found in the string '$mystring'"; } else { echo "The string '$findme' was found in the string '$mystring'"; echo " and exists at position $pos<br>"; } これを実行するとTRUEが返っているようなのですが、 $findme = 'as'; とすると The string 'as' was found in the string 'zh-CN' and exists at position 5 となります。 私はなんか、とっても大きな勘違いをしているみたいです。
149 :
145 :04/02/13 18:48 ID:xKncvR4W
↑ すいません、やっぱり勘違いしてそうです。 頭冷やして、出なおしてきます。
foreach($temp as $value){
$value=chop($value);
if(url_link($value,$thread_link)==1) continue;
if(mbereg("赤",$value)){
echo "<font color=\"red\">".$value."<br>\n";
}elseif(mbereg("青",$value)){
echo "<font color=\"blue\">".$value."<br>\n";
}else{
echo $value."<br>\n";
}
}
function url_link($value,$i){
if(ereg("
http:// ", $value)){
echo "<a href=\"".$value."\">".$value."</a><br>\n";
return(1);
}
return;
}
配列$tempには、URLの無い行、ある行、の2種類がある文字列が入っています。
↓こんな感じです。
ttp://ex.com ajdsaabdaoudba
ttp://ex2.com あいうえお
(上は、リンクを防ぐためにhをのけています。実際の文章はhありです。)
そして、その文字列1行ごとに
・
http://があればURLをリンクする ・「赤」という文字が入っていればその行を赤く表示する
・「青」〃 青〃
・そうでなければそのまま表示する、という構造です。
今回、URLリンクだけを関数化しています。
そこで質問なのですが、
$valueを評価して、
http://があれば表示 、1を返す。
それを、ifで評価して、1なら次の行(メインルーチンでのelse{echo $value;}を防ぐため)
というのは一般的でない気がするのですが、どうでしょうか?
function url_link($value,$i){
if(ereg("
http:// ", $value)){
echo "<a href=\"".$value."\">".$value."</a><br>\n";
}else{
echo $value."<br>\n";
}
return;
}
が一般的だと思うのですが、この場合は、「赤」「青」を含んでいるかを評価するのが、メインルーチン内なので上のようになってしまいました。
やはり、他人が見たら、どういう構造か理解しにくいでしょうか?
>>152 > やはり、他人が見たら、どういう構造か理解しにくいでしょうか?
最後の行で、何か聞きたいのかわからなくなった。
とりあえず、url_link()内やifブロック内でechoするのをやめた方がよさそげ。
foreachブロックの最後でecho汁。
foreach($temp as $value){
$value=chop($value);
if($auto_link==1) url_link($value);
if(mbereg("赤",$value)) $value="<font color=\"red\">".$value."<br>";
elseif(mbereg("青",$value))$value="<font color=\"blue\">".$value."<br>";
echo $value."<br>\n";
}
function url_link($value){
global $value;
if(ereg("
http:// ", $value)){
$value="<a href=\"".$value."\">".$value."</a>";
}
return;
}
こんな感じでいいでしょうか?
グローバルにするしか思いつかない・・・
155 :
154 :04/02/13 20:22 ID:???
すっかりボケてました。普通にリターンしたらいいですよね・・・
foreach($temp as $value){
$value=chop($value);
if($auto_link==1) $value=url_link($value);
if(mbereg("赤",$value)) $value="<font color=\"red\">".$value."<br>";
elseif(mbereg("青",$value))$value="<font color=\"blue\">".$value."<br>";
echo $value."<br>\n";
}
function url_link($value){
global $value;
if(ereg("
http:// ", $value)){
$value="<a href=\"".$value."\">".$value."</a>";
}
return($value);
}
>>155 function url_link($value)
としてるんだから
global $value
する意味ないじゃん
>>156 ネタですか・・・
代入された$valueはどのスコープで有効か考えてね
>>157 どう考えてもグローバルはいらないよ
あなたこそネタですか?
159 :
156 :04/02/13 23:20 ID:???
自分ならこう書きます
<?
$auto_link=1;
$temp=array("
http://kfdfd.fdfd ","wewewew");
foreach($temp as $value){
$value=chop($value);
if($auto_link==1) $value=url_link($value);
if(mbereg("赤",$value)) $value="<font color=\"red\">".$value."<br>";
elseif(mbereg("青",$value))$value="<font color=\"blue\">".$value."<br>";
echo $value."<br>\n";
}
function url_link($value){
global $value;
if(ereg("
http:// ", $value)){
$value="<a href=\"".$value."\">".$value."</a>";
}
return($value);
}
?>
160 :
156 :04/02/13 23:21 ID:???
今の訂正
<?
$auto_link=1;
$temp=array("
http://kfdfd.fdfd ","wewewew赤","ahaha青");
foreach($temp as $value){
$value=chop($value);
if($auto_link) $value=url_link($value);
echo "$value<br>";
}
function url_link($value){
if(ereg("
http:// ", $value)){$value="<a href=$value>$value</a>";}
if(mbereg("赤",$value)) $value="<font color=red>$value<br>";
if(mbereg("青",$value))$value="<font color=blue>$value<br>";
return($value);
}
?>
>>160 元質がurl_link゛だけ゛関数にしたのはそれなりに意味があるかもよ。
162 :
157 :04/02/13 23:31 ID:???
163 :
156 :04/02/13 23:35 ID:???
>>161 if(ereg("
http:// ", $value)){$value="<a href=$value>$value</a>";}
だけ使うことが多いってことなのね
ただ構造がわかりすいように書いたつもりでした
164 :
161 :04/02/14 00:26 ID:???
>>163 うーん、でもurl_link側に列挙していくというのもなぁ。
ここはヤパーリ、url_linkをクラス化して、色付けはurl_linkをextends...
色もarray("red"=>"赤","blue"=>"青"....) なんてなー。
今更fontタグを使っている時点で何だが、属性値はダブルクォートで括ってほしいな。
165 :
nobodyさん :04/02/14 01:12 ID:AFW0aXeo
すべての文字列に*マッチしない*正規表現はどうすればいいでしょうか $reg = "hoge|foo"; //正規表現パターンはファイルから読み込む $str = "hoogefohoge"; if(ereg($reg,$str)){ //処理 } $reg=""の場合はエラーがでます。$regは可変なので!ereg()は使いたくありません このような処理の過程でif内を処理させないためにはどのような正規表現パターンにすればいいでしょうか
>>165 マッチしない正規表現はおいといて、
if($reg && ereg($reg,$str)){....
でお望みの動作になるかと。
>>166 なるほど、$regが空の場合eregを評価させなければいいのか
でも、そうやると$reg="0"が正しく動かないので
if($reg !== "" and ereg($reg, $str)){...
とすることで解決しました。ありがとうございました。
ところで、マッチしない正規表現ってあるんですか?
>167 ^
169 :
71 :04/02/14 10:15 ID:???
>>84 遅レスだけどありがとう!
そのようにやって、上手くできました。
あと、content-lengthはサーバによって大文字小文字、異なるみたいなので、
どっちにも対応できるようそこだけ付け加えました。
携帯アプリからアクセスして、ネット画像をgetとするためのコードを書いているのですが
パケット・ロスというか、画像の破損が多くて参っています。
どうも、特定の画像の時にのみそれが起きやすく、
http://www.google.co.jp/intl/ja_jp/images/logo.gif なんかは、毎回ダウンロードしたbyte数が異なる。
8754byteなのに、それより多い場合も少ない場合もある。
jpgなんかでは、ほとんど破損がないんですが。。。
携帯は10kまでしか通信できないので、10kごとにデータを渡しているんですが、
以下のソースでおかしいトコを誰か教えて!
170 :
71 :04/02/14 10:16 ID:eodqp/4E
// $url : 画像のアドレス // $img : 画像データ格納 // $op: 10240*opバイトから10240バイトの画像の一部 $fd = fopen($url,'r'); if($fd == FALSE){ $img = "ERR:can't open file\n"; } else{ $i = 0; while(!feof($fd)){ $temp[$i] = @fread($fd,10240); $i++; } if(is_array($temp)){ if(array_key_exists($op,$temp)){ $img = $temp[$op]; } else{ $img = "EOF\n"; } } else{ $img = "FAIL:can't read file"; } } print($img);
whileの中でprintしなきゃbyteごとに読んでる意味ない気がするが・・・ 全体的に再考の余地あり。エレガントじゃない
172 :
nobodyさん :04/02/14 11:35 ID:SSqz50l2
よく使うオリジナルな関数は original.inc と関数だけをファイルに保存して classで使いまわしています (例) class ori { require("original.inc"); } 特のデーターベースのコネクト関係をオリジナルに加工して関数化しています 自分で考えたやり方ですが 変でしょうか?
>>71 =169=170
ひまだから付き合ってやるか。
文章がいまいちどころか大部理解しかねるが、
iアプリ用に画像を取得してデータサイズを10KB以内にして転送して
くれるGatewayを作りたいのか? 100KBの画像だと10分割で10回外部
リンクへアクセスして毎回9割のデータを捨ててる様にみえる。
悪質なプログラムだな。Gatewayサーバでキャッシュして外に迷惑
かからないようにしたほうがええよ。
サンプルスクリプトを載せるけどキャッシュは自分で実装してな。
PEARにあるCacheクラス使えば簡単だろ。
<?php require_once ('HTTP/Request.php'); require_once ('Stream/Var.php'); stream_wrapper_register('var', 'Stream_Var'); $filebuffer = ''; function devide_read($url, $serial, $blocksize = 32) { global $filebuffer; $work_url = $url; $url_info = parse_url($url); if ($url_info['scheme'] == 'http') { $req = & new HTTP_Request($url); $req->sendRequest(); $filebuffer = $req->getResponseBody(); $work_url = 'var://GLOBALS/filebuffer'; }
if ($fd = fopen($work_url, 'r')) {
fseek($fd, 0, SEEK_END);
$size = ftell($fd);
$offset = $serial * $blocksize;
if ($offset < $size) {
fseek($fd, $offset);
$retval = fread($fd, $blocksize);
} else {
$retval = "serial $serial was out of range.\n";
}
fclose($fd);
} else {
$retval = "Can't open file : $url\n";
}
return $retval;
}
echo devide_read('
http://example.com/images/foo.gif ', 0, 10240);
?>
なんとなく
>>170 の書込みを見るとpearも知らないように思えるけど。
sort($arr, SORT_STRING); すると0-9A-Za-zの順でソートされるのですが、大文字小文字を区別しないでソートするのは不可能ですか?
>>177 そうなんかね。おれ84だけど、そこで、PEARのHTTP_Requestの
例を紹介したから、普通のやつだったら、
「お、スクリプトの記述を楽にしてくれるライブラリがあるのか。」と
思ってPEARにどんなもんがあるか眺めるぐらいはするんじゃないかと
期待してたんだが、そういうもんじゃないのか。
177の言う通りだったら悲しくはあるが、まぁ所詮勝手なお節介焼いただ
けだから相手がどう受け止めているのかはどうでもいいや。
>>178 自然順アルゴリズムを用いる関数が用意してあるんだけど
節穴さんですか。
>>178 natcasesort、
またはusortを使って自分で実装。
〃∩ ∧_∧
⊂⌒( ´・ω・)くぜんぶマニュアルに書いてあったでつ
`ヽ_っ⌒/⌒c
182 :
178 :04/02/14 18:21 ID:???
すいません、キーを大文字小文字区別せずにソートしたいのですが、 ソート方法はnatcasesortでよかったのですが、これをキー順で並び替るためには uksortで実装でしょうか?
183 :
178 :04/02/14 18:33 ID:???
function kcomp($x,$y) { if ( $x == $y ) return 0; return ( strtolower($x) < strtolower($y) ) ? -1 : 1; } uksort($arr, 'kcomp'); でできました。どうもでした。
すいません、質問させてください。 れんたるサーバーでphp.iniファイルをアップすると ユーザー各自で設定が変えられるらしいのですがphp.iniファイルの中身はどう書いたらいいのでしょうか? 内容はsafe_modeをonにしたいだけです(画像アップロードがやりたいので・・・ ご教授よろしくお願いしますm(_ _)m
>>185 いえ、.htaccessではなく、php.iniファイルです
>>186 その鯖屋に聞くかその鯖を教えてくれた方がいいかもしれない。
まさか自由度の広い(自分でインストールできる)専用鯖とかじゃないよね?
>>187 違います
php.iniっていってるじゃないですか!
もう!このわからずや!
だまれバカ
ある要素タグからだけをXMLから拾うにはどうすればいいの? ハンドラ関数を容易して見つかったら呼び出すでいいのかもしれないけど、 以下の関数の使い方がいまいちよくわかんなくて詰まってます。 xml_set_default_handler xml_set_element_handler
またMONか!
193 :
nobodyさん :04/02/14 23:15 ID:6V3z0i2n
他にドコで質問していいのか分からないので教えてくらはい。 winでコーディングして、リモートブラウザに送ってデバックできるような開発環境ないっすかね? 今はDreamweaverMX使ってるけど、アレってあくまでHTMLがメインだからPHPに関してはホント、エディタ的な能力しかない。 # ガイシュツとか言わんでください(TT) # 厨房は厨房なりに調べたけど見つけ出せんかったんです
ローカルに鯖立てればいいんじゃないの?
195 :
71 :04/02/14 23:54 ID:???
>>177 ,179
いや、PEARというものは,177氏の発言で知りまひた。
一応、ヘッダについてはもらったヒントから調べて自作して。
Cacheというものに気がつかなかったのは申し訳ない。。。
これからはキッチリ調べてから質問しまふ。
あと、ソースがきちゃないのは勘弁をば。
>>174 ありがとう!
もらったソースから作って、
ちゃんと消化できるようにがんばりまふ。
SHIFT-JIS環境なのですが $str = "ソ\ニン"; echo stripslashes($str); でソニンが表示されないのですがどうしてでしょうか?
>>196 <?php
$str = 'ソニン';
$str =addslashes($str);
echo stripslashes($str);
?>
>>197 つまりどういうことが起こっているんですかね?
$str = "ソ\\ニン";
echo stripslashes($str);
でやると正常動作なんだけど・・・
$str2 = 'ソニン';
$str2 =addslashes($str2);
echo $str2;
これはソ\ニンなんですが、やってることは
$str2 = str_replace("\\","", $str2);
だから
>>196 と同じでおかしくなるはず…。じゃないのですか?
200 :
199 :04/02/15 01:45 ID:???
これはソ\ニンなんですが、やってることは
↓
これはソ\ニンなんですが、
>>197 の最後にやってることは
<? $str1 = 'ソニン'; $str2 = 'ソ\ニン'; $str3 = 'ソ\\ニン'; $str4 = addslashes($str1); echo $str1.'->'.strlen($str1).'->'.stripslashes($str1)."\n"; echo $str2.'->'.strlen($str2).'->'.stripslashes($str2)."\n"; echo $str3.'->'.strlen($str3).'->'.stripslashes($str3)."\n"; echo $str4.'->'.strlen($str4).'->'.stripslashes($str4)."\n"; ?>
ようやく意味がわかりますた。 人生の中でprintデバッグ方法しか取ったことが無かったので、 今日はじめてこのデバッグ方法が完璧じゃないことに気が付きますた。
質問させてください。 画像アップロード掲示板を作ったのですが画像がアップできません ローカルで試したところ何の問題もなくできたのですが サーバーに設置するとできない(TT safe_modeはOff file_uploadsはOnです。 なぜできないのでしょう? どなたか、よろしくおねがいします。
204 :
203 :04/02/15 03:54 ID:???
どうも保存ができていないようです ローカルではできるのに(TT
パーミッシオンン
206 :
203 :04/02/15 05:21 ID:???
できました(^0^ ありがとうございました
質問させてください。 <?php class Model{ var $name; var $speed; function setName($val){ $this->$name = $val; } function setSpeed($val){ $this->$speed = $val; } function getName(){ return $this->$name; } function getSpeed(){ return $this->$speed; } } ?> のように、値を設定する関数と値を得る関数があるだけのクラスなんですが、これをindex.phpから参照すると、 [index.php] -------------- <body> <?php require_once 'Model.php'; $model = new Model(); $model->setName("ほげほげ"); $model->setSpeed(100); $name = $model->getName(); $speed = $model->getSpeed(); print("名前: "); print("$name");print("<br>"); print("スピード: "); print("$speed"); print("<br>"); ?> </body> --------------- 名前: 100 スピード: 100 と表示されてしまいます。なぜこんな表示になってしまうのでしょうか?? どなたか、よろしくおねがいします。
208 :
207 :04/02/15 05:58 ID:???
環境はMacOSX10.3、PHP4.3.4 DETH...
ひょっとして $this->$nameのところを$this->nameにすれば直ったりしませんかそれ。
210 :
207 :04/02/15 06:13 ID:???
>>209 さん
できました。ありがとうございます〜。
…けど、なんでかワカンナイ。
値渡しとか参照渡しとかの違いでつか??
いや、その・・・ <?php class Model{ function setValue($name,$val){ $this->$name = $val; } function getValue($name){ return $this->$name; } } $model = new Model(); $model->setValue('name',"ほげほげ"); $model->setValue('speed',100); $name = $model->getValue('name'); $speed = $model->getValue('speed'); print("名前: "); print("$name");print("<br>"); print("スピード: "); print("$speed"); print("<br>"); ?> こういうことです。
212 :
207 :04/02/15 07:01 ID:???
>>211 さん
あれま、連想配列ってことですか!?
むー、この辺りってPHPのドキュメントに載ってましたっけ?
ともあれ、ありがとうございます。
クラスの属性を指定するときは $class_name->variable_name とします。 variable_nameの前に $ はつきません。 マニュアル読みましょう。
何でphp板てレベル低いんだろ? php歴1年未満の方ばかりなのかな
>>215 PHPがターゲットとする領域がそうだからじゃないですか?
本格的なことをやりたい方はJ2EEにいくんじゃないですかね?
>>216 確かにPHPでの限界を感じてJ2EEで設計する場合も多いが、
ボロボロな設計のJ2EEプロジェクトに関わったことがあるので、
何とも言えん。実際Javaだからといって、低いレベルにおいては違いがない。
「CLASSPATHが〜」なんて何度出てくることやら…
Webアプリを判っていない人も意外に多いしね。ありゃ言語の前に別の知識だから。
入門の手軽さから、PHPの方が「近場に誰にも教わる人のいない」初心者は多いかも。
Javaだと仕事で使う初心者の兵隊は、内部で教育しちゃうので。
(外部に押し付けてるのも多々見られますが)
class HOGE { function hoge( ) { print "hoge"; } } $pHoge; function Get( ) { return $pHoge; } function Init( ) { $pHoge = new HOGE; } Init( ); Get( )->hoge( ); エラーが出て怒られたんだが、 オブジェクトをreturnしてそのまま使えないってこと?
>218 何やってるんだか意味解からん。
> オブジェクトをreturnしてそのまま使えないってこと これは正解。 それ以外に、そのスクリプトには変数のスコープの問題もあるよ。
いや、そもそもクラスの使い方わかってないということを突っ込んで欲しいんだと思う。
こんなに意味不明なコード久しぶりにみて 少しワラタ どう解釈したらこのようなコードが書けるようになるのか あるいみで、天才なのかもしれない。 スコープを勉強してください Init();でインスタンスを作ったつもりだと思うんだが 関数の中ででてきた変数は関数の中でしか使えない。 外に出すにはreturnする必要がある。 同様にGet()のなかに$pHogeがでてきているが、 これについても関数の外で定義した、ふつうの変数を関数の中で使うには 引数にしてわたすか、グローバル変数にするなど、 特定の処理をしておく必要がある。 そのまえにコードの目的自体が意味不明。 class HOGE{ function hoge() { print 'hoge'; } } $pHoge = new HOGE; $pHoge->hoge(); でいいんじゃないだろうか
perlの $str = s/文字/$a+1/e; のようなeオプション(式として評価する)みたいな機能はありますか?
224 :
nobodyさん :04/02/15 17:29 ID:nl9xaZ1k
別サーバのWebページを読み込みたいので、
ひとまずマニュアル通りに作ってみました。
<?php
$fp = fsockopen ("www.php.net" ,80 ,$errno ,$errstr ,30 );
if(!$fp){
echo "$errstr ($errno)<br>\n";
}else{
fputs ($fp ,"GET / HTTP/1.0\r\nHost: www.php.net\r\n\r\n" );
while (!feof ($fp )) {
echo fgets ($fp ,128 );
}
fclose ($fp );
}
?>
これだと確かに
http://www.php.net/が読み込まれるのですが 、
トップページ以外(例えば
http://www.php.net/hoge/hoge.phpみたいな )を読み込むには
どう設定したらいいんでしょうか?
www.php.netの部分を変えてみても、エラーが出て上手く行きません。
$fpが偽になっているようなのですが、$errstr ($errno)は (0)と表示されるだけです。
なにか別の関数を使用するのでしょうか?
file() でええやん
GET /hoge/hoge.php
227 :
nobodyさん :04/02/15 17:40 ID:Tw7O6F5/
クッキーに $a という変数を用意して、 $a=1 という値が入っていればログインしているという フラグを設定しました。 ところが、URLの最後に &a=1 などと付け加えてアクセスすると これもやっぱりログインしているということになってしまいました。 この $a という変数の値が、クッキーによるものか、 クエリーによるものか調べる方法はありませんか? 教えてください。お願いします。
228 :
224 :04/02/15 17:40 ID:???
file()でいいのかΣ(`□´/)/ 上手く行きましたありがとうございます。
229 :
森の妖精さん :04/02/15 17:49 ID:hYQYfjkg
echo("get>"); echo($_GET["a"]); echo("post>"); echo($_POST["a"]) echo("cookie>"); echo($_COOKIE["a"]); じゃだめか?
>>229 それは何でしょうか?
検索しようと思ったけどどう調べればいいのかわかりません。
調べるためのキーワードだけでもいいので教えてください。
231 :
森の妖精さん :04/02/15 17:54 ID:hYQYfjkg
>>231 ありがとうございました。こんなものがあったんですね。
なんとか解決できそうです。
>>224 の方針で行くとすると、
GET / を
GET /hoge/hoge.php にする。
「HTTP GET リクエスト」でググればどういう理屈なのかもわかるよ。
>>227 いい加減にregister_globals=offにしてください。
$_GET $_COOKIE $_POST
234 :
森の妖精さん :04/02/15 17:58 ID:hYQYfjkg
>>232 どういたまして。
でも、ログインの処理を行うならセッション使うべきだと思うけど。
MYSQLなどの接続用設定(username,password,server,dbname)を 外部ファイルにして複数のphpプログラムでrequireしたいとき、 public_htmlより上の階層に置ければベストでしょうが、 レンタル鯖とかでそれが出来ない場合、 どういった方法を使うのがセキュリティ上ポピュラーでしょうか?
>>234 そうですねー。
でもレンタルサーバだったので負担をかけない方がいいかと思ったので・・・
あ、もしかしてクッキーいじって a=1 にしたらログインできてしまう!
237 :
森の妖精さん :04/02/15 18:11 ID:hYQYfjkg
>>236 >>233 の中の人が言うように
register_globals=off
にしておいた方が良いと思います。
セッションはあんまりサーバの負担にはならないと思うよ。
そりゃ、2ちゃんレベルのようなアクセス数があったら話は別だけど。
238 :
森の妖精さん :04/02/15 18:16 ID:hYQYfjkg
>>235 普通は/usr/local/lib/phpあたりに置くんだろうけど、
それが出来ないなら、予想できないような名前にして同一階層に
置くしかないんじゃないの。
アクセスしても<?php ?>で囲ってしまえば、とりあえず見えないんだし。
そういう設計したことないからわかんないけど。
一階層下に置いて、パスワードかけてもあんまり意味なさそう。
たしかに推測されづらいのかもしれないけど。
知ってる人が書いてくれるでしょう(w
>>237 あー、なるほどー
いろいろ勉強になりました。
言われてみれば勝手にグローバル変数に登録されるのって
すごいキケンですね・・・と思ったらPHP4.2からはデフォルトが
offになってるんですね。
・・・でもレンタルサーバなので設定は変更できません。
240 :
森の妖精さん :04/02/15 18:23 ID:hYQYfjkg
flashでXMLを生成させて$HTTP_RAW_POST_DATAでPHP側へ送信、 DOMで中身を読み取ろうとしたら、PHPマニュアルのDOMのサンプルが すべてファイル読み込みの方式だったんで、 ちょっと迷ってここに探しに来たらミイラ取りがミイラになっちゃった。 $dom = new DomDocument($HTTP_RAW_POST_DATA); でもこれで動いたみたい。らっきー。
241 :
森の妖精さん :04/02/15 18:29 ID:hYQYfjkg
>>239 どういたしましてー。
でも、そのサーバ、なんか危険な香りがする。(w
外部からの変数読み取りってクロスサイトスクリプティングにも
係わるところなので、注意しすぎてもしすぎる事はないですね。
post,getなどどこから来たかと、intかcharかなど型はあってるか、
SQLの部分なんかだと、そのままクエリーにdelete from hoge;なん
て仕込まれるとデータが消えてしまうことも考えられるから、
そこら辺の対処って結構重要ですよ〜。。
>>241 うわぁ・・・
とりあえず変数はできるだけ初期化しておきます。
さっきの問題は何とかなりました。
セキュリティについて考えるいい機会になりました。
本当、ありがとうございましたー
243 :
森の妖精さん :04/02/15 18:36 ID:hYQYfjkg
かむばってください。 私もがむばります。(w さて仕事に帰ろう。
. 冒 | | / \ |'~~~~~| マターリ |('A`) .| |ノ( ヘヘ|
環境は Apache/2.0.48 (Unix) mod_perl/1.99_12 Perl/v5.8.2 mod_ssl/2.0.48 OpenSSL/0.9.7c PHP/4.3.4 です。 既出だったとおもうんですが、探しても見つかりません。 ユーザーディレクトリはphpinfo()を表示させたくないんですがどうしたらいいでしょう?
246 :
254 :04/02/15 19:49 ID:???
XApache/2.0.48 (Unix) ○Apache/2.0.48 (win32) どこ見てるんだろう・・・自分。
>>248 おお、ありがとうございます。
そうやればよかったんですね・・・
あと配列の配列の中身を表示するにはどうすればよいのですか?
$a = array(array(1,2),array(3,4));
print "$a[0][0]\n";
これだと表示のところでエラーが出てしまいます・・・
251 :
nobodyさん :04/02/16 00:05 ID:DTHYGT31
252 :
250 :04/02/16 00:06 ID:???
エラーじゃなくてArray[0]と表示されるだった・・・
>>250 最初からマニュアルを読んだ方が・・・。
配列の中身を確認するだけなら
print_r($a);
か、
var_dump($a);
を使う。
配列の配列を print や echo で表示するときは、
{} で囲まないとエラーになるか、違う値が表示される。
print "{$a[0][0]}\n";
のようにする。
254 :
250 :04/02/16 00:27 ID:???
>>251 >>253 できました。ありがとうございます。
そうですね・・・とりあえずそこのマニュアルを読んでみようと思います。
{$a}なのかぁ・・・ 俺ずっと${a}でやってたよ どっちでもいいの?
phpでクッキーを使ったスクリプトを組んでるんですが、 ひとつのスクリプトでsetcookieをたくさん呼び出していたら、22回目を越えたあたりで 最初にセットしたものから順にクッキーが消えていってしまいました。 どうにか全部を登録できるようにしたいので、何かしらの対処法とかあったら教えてください。
257 :
256 :04/02/16 07:06 ID:???
どうも検索した感じじゃ 「サーバもしくはドメインごとに、クッキーの数は20まで。 」 となってるみたいで、どうしようもなさそうですねこれ。 配列に収めてどうにかしてみます。
258 :
森の妖精さん :04/02/16 07:10 ID:/mo58UcM
セッションに埋め込むとラクだよ。
259 :
253 :04/02/16 11:21 ID:???
>>255 普通の配列は問題ないけど、2次元配列の時に、
print "${a[0][0]}\n";
にすると、Parse error になるので
print "{$a[0][0]}\n";
のようにした。
260 :
193 :04/02/16 13:31 ID:???
>>194 結局それしかなさげですな…
そーします。
>>260 それしかないわけじゃないが、それがベストってことだな
Eclipse もけっこう使えるけど
>>260 ZendStudio ってどうなんだろうね。
263 :
nobodyさん :04/02/16 15:29 ID:9y0rNftE
文字コードとURLencodeについての質問です 例えば、‰ (16進数で89)だと‰と表示されますが、 urldecode("%89")は‰にならないのです。 解決するにはどうすればよいでしょうか?
%26%23137
実体参照とURLエンコードは別物 ‰
266 :
263 :04/02/16 20:33 ID:???
マルチバイト文字をソートすることってできますか?
‰ -> ‰ <- ‰
なぜか flock, fputs, fclose が supplied argument is not a valid stream resource になる… $id_arr = file("log.txt"); $id = $id_arr[0]+1; $fp_id = fopen("log.txt","w"); flock($fp_id,LOCK_EX); fputs($fp_id,$id); fclose ($fp_id); なぜでしょ…
fopenはちゃんと成功してる? $fp_id = fopen("log.txt","w"); の後に、 if ( !$fp_id ) die("failed to open.\n"); を入れてみ。
272 :
nobodyさん :04/02/17 00:09 ID:q3DmGQYQ
setcookieを実行したら、成功したら1、失敗したら0を返すとかいう機能は備わってないですか? クッキーを発行して、ブラウザで拒否されてるかどうか見たいのです。 ヤフーの場合、ログインする時、クッキーを拒否していると、 ブラウザをチェックして下さいみたいなエラーページに行きます。 あんな感じにしたいのです。
ログインページでsetcookieして、その次のページでcookieの値を読めなければ エラーページへ飛ばせばいいんじゃないの? setcookie関数自体はクッキー拒否を判断できないってマニュアルに書いてあるし。
>>271 失敗してました…なんでだろう…
Permissionも666なのに…
275 :
nobodyさん :04/02/17 00:27 ID:cEcBHZAv
crypt()の動作がおかしい。 普通、crypt()に文字列を渡すと、MD5の暗号文が返ってくるはずなのに、 DESしか返ってこない。MD5な暗号文をsaltとして代入しても、DESが返ってくる。 さらに、これはApache2経由でのみ発生して、コンソールからphpスクリプトを実行すると、 ちゃんとMD5な暗号文が返ってくる。phpを何度コンパイルし直しても変わらず。 ソースをいじるしかないのでしょうか。 環境:Debian GNU/Linux woody Apache 2.0.48(手動コンパイル) PHP 4.3.4(手動コンパイル) PHPの定数 CRYPT_SALT_LENGTH = 12 CRYPT_STD_DES = 1 CRYPT_MD5 = 1
276 :
275 :04/02/17 00:34 ID:cEcBHZAv
【追記】 <? print crypt('test'); ?> 実行結果(Apache2) $19JEJTylB1.M ちなみに、他の文字列で試しても、常に$1がsaltとなったDESが返ってくる。 SSHでログインして実行すると $1$hFbjC.E6$b0YUdgBTVu2yd84xWAaPq/ となってオッケーなのだが・・・
インターネット上で表示可能なファイル名か否かを チェックする正規表現を教えてください
ヒアドキュメントは2重引用符と同じ働きをするけど、 引用符と同じ働きをするように出来ないかな? つまり、文字列をそのまま出力させたいの。 知っている人いませんか? それとも無理?
phpのアップローダでうpできねーよおおおお なんなんだよおおおおおおおおおおおお
281 :
nobodyさん :04/02/17 06:18 ID:ogY+088e
取り敢えずコード晒せ
>>279 echo <<<'HOGE'
$hoge
HOGE;
>>282 うごかねーよ。
?>
$hoge
<?php
これで我慢しる
echo <<<EOF \$hoge EOF;
285 :
nobodyさん :04/02/17 12:30 ID:osX/QAJ6
ちょっといいかな? 今、設定ファイルでがしがし動作を変更できる、 バッチスクリプト書いているんだけど、 どうしても、動作を変更させるためのif文に処理が埋もれちゃうんだよね。 絶対に、俺の知らないエレガントな方法があると思うんだけど、 教えてもらえないかなぁ・・・
286 :
nobodyさん :04/02/17 13:06 ID:MRRdWSDI
switchを使う。 多態性を使う。 他にどうやって分岐しろと?
287 :
nobodyさん :04/02/17 13:16 ID:osX/QAJ6
センキュ
>>286 でPHPでポリモーフィズムって使えた?
>>287 エレガントさも、ポリモーフィズムも知らんけど、
switchでincludeファイルをガシガシ切り替えちゃうけどな。
includeファイルの中身はユーザ関数の定義だけのやつ。
>>277 ありがと。
どうやらそのようだった。
openssl-0.9.6c-2.woodyをapt-get removeして、
オフィシャルのopenssl-0.9.7cを自力コンパイルしてインストール。
Apache2もコンパイルし直してインストールすると、ちゃんとMD5が出力された。
PHPはコンパイルし直さなくてもよかった。
// deb使うなら全部debで済ませろということか?・・・
290 :
nobodyさん :04/02/17 17:04 ID:osX/QAJ6
>>288 さんきゅー
やっぱ、includeの切り替えあたりが妥当な線かなぁ。
そうするってのは良くわかるんだよなぁ。
そうだよなぁ。
includeがソースの最初に集まってないってのが、
どうも、気持ち悪くて(笑)
って、ただの我侭だけどさぁ。
291 :
nobodyさん :04/02/17 17:07 ID:osX/QAJ6
>>288 エレガントさっていえば、
例えば、ログレベルの制御なんかで、
if($logLevel > あるログのレベル){
// ログの出力
}
なんてやるんじゃなくて、
Logのクラス->logWrite($str, ログレベル);
なんてやれば、結構すっきりするじゃん。
俺のレベルではそんな感じの話。
>>290 includeが気持ち悪いってことだけなら、GoFのFactoryをそのまんまPHPに持ち込めば良いけど。
switchでincludeを小分けにしても、switchの条件に関わらずZendでコンパイルする
前段階では全部includeされてるので、Java/C++のデザパタを持ち込んでも、
この点ではPHPの特性に合ってないパターンではない。
プリプロセッサがある訳じゃないからね。
え゛ 条件分岐に関係せずincludeしちゃうの?
>>293 昔はそうだったけど PHP4 から全部読むようになってしまった。
295 :
292 :04/02/17 17:59 ID:???
>>293 誤解を招きやすい書き方だったので訂正補足すると
「全部include」というのはコンパイラに、全部掛けられてコンパイルされるということで、
実際にコンパイル後のそれ全部がリンクされるということでないです。
PHPAやAPCの仕組み(何を高速化してるか)を見てみると判りやすいです。
>>294 , 292
PHP4.1.2, PHP4.3.4, PHP5.0.0b4
if でも switch でも include, require の条件分岐出来るんだけど。
何か勘違いしてる?下のコードで検証しました。
-- test_include.php
<?php
$num = 1; # $num = 2;
switch ($num) {
case 1: include "./d1.php"; break;
case 2: include "./d2.php"; break;
default: break;
}
?>
-- d1.php
<?php echo "included 1\n"; ?>
-- d2.php
<?php echo "included 2\n"; ?>
297 :
296 :04/02/17 18:14 ID:???
>>295 あぁ、入れ違い。and 納得。勘違いだった >> 296。
Perlの if (0) { use Module; } でもモジュールが読み込まれる、
みたいな事言ってるのかと思ったよ。
298 :
nobodyさん :04/02/17 18:14 ID:FqD8ECIy
sessionのテストをしています。 tmpフォルダにセッションファイルが残るんですが、これは別に 気にしなくていいのですか? 消さないとまた同じSIDが有効になってしまう気がしたのですが。 <? // セッションを開始/復帰 session_start(); if($_GET['mode'] == "des"){ print "破棄しました"; session_destroy(); }else{ //セッションへ変数を登録 session_register(login); // セッション変数loginが空の時 if($_SESSION['login'] == ""){ print "loginをセットしました。"; // 変数に値を格納 $_SESSION['login'] = "1"; } } ?> <a href="test.php?<?=SID?>">NEXT</a><br> <a href="test.php?mode=des">DESTROY NEXT</a>
2chのIDとかをeregで検索する際、IDに「+」とかが入って来ると 正規表現として認識されてしまい、求める結果になりません。 Perlで、\Qhoge\Eとかでメタキャラを打ち消すような方法は PHPではどのように記述すれば良いのでしょうか?
preg_matchを使った方が簡単でじゃない?
しかも ereg より速かったりするし。
>>302 ありがとうございます。
ショッピングカートの単純なものを作りたいのです。
大抵はクッキーを使いますよね。
で、クッキーはご存知の通りユーザーの設定によってまちまちなのでクッキーは使わないで、
セッションで管理できないかなと思ったのです。
まず、理論的に可能ですか?
あと、セッションIDの有効時間って任意に設定できますか?
(クッキーは分単位で設定できますが)
ショッピングが終わった時に、破棄すればいいんですかね。
(けど、ブラウザ勝手に閉じられたら、いつ終わったのかわからないですよね)
>>303 セキュリティ的にお勧めはしないが、GET渡し(URLに付加する)がある。
POSTが使えるのならページに埋め込むのも良いが、この場合ページ遷移は
formのボタンを押す形になる。タブブラウザでのナビゲーションが
最悪なので、cookieが使えない場合の次善策ぐらいに使って欲しい。
取り合えず、マニュアル
http://www.php.net/manual/ja/ref.session.php その上で疑問が出た場合は、それは殆どの場合PHPのMLで既に出ている筈。
特殊なブラウザやプロトコルの改造をすれば色々出来るけど、
「ショッピングカート」なら一般解を選ぶべきだし、一般解なら
既に誰かが答えを出してます。
305 :
nobodyさん :04/02/18 02:08 ID:7xZfaMHT
>>279 遅レスだが
echo <<<EOF
{$hoge}
EOF;
>>287 使えるよ。
俺が今仕事で使ってる。
ユーザ別に振る舞いを変えたりする時に便利。
>>299 ID検索するだけならeregやpregは必要ないのでは。
strstrやstrposを使ったらいいよ。
308 :
nobodyさん :04/02/18 09:00 ID:jzIJCwbw
Vine 2.6, Apache 1.3.27, PHP 4.2.3 です。セッションについて質問します。 1)入力 method post ↓ 2)確認画面 $_POST → $_SESSION にコピー ↓ 3)DBに書き込み or 1)に戻って訂正 という処理をさせたいのですが、addslashesするべき文字を$_SESSIONで 渡そうとすると、$_SESSIONごと消えてしまいます。どうすればいいでしょう? 普通の入力ではうまくいっています。
>>308 もしかして、session_start()してないとか。
>>308 自己解決しました^^;
http://www.php.net/manual/ja/function.serialize.php より
If you want to put serialized data into DB, you have to add slashes.
At this point, there's a problem. If you got data via HTTP POST method,
the data has slashes already. I tried to work with "array_walk" or
"array_map", but it doesn't work when the data has array.
So make extended stripslashes function.
function my_stripslashes($vals) {
if (is_array($vals)) {
foreach ($vals as $key=>$val) {
$vals[$key]=my_stripslashes($val);
}
} else {
$vals = stripslashes($vals);
}
return $vals;
}
ということで、2)で
$_SESSION['answer']=$_POST['answer'] としていたのを上記関数を使って
$_SESSION['answer']=my_stripslashes($_POST['answer']) とすることで桶と
相成りました。
311 :
nobodyさん :04/02/18 14:42 ID:ILG9JaZI
Notice: Constant __HOGE__ already defined in ・・・ すいません、これどういうエラーでしょうか。。。 自分で考えたのは「注意:定数__HOGE__は既に定義されています」 意味がわかりません。
define('__HOGE__', ) する前に既に define('__HOGE__', ) してるんじゃない。
>>312 自分で先に定義してなくても、システム定義済み定数の場合もあるね。
'__HOGE__'が字面そのものなら、システム定義されてないけど。
質問です。 phpがcgiより速くて、負荷が少ないってのはよく聞きます。 なら、カウンターもphpの方が正確なのでしょうか? kent氏のカウンターとphpのカウンターはどちらのほうが速いか気になりまして。 宜しければお教えください。
>>314 速くて、負荷も少ない⇒カウンターもphpの方が正確
どういう発想をしたらこう導き出されるのだろう。
>>314 PerlもPHPも CGIとモジュールの2つの形式がある。
速度は PHP(CGI) < Perl(CGI) < PHP(モジュール) < Perl(モジュール) の順に速いと言われている。
大抵の無料鯖では、PHP(CGI) Perl(CGI)を使うように設定されている。
よって、全く同じプログラムを同じような処理をする関数を使って書いた場合、
Perl(CGI)で書いた方が速いと考えられる。
と、まぁ、Perlで行っとけばええんでないの?的結論に達しそうだが、
実際問題としてはスクリプトを書いた奴のヘタレ度合いの影響や
標準で使える関数の違い方が大きいので、単純には比較できないのである。
まぁなんだ、両方試してみればええやん
>>314 おまえのつくるような客が少ないサイトなら遅くてもまったく問題ないよ。
>>317 客が多いサイトってそもそもカウンターなんて付けないよね。
仲間内サイトのお遊びならともかく、バカバカしいし、恥ずかしいから。
客の数や、どこが満足・不満足なんかはログで分析した方が正確だしな。
319 :
nobodyさん :04/02/18 23:10 ID:GJoLXTIU
HTMLテンプレートの使い方について。 下みたいなtemplate.htmlがあって、テーブルタグのところを繰り返したいのですが、 どんな風に書いたらいいでしょうか。 <html> <body> // ここから <table> <tr><td>$hoge</td></tr> </table> // ここまでをn回繰り返す </body> </html>
>>319 あなたはどのテンプレートエンジンをお使いになら
れてるのでしょうか?
>>319 例えにツッコミを入れるのもなんだが、<table>〜</table>を繰り返すのか?
1セルしかないテーブルをいっぱい表示させたいんじゃないの?
323 :
nobodyさん :04/02/19 00:54 ID:kPkQTpLM
例えは例えでなので、テーブルの中身はもう少し複雑だったりしますが、 別にテーブルでなくても、 Line1:<p> Line2:〜 Line3:</p> でもいいのですが、 つまり、 1行目の「<p>」を抜き出したら、次は「〜」を抜き出して、次に「</p>」を抜き出しますよね。 で、また<p>に戻るわけですが、もう<p>は取得してしまってるので、 もう<p>には戻れないじゃないですか。 たとえば、<p>〜</p>が一つの変数に入っているのなら、何度もその変数を読めばいいですが、 ファイルを読み込んでる訳なので、都合のいい部分だけ繰り返し読み込むってことはできないですよね?
テンプレート <html> <body> <p> %%HOGE%% </p> </body> </html> 表示の結果 <html> <body> <p> 1回目だよ </p> <p> 2回目だよ </p> <p> 3回目だよ </p> </body> </html> こんな感じにしたいのです。
>>320 よくわからないのですが、テンプレートエンジンというのは使ってないです。
原始的にhtmlファイルを読み込んで1行づつ取得して、変数があれば文字列を置換するやり方です。
>>319 だったら、1行ずつ読み変数を置換、などせず、
<html>
<body>
<table>
<tr><td><?=$hoge?></td></tr>
</table>
</body>
</html>
とすれば、includeするだけでいいのだが。
で、ループだが、
<html>
<body>
<?php foreach (@loop as $value) { ?>
<table>
<tr><td><?=$hoge?></td></tr>
</table>
<?php } ?>
</body>
</html>
をincludeするのでどうだ。
あるいは、
<html>
<body>
<!--cut-->
<table>
<tr><td>$hoge</td></tr>
</table>
<!--cut-->
</body>
</html>
で、<!--cut-->で切って処理。
327 :
森の妖精さん :04/02/19 01:14 ID:vjo4xs0n
smartyとかxsl使うとかいう話ではないのか。
328 :
nobodyさん :04/02/19 02:35 ID:6cKIjRB6
質問です。 [hogehoge.php] <?php switch($mode){ case "foo": echo foofoo; break; } ?> (中略) <form name='foofoo' Action='' method='post' > <select name='var'> (中略) </select> <?php echo "<a href='hogehoge.php?mode=foo&sid=" . $foofoo . "'>送信</a>"; ?> </form> 以上のようにやってみたのですが$foofooに一切値が入らなくて困っています。 どうすればいいのでしょうか?
329 :
328 :04/02/19 02:39 ID:6cKIjRB6
修正。 「foofoo→var」 <?php echo "<a href='hogehoge.php?mode=foo&sid=" . $var . "'>送信</a>"; ?> で、$varに値が入りません。どなたかアドバイスをお願いします。
330 :
森の妖精さん :04/02/19 02:56 ID:vjo4xs0n
ちょっと論点が多いかも。 selectのメソッドがpostで送信はget その$varというのは何が取りたいのですか?selectの内容でしょうか。 それであれば、いったん、submitで送ってあげて hiddenで分岐、$_POST['var']で内容を取らなければならないです。 もしくはvarの内容をhtml内で取るのであれば、javascriptで取るしかないです。
ちょい質問させてください date関数の中で全角の括弧を使うと文字化けするのですが、仕様ですか? また、半角を使う以外の回避方法はないのですか?
332 :
nobodyさん :04/02/19 04:45 ID:swEN53F2
Md5_File をつかって、MD5ハッシュ値をだしたんですが、あるところでつまずいてます チェックする対象ファイルのパーミッションのother が読み取り許可になっていないとチェックできません。 userとgroupのみ許可されていて、他人はアクセスできないファイルのMD5をチェックする場合は、どのようにしたらいいでしょうか? アドバイスお願い致します。
>>331 文字コードに、Shift_JISを使っていないか?
date('g/j').'('.date('D').')'のように、dateの外に出せば、化けは回避できる。
今一番マトモなPHPのバージョンってどれですか?
php4.3.4使ってます。 現在実行しているのが実行ソースの何行目かを知りたいんですが、 取得可能なんでしょうか?
可能だといえば可能だし、不可能だといえば不可能だし
>>336 もし出来たら取得方法教えていただけないでしょうか?
341 :
nobodyさん :04/02/19 14:56 ID:0KkAZDK9
<a href="
http://www.hoge.co.jp ">foo</a>
のようなアドレスがあって、URLとタイトルだけを、正規表現を使って抜き出したいんですが、
タイトルの部分の正規表現をどうすればよいのかわかりません。
教えていただけないでしょうか?
使用言語:PHP
よろしくお願いします。
>>341 a タグの ">"以後"<"までなら、
">([^<]*)<"でOKだけど、間にimgとかspanのタグは入ったらダメだな。
pregなら最短マッチが使えるので
">(.*?)</a>"で、いいと思うが。
タグを正規表現で抜く場合。閉じ忘れになっていたり、
タグ内に改行や空白が入っていたりすることを考慮すると鬱になる。
343 :
341 :04/02/19 15:34 ID:0KkAZDK9
344 :
328 :04/02/19 22:38 ID:AiiAVVTx
>>330 どうもありがとうございます。
それでやってみます。
345 :
nobodyさん :04/02/20 00:51 ID:2YCx291f
PHPであるSQLを取得して その取得されたデータにたいして 特定の文字に対して、指定の文字に変換して出力するにはどうすればいいのでしょうか? たとえば二つの列を出力して A→1,2→Zにして出力したい時 0001、A→1 0002、2→Z 0003、3→3 0004、A→1 0005、2→Z としてあたかも初めから1,Z,3,1,Zという値が入ってたかのように二つの列を出力したいのですが 教えてください
strtr() ってことか?
>>345 str_replace()
詳しい使い方はヘルプなどで熟知すべし。
連想配列って手もあるな
349 :
nobodyさん :04/02/20 02:38 ID:9KUfbQrN
ループの中で、数字をどんどん追加算していきたくて $goukei .= $i なんてやってたんですが、これだと12345678....ってなるだけで 加算されません。 どう使えばいいんでしょうか?
>>349 "."は文字列結合
加算したければ"+"を使って"+="にすればいい
ものすごい基本だと思うのでもっと書籍などで勉強しましょう
351 :
nobodyさん :04/02/20 02:57 ID:d2/uWwOC
SQLを取得してorder byでソートした順に番号を付けたいのですが たとえばAとB、2カラムのテーブル A | B --+-- A | 19 B | 19 C | 63 D | 34 というデータがあって これをBで大きい方から並び替えて A | B --+-- C | 1 D | 2 A | 3 B | 3 順番を取得した後、Aで並び替えて A | B --+-- A | 3 B | 3 C | 1 D | 2 にしたいのですがどうすればいいのでしょうか?
352 :
349 :04/02/20 02:59 ID:???
>>350 出来ました。ありがとうございました。
勉強します。
353 :
nobodyさん :04/02/20 03:00 ID:VPYBo4sr
354 :
342 :04/02/20 08:33 ID:???
>>343 元の$partsがどのように想定されているかわからんので、どのぐらい例外を考慮すべきかわからんのだけど?
そこに書いた正規表現ではaタグ内のhref属性値を抜き出すということになっていないだろ。
細かく検証していないが、こんなもんでどうよ。
$parts='http//example.com<a class="link" href="
http://www.hoge.co.jp " target="sub">EUCなら日本語もOK(たぶん)</a>';
preg_match('/<a\s+.*?href\="?([^\s"]+)[^>]*?>(.*?)<\/a>/i',$parts,$r);
print_r($r);
355 :
342 :04/02/20 09:08 ID:???
>>351 思いつくままに書いたので自信なし。
select A,(select count(*)+1 from test where B < C) from (select A,B as C from test where A in (select A from test order by B))as foo order by A;
すんごく時間が掛かりそうだw
>>355 名前欄入れたままだった。
サブクエリ内のorder by Bはイラネ
すみません。cookieの質問させてください。 自宅鯖では普通に使えたのですが レンタル鯖にアップすると、cookieが使えなくなってしまいました 恐らくスクリプトの問題だと思うのですがどこが間違っているのかわかりません。。 エラーはこのように出ます↓ Warning: Cannot modify header information - headers already sent by (output started at /var/www/home/sitename/filename.php:7) in /var/www/home/sitename/filename.php on line 29 スクリプトはこんな感じです↓ if(isset($_COOKIE['mycookie'])){ parse_str($_COOKIE['mycookie']); if($ckregist=1){ print "Error"; exit(); } } もしくはこっちが間違っているのでしょうか↓ setcookie("mycookie",$ckregist=1,time() + 60); どこが間違っているのでしょうか。。どなたかご教授よろしくお願いします。
359 :
nobodyさん :04/02/20 11:00 ID:UnD0yzOA
変数の型宣言ってどうやるのですか?
>>359 それくらい調べろ
int $hoge = 0;
string $var = 'hello\n';
>>357 setcookieはHTMLが出力される前に呼び出されなければなりません。
#!/usr/bin/php
<?php
の次の行にでも書いてみなされ。
PHPプログラマーマガジンのサイトでPDFを購入後ダウンロードサイトに行くと パスワード付きのPDFを生成して(その間、「しばらく待ってて」画面を表示)、 生成が完了したら自動的にダウンロード画面にジャンプしますが、 あれはどういう仕組みで動いてるんですか?
>>357 自宅で動いたって事は改行コードの可能性もあるな
1)待ってて画面を表示 2)すぐにリフレッシュタグなりなんなりで次の生成&ダウンロード画面表示PHPキック 3)生成完了したらブラウザに向けてレスポンス とかでできそうな。 なんか問題ありそうな気もしなくもないが。
PHPで、HTTP通信を行うにはどうしたらよいですか。 具体的には、PHPスクリプトから別のサーバーにPOSTメソッドを投げたい。 生Socketを使うのでもいいけど、もっと簡単なのがほしい。 PHPのHTTP関数は、なんかちょっと違う感じ。
function _sendcmd($cmd) { global $sock; fputs($sock, $cmd."\r\n"); $buf = fgets($sock, 512); if(substr($buf, 0, 3) == '+OK') { return $buf; } else { die($buf); } return false; ←ここでfalseを返す意味があるのでしょうか・・・ }
>>366 予防的プログラミングだろうね。
『プログラミング作法』を参考に。
>>368 作法を語るなら、一関数内で落とすのもなんだがなー。
と思ってしまうが。
370 :
368 :04/02/20 15:00 ID:???
>>368 うむ。それ以外にも引数チェックや fputs の返り値など
突っ込みどころが多いですよね。
まずは『プログラミング作法』でお勉強を、
と思ったけど難しすぎるかもね。
でも 366 氏は一度目を通すだけでもお勧め。
>>367 さんくす。
curl関数って、プログラミング言語のあれかと思ったら、ちがうのね。
使い方調べてみる。
>>361 ありがとうー!
うまく動きました(感謝
373 :
nobodyさん :04/02/20 17:36 ID:UnD0yzOA
PostgreSQL + PHPなのですが、 PHPのスクリプトとhtml出力はEUCでないとダメなのですか?
>>373 そんなことはない。
しかし「ダメなのですか?」と誰かに訊きゃな判らんレベルならば、EUCにしておけ。
あとソースと出力(htmlやDB)を文字コードの点で、いっしょくたに考えるな。
きちんと区別した上でそれぞれで適正な文字コードを選択すれば良い。
但し同じにしておけばプログラム上の作りが楽なのも確か。
漏れは、ソース(内部)はEUC 出力はSHIFT-JIS die("");って出力したら化けるのがどうもねぇ。 だからdieのメッセージは全部英語。 これはどうにかならない?
function sine($str){ $str = mb_convert_encoding($str,"SJIS","EUC-JP"); die($str); } でどうよ
function sine($str){ $str = mb_convert_encoding($str,"SJIS","EUC-JP"); header("Content-Type: text/html; charset=EUC-JP"); die($str); }
379 :
378 :04/02/20 20:17 ID:???
EUC-JP->Shift_JIS
internal_encodingがEUCで、 outputをSJISにしてるんですが、 こんど英語のページをつくることになりました。 この場合、どうするのが得策なんでしょうか? そのままSJISでもページに日本語使わなければOK?
OK.
>>377 よくわからーん・・・
$fp=@fopen("text.txt","r") or die(error);
の場合はどうなの?
phpでメルマガ配信システムをつくろうとしてるのですが、 気をつけることってどんなことでしょう。(ちなみに専用サーバ) ●Apacheのタイムアウト時間を多めに変更する ということしか思いつかないのですが・・・
>>382 die() を sine() に置き換えよ。
>>383 大量メール送信は技術的にも倫理的にも非常に難しい。
諦めるか、専門業者に頼むべきです。
example.php?a=1&b=2&c=3 みたいのを example.php/1/2/3/ のようにできますか? よろしくお願いします。
>>380 ちゃんとMIMEヘッダーやhtmlのヘッダの記述を変えてやるのと、
SJISの漢字などが混じってしまわないようにコンテンツを管理してやればOK。
質問です。クラス内で、mb_send_mail実行するとエラー出るのは普通の事かい?
エンコード変換してmail関数で飛ばすのが普通なのかな? ん〜。 387です。
usort関数のように、 引数に関数を渡して、実行させるってどうすればいいんですか?
func callfunc($name) { $name(); }
393 :
285 :04/02/21 00:30 ID:???
>>388 そのスレはGoogleキャッシュに一部しかなくて、、、
自分で調べてきました。
$PATH_INFO を評価すればいいんですね?
追加で質問なんですが、CGIだと、
<Files foo>
SetHandler cgi-script
</Files>
としておくと、fooというファイル名でcgiとして動くんですが、
これを、PHPでできますか?
394 :
391 :04/02/21 00:38 ID:???
>>392 おお、そんな方法でよかったのですか。ありがとうございます。
395 :
373 :04/02/21 01:02 ID:kmQ4a6Qn
396 :
393 :04/02/21 01:17 ID:???
ごめん、追加質問はスレ違いでした、、、
>>395 その一文だけを取り上げるなら、その部分の記述が間違いで、
貴方の解釈の勘違いではない。
PHPは4.0.6の頃よりオリジナルのもので(パッチでは国際化対応版PHP3から)、
スクリプトの内部エンコーディングにはUTF-8が使えたし、出力でも同様。
Postgresは6.3.1からオリジナルにパッチが取り込まれていて、UTF-8が使用できる。
書かれた時期を加味しても、記述が不正確だと言わざるを得ない。
初心者にはその程度で良いという考え方もあるようだが、初心者を舐めた、馬鹿にした考えだと思う。
最近は馬鹿(理解しようとする努力のしない)としか思えん初心者もいるが…
>>390 ありがとう。書き換えたらでけた。(^^ゞ
PerlのHTML::template用のテンプレートHTMLをそのまま使えるPHPのテンプレートクラスはありますでしょうか。
初心者の質問ぐらいには答えられるようになったかなと 思ってこのスレきたんだけど、なんか初心者すぎてトンチンカンな 質問されると不安になる。自分は何か間違って理解してるのか? なんて。そんで誰かが質問に答えるのを見て、自分は正しかった ことを認識して安心。
1日5000ヒット程度のサイトを運営しているのですが、phpのアクセスカウンタがすぐ壊れてしまいます。 昨日今日のアクセスも記録できる、壊れにくいphpのテキストカウンタはありませんでしょうか。 SSIにすべきですか?
402 :
401 :04/02/21 07:57 ID:???
追記 今使っているのは、レッツPHPの昨日今日カウンタです
>>401 以前からPHPのアクセスカウンタはよく壊れるってよく聞きますねぇ。
で、その昨日今日カウンタってのをちょっと見てみたのだけど、
別途ロックファイルを用意しているわけじゃなくて、カウンタ記録
ファイルそのものを開いてロックしているみたい。
ロックする前に現在値を読み込んでいるから、カウント漏れも
発生していそう。
fopen($log, "w")した直後に別プロセスが読み込もうとすると、
内容が空っぽなので、カウンタが壊れるってことになる。
そこで、別途ロックファイルを用意して、そのファイルをロックしてから
//配列にログを読み込む
以後の処理をすれば壊れない(壊れにくい?)カウンタが出来るんじゃないかと。
と、板違いなレスに答えてみたわけだが。
最初に"r+"でオープンしてロック ファイルを読み込んで修正 ファイルをseek,truncateして修正データを書き込む ファイルをクローズ(自動的にアンロック) なら壊れにくいかな
405 :
401 :04/02/21 10:51 ID:???
ありがとうございます。
>>404 さんのアドバイスをもとに改造してみようと思います。
と、なんとか板違いじゃなくそうとしてみました。
406 :
401 :04/02/21 11:59 ID:???
最初にrで読み込んでロック、 その後カウントアップの処理をして、ファイルに書き込むときにいったん閉じて 改めてwで開く、という形にして見ました。
>>406 少しぐらいカウント漏れが出ても壊れるよりはマシ、ということですね。
408 :
401 :04/02/21 12:16 ID:???
はい、
あとはなにぶん初心者なもので、ロックファイルとかよくわからないので…
勉強してわかるようになったら、
>>403 さんの方法を試してみようと思います。
ありがとうございました。
>>406 うーん、最初と対してかわらね。ファイルは閉じられた時点でロックも解除されるよ。
問題はwで開いて閉じられるまでの間に、他のファイルが開いて読み込まないというところ。
tr/[a-z]/[A-Z]/ みたいなことってできないんでしょうか?
>>410 strtoupper()
なんて、ボケてみる。
strtr() なんて、マジレスしてみる。
>>412 strtrで[a-z]みたいな範囲指定ってどうやるの?
なんて、横レス(ry
414 :
401 :04/02/21 16:09 ID:???
>>409 ロックするタイミングを、ファイルを読み込む直後にしたのですが
やっぱり変わらないですかねー
>>414 正直なところカウンタって作ったり設置したことないだよなぁ。
ログインログとかはDBに格納しちゃうし。と、5000Hit/dayなサイトも
経験ないし。
以下、無保証&無責任だが、
設定のところに
$lock="./log.lock"; #パーミッションは606
//今日の日付の前あたりに
$lfp = fopen($lock, "w");
flock($lfp, LOCK_EX);
//桁数整形の直前に
fclose($lfp);
1週間たっても壊れなけりゃ報告きぼんぬ。
なんて、かいてみる。
>>414 すでに書かれている通り、一旦ファイルをクローズするのが問題
読みオープン→(*)→ロック→カウント処理→クローズ→(*)→新規オープン→(*)→ロック→書き込み処理→クローズ
ではロックの意味があまり無いと思われ
(*)の所で他プロセスからアクセスがあれば、当然まずいことになる
むしろ
>>404 の方法のほうが良い
417 :
401 :04/02/21 17:18 ID:???
>>415 俺はこんな感じにしてました。
//今日の日付 のあとに
$fp = fopen($log, "r");
flock($fp, LOCK_EX);
//合計をカウントアップ
のとこらへんで
fclose($fp);
$fp = fopen($log, "w");//ファイルに保存
flock($fp, LOCK_EX);
fputs($fp, $new);
//カウント整形 の前に
fclose($fp);
です。
>>415 さんので一週間試して見ます。
>>401 こんなんで、こわれたことないな。
class safeCounter {
/* private variables */
var $_filename = 'safe_count.cnt';
var $_fp = false;
var $_openmode = 'r+';
// function __construct($filename, $create = false) { /* for PHP5 */
function safeCounter($filename, $create = false) { /* for PHP4 */
$this->_filename = $filename;
$f = file_exists($filename);
if (!$create && !$f) {
error_log("safeCounter WRANING : $this->_filename not found.", 0);
return false;
} else if (!$f) {
$this->_openmode = 'w';
}
}
function countUp() { $this->_fp = fopen($this->_filename, $this->_openmode); if (!$this->_fp) { error_log("safeCounter ERROR : $this->_filename can't open.", 0); return false; } if (!flock($this->_fp, LOCK_EX)) { error_log("safeCounter WARNING : $this->_filename lock failed.", 0); return false; } $cnt = (int) fread($this->_fp, 100); $cnt++; fseek($this->_fp, 0); fwrite($this->_fp, (string)$cnt, strlen((string)$cnt)); ftruncate($this->_fp, strlen((string)$cnt)); flock($this->_fp, LOCK_UN); fclose($this->_fp); return $cnt; } } $c = new safeCounter('my_count.txt', true); echo "Welcome You are No." . $c->countUp() . "\n";
420 :
nobodyさん :04/02/21 18:15 ID:UH002A5h
while文のループを1秒間隔にすることって できないでしょうか? またはWhile文に限らず繰り返し処理を一定間隔おきに したいのですが。。 頼む
こらまた細かいカウンタやなぁ。性格滲み出とるわ。
>>420 最後の一文がなければ教えてやったのに。
423 :
420 :04/02/21 18:36 ID:UH002A5h
DokiDoki PHPというサイトのDokiDoki BBSを、 返信が着いた記事が一番上にくるようにしたいんですけど うまくできない・・・ 同じように手を加えてる方いますか?
>>426 logファイル見てないから知らないけど
logをメモリに入れて書き込んだlogを最初に書いてそのあと続ける
こんな感じじゃないの?>先人達
配列にin_arrayで検索かけるとうまくいくのに、array_searchでは失敗します。 EUC-JPのタブ区切りテキストをimplodeで配列に入れたんですが、先頭の文字 だけヒットしません。先頭の文字以外はきちんとヒットするのがまた不思議。
>テキストをimplodeで配列に入れたんです このへんがクサイな
OSを判定する方法ってありましたっけ?
$array_os=array("UNIX","Windows","Mac"); srand(); echo "あなたのOSは"; echo $array_os[rand(0.2)]; echo "です。";
433 :
430 :04/02/22 13:21 ID:???
>>431 アクセスするたびにOSがかわるのですが・・・
マジレスすると $_SERVER["HTTP_USER_AGENT"]; これで出てきたものからOSだけ抽出しろ
438 :
nobodyさん :04/02/22 15:06 ID:otwESkjJ
phpってPerlにもあったデータのデコード処理ってやらなくてもいいんですか?
マジレスすると string php_uname() string PHP_OS どちらか好きな方を選べ
440 :
430 :04/02/22 15:40 ID:???
>>439 オプションと情報かぁ… 定数にもあったんですね。見落としてました。ありがと。
441 :
435 :04/02/22 15:54 ID:???
(°д ゚)ハァ? 俺の答えは無視か
442 :
438 :04/02/22 16:06 ID:otwESkjJ
(°д ゚)ハァ? 俺の質問は無視か
443 :
440 :04/02/22 16:09 ID:???
(°д ゚)ハァ? 何だその態度
440にも問題はあるぞ
>>438 やらなくていいよ。
post で受けとった値は $_POST に、 get なら $_GET に
連想配列として保存されるから。
<input type="text" name="hoge">
なんてフォームの値は
echo $_POST['hoge'];
で簡単に表示できる。packとかしなくていいよ。
446 :
439 :04/02/22 16:35 ID:???
>>441 すまん。折れが435の文体をパクった所為で混同したと思われ。
sageだとIDでないし。
>>431 俺ならこうする
// srand();
$array_os=array("UNIX","Windows","Mac","CP/M");
echo "あなたのOSは".array_rand($array_os)."ですね。";
↑間違えた。最後の行は echo "あなたのOSは".$array_os[array_rand($array_os)]."ですね。"; でないとダメだった。
450 :
426 :04/02/22 19:41 ID:???
451 :
nobodyさん :04/02/22 23:29 ID:a5XSCC8Y
すみません。質問です。 <form name="hoge"> <table> <?php $n=var(); for($i=0;$i<$n;$i++){ //フォーカスされたテキストを一旦空にしたい。 echo "<tr><td><input type=text name=txt[".$i ."] value='更新?' onFocus=\"document.hoge.txt[".$i."].value=' ' \">" echo "</td><td><input type='submit' name='sup". $i . "' value='更新' ></td></tr>"; } ?> </table> <?php for($i=0;$i<$n;$i++){ $str=$_POST["txt"][$i];//関数呼び出しに必要。 if($_POST["sup{i}"]){ foo($str); } } ?> </form> 以上のようにやってみたのですが、どうしてもonFocusの部分でエラーになります。 $strの値を取得出来つつ尚且つonFocusで指定されたテキストを空にしたいのですが。 何か良い方法ありませんか?
>>451 echo "<tr><td><input type=text name=txt[".$i ."] value='更新?' onFocus=\"document.hoge.txt[".$i."].value=' ' \">"
echo "<tr><td><input type=text name=txt[".$i ."] value='更新?' onFocus=\"document.hoge.txt[".$i."].value=' ' \">" ;
じゃないよね?
453 :
451 :04/02/23 01:47 ID:y5sxN8Ji
>>452 すみません。意味が良く分かりませんが、
エラーはその部分から出ています。恐らく[ ]を配列の要素だと
誤判断してしまった為にでたのではないかと予想してます。
なので、javascriptでも、phpでも値を読み込めるように書き換えたいのですが
分からず終いでした。どなたかアドバイスをお願いします。
455 :
451 :04/02/23 01:52 ID:y5sxN8Ji
あ、因みにform の構文にはきちんとメソッドをpostに設定していますが、例文では 抜けてました。formは問題ないことをお知らせいたします。あとは多分問題ないかなと思います。
456 :
451 :04/02/23 01:57 ID:y5sxN8Ji
>>454 あ、そういわれてみれば(^^;
しかし、それは例文の方のタイプミスです。
エラー文は
「document.hoge.txt.0はメソッド、またはオブジェクトではありません」
です。
>>456 それってPHPじゃなくてjsのエラーじゃないのか?
スレ違いだと思うが、[]を配列と読み間違えてるのなら外せばいいんじゃないのか?
supの方みたいにtxt1,txt2...じゃだめなのか?
458 :
451 :04/02/23 02:15 ID:y5sxN8Ji
>>457 仰るとおりエラーはjsですが問題が生じているのはphpが要因です。
>>451 の通りに出来ないかなあと思ってレスしたのですが。
因みにsup1,sup2はやってみましたが値は習得されませんでした。
459 :
451 :04/02/23 02:16 ID:y5sxN8Ji
sup1,sup2→txt1,txt2の間違いです。 それにしても何故駄目なのでしょう?
>>458 おらぁjsはよくしらねーだ
結局PHPでどう表示してくれる事を望んでるか教えくんろ
つーかスレ違い
462 :
451 :04/02/23 03:00 ID:y5sxN8Ji
>>460-461 確かにスレ違いかもしれませんね。
でも、別にjsのエラー修復が目的ではなく、
>>451 に書いてある通りにphpとjsの両立がしたいだけですよ。
js側でエラーが修復きないからphp側で何とかしたいなと思ったから。
こちらのスレで質問させてもらいました。
どう出力させたいのか示せと
オンフォーカスでそのテキストボックスをクリアさせるJSの関数を呼び出せばいんじゃねの? <form name="hoge"> <input type=text name=txt[] onFocus="text_clear('1')" id="1"> <input type=text name=txt[] onFocus="text_clear('2')" id="2"> : <input type=text name=txt[] onFocus="text_clear('5')" id="5"> </form> んでJSの関数 function text_clear(n){ document.getElementById(n).value='' } こんな感じ 検証してないから、そのままでは作動しないかも。 あと、getElementById()はブラウザ選ぶので注意。
466 :
465 :04/02/23 06:54 ID:???
関数にしなくても <input type=text name=txt[] onFocus="document.getElementById(1).value=''" id="1"> <input type=text name=txt[] onFocus="document.getElementById(2).value=''" id="2"> これでいいわな。 数字の部分をPHPでループさせて番号付けていけばええ。
467 :
nobodyさん :04/02/23 09:33 ID:Pku/V/1k
インストール時に”すべて”を選んでインストールしたRedHat9なのですが、 mb_send_mailを使うと、Call to undefined function というエラーが出てしまいます。どのように 解決すればよいかまったく検討がつかない者なので、ヒントだけでも 教えてください。
>>467 まず<?php phpinfo(); ?>でmb_stringを確認。
>>468 ありがとうございます。調べましたところmb_stringの文字列がなかったので
それが有効になっていないということでしょうか?
一度調べてコンパイルしなおしてみます。
470 :
451 :04/02/23 11:10 ID:aguFRuG6
>>466 ありがとうございます。
それでやってみます。御迷惑おかけしました。
エラー内容をメールで受け取りたいのです。
エラー時に
error_log("$str", 1, "
[email protected] ");
を実行するようにしているのですが、
Warning: error_log(): Mail option not available! in /home/hoge/public_html/hoge.php
のようなエラーが出てしまいます。原因がわかる方いませんでしょうか?
環境はLinux + Apache + qmail + PHP4.3.4です。
php.iniのsendmail_pathは "sendmail -t -i"にしてあります。
>>471 mail()は問題なく送信できるのか?
>>472 <?php
mail("
[email protected] ", "title", "test");
?>
を実行すると
Fatal error: Call to undefined function: mail() in /home/hoge/hoge.php
と出ます。なんででしょう?コンパイルオプション?
/usr/sbin/sendmail にqmailの疑似sendmailを置いてあります。 sendmail_path を "/usr/sbin/sendmail -t -i"に設定してもダメでした。。。 でもqmailをインストールしたのはPHPを入れた後でした。 これが原因なのでしょうかね。
>>473 mail()が未定義ってことだ。
コンパイル時にエラーとか出ていたんじゃないかな?
>>475 PHP入れるときに sendmail はあったのか?それによる。
ちなみに Windows 版でない限り sendmail_path は関係ない。
>>477 qmailが後でした。
順番が悪かったようですね。
再度PHP入れ直しで直りました。
皆様ありがとうございました。
479 :
nobodyさん :04/02/23 13:43 ID:QYVuVQtp
PHPに、 perlでいう、print qq||;こういう書き方ありませんか?
ないけど、<? ?> 利用して出来るんでない?
481 :
nobodyさん :04/02/23 16:44 ID:QYVuVQtp
スクリプト全体を<? ?>で囲んでいるのですけど。。。
>>480-481 変数展開が面倒でしょ。perl だと
$hello = 'world';
perl qq|'"$hello"'|;
が
'"world"'
と出る。
>>486 $hello = 'world';
print qq|'"$hello"'|;
です…
?> hoge <?=$hoge?> hoge <? 似たような方法なら、このぐらいしか思い浮かばないけど。
$$helloとかじゃねーの?
自鯖で、レンタルホスティングする為にWEB上から自動でユーザーにアカウント・パスワードを発行 ・アカウントの編集管理が出来るプログラムはありますか? 登録インターフェイスはXoops見たいな感じで、登録したアカウントでレン鯖にアクセスできるようなのが 理想ですが、それに近いものはありますか?
>>497 自分で組めるくらいの鯖管じゃないと信用できないよ。
何のアカウントか 何にアクセスするのか による
>>489 Linux鯖で、xrea見たいに、垢登録フォーム・垢/鯖編集ができるcgi/phpベースのインターフェイスです。
そのインターフェイスでftp/sql/pop等の垢の作成編集が一括で出来るようなものが公開されてますか?
>>487 クレクレ君なら、市販のコンパネ。
オープンソースのコンパネプロジェクトも
開発途中だけどあるから、ハック&コミットしたら?
板的には、作れば?で終わりのよーな。 スレ的には、PHPかCGIかはっきりしろよ、と。 金で解決するなら、HDE controllerなどがある。10万前後するが。 つーか本7作ってやれよ。サーバ総合ソフトウェアはまだか?
確かにこんな香具師が管理してる鯖を借りたかねーわな。
すげー。 詳しいな。
495 :
494 :04/02/23 21:06 ID:???
スマソ、誤爆った
foo.php/abc/ のように abc の部分をGETで送りたいんですけど、 普通にやるとfoo.php?name=foofoo になってしまいます。 どうすれば送れるようになりますか?
setcookie("hoge",$value,time()+30*24*3600); とすると$value内の日本語が化けて記録されてしまう…(URLエンコードかな そのあと呼び出すと当然のように化けたまま表示されてしまいます… 記録する前にエンコードかした方がいいですかね?
500 :
496 :04/02/24 00:14 ID:???
>>497 読んでみましたがわかりませんでした、、、
具体的に教えてくれるともっとありがたいのですが、、、
代替案としてPOSTで渡してheaderで自分自身にリダイレクトさせる方法があるのですが、
スマートではないので、、、
>>499 2chのCookieはそのまま記録されてますね…これはCGIだからなのかなぁ
>>500 オイラも
>>497 のを最初見て ??だったが、たぶんPATH_INFOを使った例が
載っていたからでは無いだろうか?
>>496 に書いてあることはPATH_INFOでできるので それについて調べてください。
503 :
nobodyさん :04/02/24 01:31 ID:PiGP/tke
SQLで取得したデータ持たして そのデータをPHPで他のSQLに持たせるのは可能でしょうか? たとえば A | B --+-- A | 3 B | 3 C | 1 D | 2 SQLでこういうデータを取得して、B部分だけを抜き出して一時テーブルに保持して A | B| C --+-----+-- A | 大阪| 3 B | 東京| 3 C | 愛知| 1 D | 福岡| 2 上記のようにそれを違うSQLで取得したデータに持たせることは可能でしょうか? PHPで取得データの保持とそのデータの他への応用って可能でしょうか? 上記だけならSQLだけでも可能でしょうけど、いろいろしたいので教えてください
できるよ。
506 :
496 :04/02/24 01:57 ID:???
>>502 わからないです、、、
どーやれば ? が / になるのだろうか、、、
form から foo を送ると、
foo.php/jp/?foo というかっこわるいURIになってしまいます、、、
オレには何を言ってるのか分からなかった... orz もう(´・ω・`)ネルッ
寝ようと思ったら被ってしまった。
>>506 for.phpで $_SERVER['PATH_INFO'} を見てみんしゃい。
apache2だと設定の変更が必要だったかも。
printfとかの書式で整数の出力時に 123,456 みたいにコンマ振ってくれるのってありませんか? マニュアル見てもそれらしいの無かったのでやっぱ関数作らないとダメでしょうか?
continue って 作用するのは while, switch, foreach だけで if文には全く関係ないって解釈であってますか?
>>510 continueはループを続けるってことだから、ifもswitchもループじゃない。
ただphpではswitchでcontinueが使える。
FORTRANはどこでも使える > CONTINUE
514 :
509 :04/02/24 11:51 ID:???
>>511 なるほどー、既にこういう関数があったのですか
助かりました。ありがとうございました
515 :
nobodyさん :04/02/24 14:19 ID:sR64u7cO
質問させてください。 とあるPHPスクリプトからのHTML出力を、ある条件をつけたときには ブラウザには表示させずにそのままの形でファイル(??.html)に書き込む、 ということをやりたいのですが、可能なのでしょうか? 可能なら、やり方を教えてください。 よろしくお願いします。
>>515 出力制御関数を使えば可能だが、
ブラウザに何も送らないわけにはいかないよ。
517 :
515 :04/02/24 15:24 ID:???
>>516 ありがとうございます!こんな関数もあったのですね。
他のスクリプトから、このHTML出力スクリプトをrequireすることで
うまくいきました。
518 :
nobodyさん :04/02/24 15:28 ID:QPqIXSv0
以前この板で拾った下のPHPカウンター使ってるんですが、週に一回ぐらい壊れます。 もう少し堅牢に出来ないでしょうか? <? $log = './all.dat'; $now_date = gmdate("Ymd", time()+9*3600); $yes_date = gmdate("Ymd", time()-15*3600); $dat = file($log); list($key, $yes, $tod, $all)=explode("|", $dat[0]); if($key == $now_date){ $tod++; }else{ $yes = ($key == $yes_date) ? $tod : 0; $tod = 1; } $all++; $new = implode("|", array($now_date,$yes,$tod,$all)); if( !($fp = fopen($log,"w")) ) { print "Error";exit; } flock($fp,2); fputs($fp, $new); fclose($fp); $yesterday = sprintf("%0"."7"."d", $yes); $today = sprintf("%0"."7"."d", $tod); $total = sprintf("%0"."7"."d", $all); if(0){ $yesterday = outhtml($yesterday, $yes_path); $today = outhtml($today, $day_path); $total = outhtml($total, $all_path); } ?>
ちーけー
>>519 教える能力がないなら余計なこと書くなカス。
>>518 気になんのは、lockが効いたかどうか全然見てないのと、
lockを解除してないところだが、スクリプトの終了で
自動でlock解除もされたっけ?
そもそもflock使えんの?その環境で
>>523 質問スレだしな。回答すら流れないでいいんじゃね?
>>518 拾い食いなんかするから、お腹壊すんだよっ
こないだあった「昨日今日カウンタ」とロック周りが同じじゃん。
このスレをちょい遡れば参考になるレスがあるよ。
>>526 ファイルクローズでロック解除。
ま、スクリプト終了時点で開きっぱなしのファイルも
クローズされるから、スクリプト終了で自動解除はあっているけど。
flockは使った事無いな ディレクトリ使ってロックしてる
PHPでexecコマンドを使ってシェルスクリプトを実行したいのだけれど、 実行することが出来ません。 exec以外に、shell_exec、systemを使ってみたけれどこちらも駄目でした。 シェルスクリプト以外に、たとえば /bin/date などを使ってみた場合はうまくいきます。 しかし、/bin/bash file.sh とやっても動きません。 環境はlinuxです。Webでアクセスされた場合に動きません。 コマンドラインで実行すれば動くのだけれど、どんな原因が考えられるでしょうか? php.iniを一通りみたけれど、それらしき設定は見つからなかったし、 permissionを777などにしてみてもやはり駄目でした。 どなたか心当たりのある方がいらっしゃれば、どうかよろしくお願いします。
実行しないってエラーとか出てないのかよ。 たぶん、フルパスで書けば解決しそうな気がするが。
エラー出てないのかねぇ
解決しました 実行はされていたのですが、そのスクリプトはecho文でlogに出力するスクリプトでした。 その出力先のファイルが644となっていたために、出力に失敗していて、 私はそのログをみて実行されたかどうかの判断をしていたために毎回失敗していると思い込んでいました。 だからコマンドラインphpで動かした場合には成功していたわけですね… 考えてくださった方々、ありがとうございました
phpのfopenで出力するファイルの属性を666にしたいのですが、 どのようにすればよいのでしょうか? 自分で作成した後にchmodを実行する以外に方法があれば教えてください。 ちなみになぜこんなことをしたいかというと、複数のユーザーで ひとつのディレクトリに同じファイルを読み書きする状況が出てきたためです。 よろしくお願いします。
>>538 ありがとうございます。
ぐぐったつもりでしたがAPIを見つけられなかったのは私のミスでした。
スレ汚しすみませんでした
ローカル(Windows98+PHP4.1.2)から、外部のサーバーが存在するか 確認したいのですが、タイムアウトが効きません。 php.iniのmax_execution_timeになってしまうようです。 $fp = fsockopen("$HOST",80, $errno, $errstr, 10); if (!$fp) { echo "Error: $errstr ($errno)<br>\n"; } else { echo "O.K."; } socket_set_timeoutを使うと、socket_set_timeout() is not supported in this PHP build in となります。 他に方法はないでしょうか?サーバーがない時、すぐにエラーが返るだけでよいのですが。
>>540 相手サーバがhttpなら
$fp = fopen($url,"r") or die($url."OPENエラー");
でいいんじゃね?w
すみません ソースをZendEncoderみたいにエンコードして 使えるフリーのやつってありますか? 探し回ってるんですけど有料のものしかなくて
>>541 サーバーが存在しないと、エラーが出るまで30秒くらいかかるんですよ。
>>542 Pecl にある bcompiler とか。でもどれぐらい解析されやすいのかとかは
知らない。
MMCache にもそういう機能がついてるみたいだけど開発中止になったんだ
っけ?
>>542 PHPの場合、エンコード→隠蔽用途だから
フリー(ソフトウェア)とは相容れない。
なんでエンコード掛けたいの?
printf等の書式設定時に%5dとか、桁数を設定して出力させたいのですが "%5d"など、いきなり%から書き始めると、足りない桁数分がスペースで補完されません "+%5d"などといったように、%の前に何か書かれていればきちんとスペースが入るのですが・・・ %の前に何も書かずに桁数を指定することは不可能なのでしょうか?
541です
>>543 スレッド使えればsleepとかあるんだろうが
iniいじるしか合いんかなー
スマソ俺の手には負えません
>>546 そんなことないみたいだけど
他にどっか要因があるんじゃないのかな?
php -r printf('%5d',100);
550 :
546 :04/02/25 03:57 ID:???
>>548 >>549 レスありがとうございます。おかげで原因分かりました
>>549 さんの仰るとおりPHP側の出力としては問題なかったです
HTML側の解釈として、「文頭のブランク文字は省略、複数回続くブランク文字は一文字として扱う」
という仕様があるようで、それが働いて半角スペースが見えていなかっただけでした
<pre>タグを用いることできちんとパディングできていることが確認できました
結果的にスレ違いの質問でしたね。お騒がせしてすみませんでした
おそらく既出なFAQと思いますが、3年ぐらい前のphpのソースを引っ張り出してきて 久々にphpをいじりだしたのですが、多くの変数がUndefined variableエラーを出して います。 おそらく $_GET[]みたいにphp.iniの初期設定が変わったものだと思うのですが どの設定を変更したらいいのか教えてください。
質問させてください。 formで数値だけを入力させたいのですが どのような正規表現つかったらいいのでしょうか?
553 :
552 :04/02/25 04:59 ID:???
↑小数点を含む場合もあります よろしくお願いします
>>551 register_globalsだったら超FAQなので、解決方法は自分で検索汁
>>552 if (!preg_match('/(\d\.)+/',$str)) { exit('数字だけですよ"); }
とか'/[\d.]+/'とかじゃないの?
つーか、両方共基本中の基本のような気が・・・。
is_numericでも使ってれば?
>
>>555 漏れもそう思うけど $_POST は文字列として渡されるから注意が
必要だね。
557 :
542 :04/02/25 06:47 ID:???
>>544 ありがとうございます
ちょいと調べてみます
>>545 ソースごと向こうの鯖に収めることになりまして
そこでソースを隠蔽したいのです
>>551 error_reporting = E_ALL & ~E_NOTICE
NOTICEレベルのエラーは全てでなくなるけど、
Undefined variable以外に何が出なくなるのかしらね。
>>557 Java や C# にはフリーの難読化ツールがいくつかあるよね。
PHP も海外を探せばありそう。
でも、ビジネスっぽいから Zend くらい買ったら?
561 :
nobodyさん :04/02/25 11:11 ID:jlmfpUqh
header("Content-Type: application/octet-stream"); echo $bin; $imageにはバイナリデータが入っています。 これでダウンロード出来る様にはなったんですが、 拡張子がphpになってしまいます。 拡張子を指定することってできませんか?
>>561 拡張子だけじゃなくて、ファイルネームごと指定する。
header関数のマニュアル下の方にサンプルがあります。
勉強がてら #! c:/perl/bin/perl #カウントファイルの読み込み open(FILE, "+<./count.dat") or die("エラー:カウントファイルを開けません"); eval{flock(FILE,2);}; $count = <FILE>; #カウントファイルの書き込み seek(FILE, 0, 0); print FILE ++$count; close(FILE); #サーバー出力 print("Content-type: text/html\n\n"); print("<html>"); print("<head><title>counter</title></head>"); print("<body>$count</body>"); print("</html>"); っていう簡単なカウンター作ってみたんだが SSI以外で表示させるにはどうすればいいんでしょうか? もちろんCGI単体では表示させられるんですが HTMLの中に組み込むときに どうすればよいのかがわかりません・・・ どなたかアドバイスいただければと思います。
>>557 やっぱり仕事上の話だよね。
ならZend日本の40万はともかく、本家ZendのEncoderの価格$960や
それがキツイぐらいの売り上げの会社ならZend's Small Business Program
(Studio+Encoder+ZPS)の$295とか充分ターゲットだと思うけど?
あとionCubeの隠蔽だけなら$199からあるし。
>>557 ところで「ソースごと向こうの鯖に収める」で
一部か全部の中間コード化ってその契約上大丈夫?
「プログラムごと納品」なら問題ないと思うけど。
567 :
nobodyさん :04/02/25 14:16 ID:h/l6ygFQ
ブラウザを開いていなく、指定した時間になるとプログラムを自動的に 実行させたいのですが、どのように書けばいいのでしょうか? # ってか、できます? よろしくおねがいします。 PHP MySQL バージョンはちょっとわかりませんが、おそらく最新版か1個前のバージョンだと思います。
肝心のOSについて書いてない。
unix系だったらcron使えば? 単語の意味が分からなかったらそれぞれ調べてね
570 :
567 :04/02/25 14:32 ID:h/l6ygFQ
>>568 さん、すいません。
鯖はLinux(RedHat8か9)です。
>>569 さん、調べてみます。
>>567 スタート - アクセサリ - システム - タスク
から、「タスクの追加」をクリック
ことごとくバージョンがわからないのが謎
WindowsNT系ならATコマンド。 同じく使い方は調べてね。 Windows9xは…捨てろ。 そういう常駐ツールは存在するけどね。
574 :
567 :04/02/25 14:56 ID:h/l6ygFQ
PHPのバージョンはわかりました。
4.3.3です。
>>569 さん、これは、管理者に相談しないとちょっと怖いですね。
ありがとうございます。
>>572 さん、何でかというと、管理者が教えてくれないし、いま、外出してるからです。
>>571 さん
>>573 さん、これはクライアント側ですか?
575 :
void :04/02/25 14:59 ID:uSQhE76+
あるPHPのソースを見ていたのですが、 解らないことがあるので教えてください。 FormのActionが記述されていないのですが、 ちゃんと画面遷移しています。 おなじフォルダにincファイルがあるので、 何らかの方法でこれを差替えていると思うのですが、 メインとなるphtmファイルを見るかぎり、どうやって それをおこなっているのか解りません。 何かサーバの設定とかなのでしょうか? 教えてください。
>>575 ごめんなさい
俺が無知なだけなのかも知れないけど
何言ってるか分からないんですが
577 :
void :04/02/25 15:18 ID:uSQhE76+
index.phtmというファイルがあります。 formはあるのですが、actionの指定がありません。 つまり、 <form method="POST"> となっています。 これだと自分自身が呼ばれるので、 index.phtmに処理が記述されていると考えたのですが、 とくにそれらしい記述はありません。 <?php ?> で囲まれた部分がありません。 でもちゃんと動いています。 同じフォルダにabc.incというファイルがあり、 submit後に表示される画面の内容のhtmlタグが入っていました。 どのようにすると、このようなことが出来るのでしょうか?
<? ?> で囲まれた部分ならあるとか。 preload 指定されてるとか。
>>575 .phtm ファイル内の記述はphp の文法に則ってるんですね?
>>577 やり方はいろいろあるけど例えばこうとか。
<?php
if ($_REQUEST['do']) {
include('abc.inc');
}
else {
echo '
<form>
<input type="submit" name="do">
</form>
';
}
?>
headerかもね?
そのソースがあれば一番なんだけどね・・・やっぱ無理?
584 :
578 :04/02/25 15:50 ID:???
>>580 よく読んでから書けよ
>>582 そうそう preload じゃなくて prepend やった
簡単な形態素解析のようなアルゴリズムって無いでしょうか? 茶筅のような大がかりなものじゃなくて、数十文字の文章から単語を抜き出したいだけなんですが。
>>585 やっぱりある程度辞書が必要になってくるんじゃ
>>586 そうですか。
正確さはべつに必要ないので、強引に平仮名とか句読点で区切っちゃうしかないですかね。
588 :
nobodyさん :04/02/25 22:53 ID:qA/BVeIY
GETメソッドでクエリーを取得するため、$HTTP_GET_VARSを使ってます。
例えば、
http:// 〜〜〜/hoge.php?test=aaa&bbb=ccc と送信された場合、
$test = $HTTP_GET_VARS['test']とすると、$testには "aaa" しかセットされませんよね。
私の場合、"aaa&bbb=ccc"までを$testにセットしたいのですが、
可能でしょうか?
((((;゚∀゚)))ガクガクブルブル
>>588 を読んで、
(こやつ、できる!)
と思わずブルったのだろう。俺も正直、手の震えが止まらん…
>>588 無理。必要なら&を別のものに置き換えて渡すか、
QUERY_STRINGを使って自分でパースしてください。
ところで、 $HTTP_GET_VARS使ってるのは"後方互換性"のためだよね?
593 :
nobodyさん :04/02/26 00:14 ID:uhZP0+AH
あからさまに初心者質問でごめんなさい。
しかもタイミングよく588と似たような……。
$_SERVER['QUERY_STRING']でqueryを取得して、そのqueryで分岐させたくて、
いろいろ本屋サイトで調べてみたのですが、いまいちよくわかりませんでした。
例えば、
http://..../example.php?old&no=xxx $_SERVER['QUERY_STRING']==old&no=xxx
# xxxは任意の値
とあった場合、xxxの値を取得して、値と同じ名前のファイルを外部から取り込んで、
http://..../example.php?old $_SERVER['QUERY_STRING']==old
もしくは、
http://..../example.php $_SERVER['QUERY_STRING']==
である場合は、指定したファイルを呼び出したいと思っています。
自分で、preg_match関数を使ってどんどん分岐をしていったのですが、
xxxの値があった時もquery==oldの時も(queryが存在しない時以外は)途中までは同じ
htmlソースを使いたくて、そのたびに記述していったら非常に汚いソースになってしまいました。
正規表現のほかになにか良い方法などありませんでしょうか?
>>593 正規表現は私の不得意とするところなので別解で。
QUERY_STRINGを&でexplodeした後に処理するか、
isset($_SERVER['old'])とかを見て判断してやるのではいかんのか?
あんまし汎用性高くする必要性が上の例では感じられないのだが。
596 :
nobodyさん :04/02/26 02:23 ID:uhZP0+AH
>>595 >あんまし汎用性高くする必要性が上の例では感じられないのだが。
いろいろ試してみて、上手くいかなくて投げやり的に正規表現を使用していたので……
自分の今の力量ですぐに理解できる前者の方で頑張ってみます。
確かにexplodeで分解すると簡単にできそうですね。盲点でした……
助言ありがとうございました。
597 :
nobodyさん :04/02/26 10:44 ID:3mQmPQ0x
文字列の最後の1文字を取り除きたいのですが、そういう関数ありますか。
599 :
nobodyさん :04/02/26 12:05 ID:ksQWsPHP
URLの?以降の文字列(index.php?testの"test")を変数に挿入する方法ありますか?
>>599 PHP触ってまだ三日目の漏れが答えていいのか知らんが
$hoge = $_SERVER['QUERY_STRING']; でいいんじゃね?
ただ、これだと挿入じゃなくて代入になるけど
601 :
599 :04/02/26 12:44 ID:???
602 :
nobodyさん :04/02/26 13:45 ID:3mQmPQ0x
>>598 これでいいですか?
$hoge = substr( $hoge,0,strlen( $hoge ) - 1 );
604 :
nobodyさん :04/02/26 14:19 ID:M1QEfwdl
>>599 IDすげぇな・・・それ見せるためにわざわざ質問しにきたとか?
>>603 質問の意味が良くわかりません。"これ"ってなによ
606 :
nobodyさん :04/02/26 14:36 ID:z064P9BQ
>>600 「mod_rewriteってなにすか?」とか
「ErrorDocumentディレクティブってなんすか?」
とApache屋に丁寧に聞いてこい。
菓子折持ってくのわすれんなよ
で
607 :
606 :04/02/26 14:38 ID:???
下げてないし、相手も間違ってる すまん >> 600
>>602 $hoge = substr( $hoge, 0, - 1);
でいいよ。
>>588 $test = $HTTP_GET_VARS['test']."&bbb=".$HTTP_GET_VARS['bbb'];
612 :
599 :04/02/26 17:38 ID:ksQWsPHP
IDがPHPか〜
613 :
アノニマス :04/02/26 17:46 ID:gHwSOwmQ
こんな感じに表示したいのですが、どうやればいいのでしょう? 0番目 | 1番目 | 2番目 | 3番目 | ★0 | |★0 |★0 | <TABLE> <TR> <TD>0番目</TD> <TD>1番目</TD> <TD>2番目</TD> <TD>3番目</TD> </TR> <TR> <?php $option = array(0,2,3); もし、$option の要素に0があれば、<TD>★0</TD>と表示する。 なければ、<TD></TD>と表示する。 もし、$option の要素 に1があれば、・・・・ と続きます。 ?> <TR> </TABLE>
大きなファイルがHPにアップできないので分割しておいてます。 訪問者に10個のファイルを一つずつ落としてもらうのも何なので ワンクリックすればそのページのファイルが全部落ちるといったような PHPスクリプトはどう組むのでしょう? これってもしかして難しいですか・・・?
IEだったら保存用のダイアログが10個開くの? ほとんどブラクラのような気がする。 接続数の制限で全部は開かないかもしれないけど。
あんまりPHPと関係ないけど Header('Content-Disposition: attachment; filename="file.tgz"'); Header('Content-Type: application/octet-stream'); mb_http_output('pass'); passthru("tar zcvf - $files"); とか。
619 :
nobodyさん :04/02/26 18:32 ID:XV2YqqHa
PHPで、gethostbyaddrを使わずにIPアドレスだけでアクセス制限を やりたいのですが、ネットマスクとかAND演算とかをやるというところまでは なんとなくわかったつもりですが、具体的なやり方がわかりません・・・ 参考URL等でも良いので、どなたかご教授くださいm(_ _)m
620 :
nobodyさん :04/02/26 18:35 ID:3mQmPQ0x
Header("Content-disposition: attachment; filename=hoge.csv"); Header("Content-type: application/octet-stream; name=hoge.csv"); print "aaabbbb"; 今こうやって、ボタンが押されたらcsvがダウンロードされるようにしているんですが、 名前がhoge.csvに固定になってしまっています。 よく右クリックで対象をファイルに保存する時みたいに、 ダウンロードする人が自分でファイル名を変更できるようにしたいのですが、 どうやればいいでしょうか。 (スレ違いかもしれませんが、他にどのスレで聞けばいいですか)
>>620 ボタンを押すときにファイル名を入力してもらうってのは
<input type=text name=filename>
<input type=submit value=download>
Header("Content-disposition: attachment; filename=$_POST[filename]");
622 :
620 :04/02/26 20:51 ID:???
う〜ん、確かにそれで結果は同じになりますが、 ちょっと格好がつかないですね。。。
他にどうせいっちゅーねん
>>620 クラインアントのファイルシステムで無効なファイル名を指定したら
強制的に付替えのダイアログがでてこねぇか?
>>620 使ってるブラウザの動作設定の問題だろ。
Firefox0.8だけど、620のままでダイアログ出るぞ。
出さないで自動ダウンロードにも設定できるけど。
hoge.phpというスクリプトがあり、hoge.php?p=1というクエリーでページ制御が できるようにしてあります。 ですが、PHP4.2でクエリー無しのhoge.phpだけで実行すると$p = $_GET['p']が ある行で『Notice: Undefined index: p in(略』というエラーが出るようになりました。 これは回避することが出来ないのでしょうか。
>>626 issetで定義済みかどうか調べてから代入したらいい。
たとえば、
p = isset($_GET['p']) ? $_GET['p'] : 0 ;
もしくは、
>>558 のようにエラーメッセージを出さなくするか。
クエリーを受け取るときの質問です。
クエリーの取得には$SERVER_['QUERY_STRING']を使っています。
「
http:// 」が「http%3A%2F%2F」のような形(呼び方が分からない)で
送信されてきた場合、「
http:// 」に変換する方法がありましたら教えてください。
629 :
628 :04/02/26 22:37 ID:???
>>628 で出した「http%3A%2F%2F」は一例です。
他の文字列の場合もあります。
よろしくお願いします。
631 :
628 :04/02/26 23:04 ID:???
>>630 ありがとうございます。
URLエンコードって言うんですね。
名前が分かったらGoogleで山ほど検索できた・・。
セッションハイジャックを防ぐために、IPアドレスをチェックしたい んですが、ここらへんを自動化してくれるものってありますか?
>>632 フレームワークの中でそういうのが入ってたの見たことあるけど、
部品単位で機能だけ取り出せるような感じじゃなかったな。
どっちにしてもIPアドレスをセッションハイジャック対策に
使うと環境によっては、特に会社でGWを使ってると、結構コロコロと
変わるから不味くない?使ってる例見たときも思ったんだけど。
>>633 フレームワークでもクラスライブラリでもいいんですけど。
一応携帯用のサイトなんでとりあえず問題ないかなと思いました。
とりあえずフレームワークの有名所を調べてみることにします。
635 :
nobodyさん :04/02/27 09:21 ID:I20yjkiJ
配列が空かみたいのですが、countして0を確認するしかないですか?
636 :
nobodyさん :04/02/27 12:20 ID:JIboYdLB
Cで言ったらatoi VBだったらcintな関数ってなんですか?
637 :
636 :04/02/27 12:24 ID:???
自己レス キャストするだけでいけました。
>>637 わざわざcastしなくても大抵自動的に変換されるよ
自動ほど怖いものはない
640 :
635 :04/02/27 15:54 ID:I20yjkiJ
だれかー
>>640 聞き方が悪いと思われ
countで何が問題?
想像だが is_array_empty() みたいな関数が欲しいんだと思う。自作すれ。 function is_array_empty($array) { return count($array) }
count($array) の何が気に食わないのか? 別に無駄なところないと思うけど。 あと、配列として定義済みなのかなどを調べたいときは、 is_array()とかisset()とか...
>>642 ワロタ
お茶、ちょっと吹いちまったじゃねえか。
>>642 ワラタ…けど要はそういうこと(ラップ)か?
・$arrayが配列なのかチェック
・TRUE/FALSEで返す
648 :
635 :04/02/27 17:19 ID:I20yjkiJ
perlだったら、 if(@hoge)で確認できるじゃないですか、 そうやって一発で確認できないのかと思ったのです。
質問です。 ユーザーのIDをクッキーに暗号化して保存したいのですが、 クッキーのIDを次回読み込んでそれがDBにあれば OKにしたいのですが、暗号化されたのを元に戻さないとだめですよね。 元に戻すにはどうしたらいいんでしょうか。
>>649 暗号化にcrypt関数使うのなら複合化は無理
DBから読み出したIDにも同様のcryptかけてそれと一致するかで判断するとか
if(count($array)) は一発じゃないと、君は。
>>648 $hoge = array();
if(!$hoge) echo "hogeは空です";
でどうよ
perlでのコンテキストのような仕組みは無い。ってことでいいんじゃないの? 言語変わればやり方も変わる、 同じようなことをやりたきゃcount()使え、と。
>>642 激しくワラタ
functionの後で改行するなよw
え?functionの後の改行は却下でつか?
なんでそんなに642が笑えるのかわからない。
>>648 まあ、別言語だしな。PHPとPerlは使われ方は似てるけど、
意外と思想は違うので調べてなけりゃ無いもんだと思いねぇ。
関数の山の中からその内見つかるかもしれんが。
ああ、ついでにスライスも無いから(困りはせんが)。
$aaa = array("a","b"); $bbb = array("c","d"); $ccc = array($aaa,$bbb); // 多次元 print $ccc[0][0]; こうやっても参照できないのですが、なぜでしょう。 Array[0] こうなっちゃいます。
>>660 うちでは[0][0]=a ,[0][1]=b, [1][0]=c, [1][1]=dになってるが?
print_rとかvar_dumpを使ってみてはどうだろうか
663 :
660 :04/02/27 20:16 ID:???
サーバーの都合でPHP4.06なのですが関係ありますかね。
>>663 Array
(
[0] => Array
(
[0] => a
[1] => b
)
[1] => Array
(
[0] => c
[1] => d
)
)
665 :
nobodyさん :04/02/27 23:53 ID:PRGZH4lM
Perlには"ラベルつきブロック"というものがありますが、 PHPでこれにかわるものはありますか? また、ない場合、どんなアイデアで代用できますか?
>>653 僕の思いを聞いて下さい。
●初回
1:ユーザーがIDとパスワードを入力
2:DBのIDとパスワードと照合
3:OKだったら、クッキーに暗号化したIDとパスワードを記録して、ログイン
●2回目以降
1:クッキーを読み込む
2:クッキーの暗号化されたIDとパスワードを複合化して、それがDBのものと一致するか調べる
3:DBにあったらログイン
これじゃダメでしょうか。
暗号化する関数と複合化する関数をできれば教えて頂きたいのですが、お願いします!
複合化するには種が必要だと思うんですが、じゃぁ種は決まったものをずっと使うって事ですかね。
なんだかperlから移行してきた厨房くさい質問が多発してますが Perl使い = UNIXハカー というのはやはり幻想だったのでしょうか?
668 :
496 :04/02/28 00:49 ID:???
●初回 1:ユーザーがIDとパスワードを入力 2:DBのIDとパスワードと照合 3:OKだったら、クッキーに暗号化したIDとパスワードを記録して、ログイン ●2回目以降 1:クッキーを読み込む 2:「クッキーの暗号化されたIDとパスワード」と「DBのIDとパスワードを初回のときと同じアルゴリズムで暗号化したのも」を比較 3:DBにあったらログイン でいいやん。複合化できるもんなんて危ないやろ・・・
670 :
669 :04/02/28 00:53 ID:???
>>669 訂正。
これだと、全部暗号化して比較するので無駄だ。
だから、クッキーには、IDはそのままで、パスワードだけ暗号化すればよい。
そして、クッキー読んで、そのIDのパスワードを暗号化して、比較
これでいいと思う
復
>>666 なんでそんなことをする?
素直にセッションを使った方が安全。
673 :
672 :04/02/28 01:07 ID:???
×セッション ○セッションID
674 :
666 :04/02/28 01:14 ID:???
ありがとうございます。
まず、セッションの使い方が今のとこあんまりわからないのが1つです。
もう1つは疑問なのですが、
クッキーは凄くどこでも使われてるやり方ですよね。
ヤフーもクッキー使ってますよね。
(調べたところヤフーはクッキーを許可していないとほとんどサービスを受けられない)
その安全だと言われるセッションをなぜ使ってないのでしょうか。
いわゆる、ショッピングカートの類いもほとんどクッキーを使ってたりしますよね。
>>670 確かにそれだとうまくできそうです。
もう1個質問していいですか。
クッキーの保存の仕方ですが、IDとパスワードを保存する時、
ひとつのクッキーネームにIDとパスワードを繋げて保存していいですか?
値=「hogeId,hogePassword」
みたいに。
で、クッキーを読み込んだ時、explodeでカンマで区切るみたいな。
でもこれだとIDかパスワードにカンマが入った時、データがおかしくなっちゃうんですよね。
それともIDとパスワードは別々に保存した方がいいんでしょうか。
PHPに関係なくてごめんなさい。
でもあんまりこういうのが解説されてるページ見当たらないのでどうか教えて下さい。
つまりセッションが何か、そもそもわかってないということですな。先は長いよ。
>>666 良く判らんのだが1回目(生)だろうが2回目(暗号化)だろうが
経路で漏れた場合は一緒ではないのか?ワンタイムパスワードならともかく。
人が考えるパスワードは類推されやすいので、それを防ぐ程度にしか効果ない。
で、cookieで保存してる暗号化済みのパスワードがユーザによって
削除されたらどうするの。復帰用に1回目の暗号化前のIDやパスワードが使える?
だとしたら、これも意味ないよね。まあこれは自動応答メールで最初に
設定したアドレスに送るようにすれば良いかな。暗号化されてないメールという
手段を使うのは、はばかれるが。
結論として一般的な方法(SSLやハードウェアキー)使ったら?と思うんだけど
>>674 セッションIDを保存するのにも場所が必要。それに普通はクッキーを使う。
携帯とかクッキーに対応してない場合はURLにセッションIDを埋め込む。
あと普通はクッキーに重要な情報は危険だから保存しない。
一般的な認証の手順は
1. ログインフォームを設置して、ユーザー名とパスワードを入力してもらう。
2. パスワードはmd5()とかを使って復号化できない形式で保存しておいて、
今回送られてきたパスワードをmd5()で暗号化して、それと比較。
3. 正しかったらセッション変数に認証済みであることを記録して、認証が必要な
ページでは、そのフラグがたってるかチェックするようにする。
# $_SESSION['auth'] = TRUE; とか
4. オンラインショッピングなどのシステムを運用する場合にも、クッキーには
セッションIDだけ保存しておいて、買物かごの情報なんかは全部セッション変数
に保存する。セッション変数は /tmp 以下のファイルやデータベースに保存され
るので(つまりサーバ側)、クッキー(クライアント側)に保存するよりは安全。
>>660 仕様書を読んで来い……と言いたいところだったけど、
俺自身、仕様書に記述が見つけられなかったので
以下コピペ。
http://jp2.php.net/function.array から。
wojprzy at enternet dot pl
08-Sep-2002 03:30
In reply to
[email protected] (22-Aug 2002). Instead of:
<? echo "Blam blam $blah[0][1]" ; ?>
try:
<? echo "Blam blam {$blah[0][1]}"; ?>
Works ok :). Regards, Wojtek
>>677 >2. パスワードはmd5()とかを使って復号化できない形式で保存しておいて、
これはDBに保存するってことですか?
そうすると生のパスワードが参照できなくなっちゃいますよね?
<?php import_request_variables("GP", "rv_"); if ($rv_hoge) { print "$rv_hoge"; } else { print "no hoge"; } ?> 上記コードで hoge.php?hoge= や hoge.php?hoge=0 ならいいのですが hoge.phpを そのままリクエストすると Undefined variable: rv_hoge in ファイル名 とエラーが表示されます register_globalsをOnにすれば問題ないようなのですが、WEBやマニュアルからはOffの 方が好ましいらしいのでOffでも問題の無いコードを知りたいのですが、どのように記述 すべきでしょうか?
>>679 生のパスワードを参照できなくても困らない。
もしユーザーがパスワードを忘れたら新たにパスワードを設定して通知する。
>>680 その問題はこのスレだけでも3度目だ。
ttp://www.php.net/manual/ja/language.types.array.php#language.types.array.foo-bar PHPマニュアルの"配列ですべきこととしてはならないこと"について質問させて下さい。
phpバージョン: 4.3.4
この文章中のコード例で、定数を配列のキーにするくだりで、
> // 検証のため、定数を定義してみましょう。
> // fruitという名前の定数に値'veggie'を代入します。
> define('fruit','veggie');
>
> // ここでは、出力が異なることに注意して下さい。
> print $arr['fruit']; // apple
> print $arr[fruit]; // carrot
とあるんですが、
print $arr[fruit] はまるで警告なく動くように書かれてるんですが、
これ本当は、Undefined indexが出ますよね?
で、解決策は「isset()を使って変数がセットされているか事前に確かめる」で合ってますか?
>>682 両方とも正しい動作です。
変数は正しくセットされています。
エラーや警告などは一切出ません。
>>682 >これ本当は、Undefined indexが出ますよね?
試せば 分かると思いますが、出ません。
なぜなら、その直前で
define('fruit','veggie');
されているから
print $arr[fruit];
は
print $arr['veggie'];
と同じです。
・・・これを説明する為にこの部分はあると思うのですが?
PerlかPHPを学ぼうと思うのですが二つに大きな違いはありますか? PHPに出来なくてPerlに出来る事、その逆はあるのでしょうか?
tes.php?mode=00&path=00 のようなURLの一部をシンプルにすることはできないでしょうか? 何か良い方法があれば教えて頂きたいです。
687 :
430 :04/02/28 14:04 ID:???
mod_rewirte
>>685 違う言語なので、やはりそれぞれ出来ることと出来ないことがあります。
個人的にはPerlは職人的な記述が可能(自由度が高い)な反面、
学習の際にそういったコードを参考にしないといけないこともあるので、
プログラミングを学習するという目的ならPHPやPythonを薦める。
一度基礎ができてから後で他の言語を学ぶのは、0から始めるより容易です。
#勿論Perlでも学習者が理解しやすいようなコードも書くことは可能であるが。
本当はプログラムしたことないなら、最初にJavaやRubyでOOPな体を
作っとくと良いと思うけどね。
>>685 perl/tkとかあるし俺はphpを覚えるよりperl覚えてたら良かったと思った・・・
更に言うとperl/phpよりjavaしてたらもっと良いとも思った
リンク先がクリックされたらカウントするにはどうしたらいいでしょうか? 誰かご教授お願いします。
PIDの取得はどうすればできますか?
<a href="jump.php?
http://... ">リンク</a>
jump.phpでカウントする。サニタイズを忘れずに。
693 :
686 :04/02/28 18:45 ID:???
誰か教えて下さい。
687 :430 :04/02/28 14:04 ID:??? mod_rewirte
example.com/a example.com/b example.com/c こんな感じでパラメータを指定をしたいって話か? 的を射ない質問では真っ当な答えを得られないのは 当然と思うが。
>>686 tes.php?0000で良いんじゃないの。
あと呼び出し側と受け取り側で工夫しとけば。
700 :
PHP :04/02/28 20:40 ID:TGb1vyYW
質問させて下さい。 PHPでHTMLからPOST形式のデータを受信する場合、 グローバル変数をどのようにすれば受信出来ますか? Perlの場合は$ENV{'CONTENT_LENGTH'}で受信出来るんですが PHPの場合はどのようにやればいいでしょうか? あとPHP(Perlでも同じですが)でデータをGETで送信した場合、 URL欄に送信した内容が映ってしまいますがURL欄に 表示される内容のみ暗号化するにはどうすればいいですか? こちらの環境はApache/2.0.48 (Win32) PHP/4.3.4です。 以上、宜しくお願い致します。
$_ENV{'CONTENT_LENGTH'} かな。 暗号化とやらはできません。
? $_ENV ??
704 :
686 :04/02/28 21:47 ID:???
>>696-699 tes/00/00/
というのが理想です。
php.tesをhtaccessを使って tes/
にする方法は分かったんですが、
?mode=00&path=00 がどうにもできません。
>>704 君帰って良いよ
そしてもう来るな・・・
urlencodeのことだと思われ。
でもまた来ると思うよ
711 :
626 :04/02/28 23:24 ID:???
>>704 3回目だっけ?もっと多い気がしてきた・・・
713 :
700 :04/02/28 23:45 ID:???
>>701 どうやら違うようです。
>>703 一つ目のページに記載されている$_POST['name'];というものを使えば
POSTを受信し表示させることは出来ましたが変数に代入するには
どうすればいいでしょうか?
変数inに代入しようと思い、以下のようにやってみたんですが何も代入されませんでした。
$in = $_POST['name'];
どうすればいいんでしょうか?
>>713 代入のために「$in = $_POST['name'];」は間違ってない。
その直前直後の両方の値をvar_dump()でも使ってチェックしてみ。
おーい。ちょっとバカな子の質問聞いてくれるかな? 無理ならいいです。すみません。
無理
フォームに名前を入力し送信すると入力先の条件が表示されて 名前の欄に記入がないとエラーを返すようなプログラムを作成しています。 まず、htmlで入力フォームを作成します。名前(name)を入力し 送信ボタンを押すとcheck.phpに移動します。check.phpには下記を書いているとします。 <? if($name or ""){ print "あなたのお名前は"; print "$name"; print "です。"; ?> <form method="POST" action="./check.php"> <input type="submit" value="もう一度"></input> </form> <? }else{ print "名前が入力されていません。"; ?> 最初に名前を入力して送信すると、最初のif内の条件が表示されるのですが しかし”もう一度”ボタンを押すと「名前が入力されていません」になります。 この場合の対処法はありませんでしょうか?やはりエラーチェックは 最初の入力画面でする方がいいのでしょうか?
>>717 check.phpの中のformで$nameの値をhiddenで埋め込めばよい。セッション使っても良いけど。
チェックの話は、hiddenだろうがなんだろうがformで渡って来るのを受け取る度に
チェックするのが普通。それか最初はスルーして、最後だけチェックするか。
hiddenやreadonlyの値でも幾らでも変えられるからね。
なんか基礎が出来てないようだから、最初に一冊簡単なWebアプリの
作例が載った本買う方が良い。
PHPでログファイルを取り込む関数ってどういう記述をするんでしょうか? require_onceでいいのでしょうか? perlでいうとopen(DATAFILE,"$file_log")のような処理です。
fopen?
>>719 Perl
open(DATA,"$file");
@data=<DATA>;
PHP
$fp=fopen("$file","r");
while(!feof($fp)){
$data[]=chop(fgets($fp));
}
このくらいは調べてほしいもんだ。
$data = file($file);
>>721 これ見るとPerlの方がファイルオープンは簡単だね
>>724 PHPのfopenはURLも開けるガナー
Perlでopen(DATA,"
http:// ・・・");
開けません、、なんて泣くことはない
>>722 のノリでfgetcsv($file,適当," ")てのもありかな
727 :
nobodyさん :04/02/29 14:18 ID:tS63OhT8
入力された文字がEUCの半角カナのみかチェックしたいです。 整数のみのチェックは正規表現でできました。 ^[0-9]+$ 整数のみの正規表現 EUCの半角カナのみの正規表現は?
>>727 EUCで半角カナの文字コードの範囲を調べる。
それを正規表現にする。
マルチポストしてまで聞く内容じゃねえな
729 :
nobodyさん :04/02/29 14:58 ID:xPZed6Wk
誰か取得した日付をcheckdateにかけて真なら配列変えて 月日が1桁なら数値に0をつけて2桁にして 最終的に年月日の順にしたプログラム書いてちょ
>>729 そこまで分かるなら自分で書いたほうが早いだろ。
なんで聞く?
こうですか? $str = checkdate($m,$d,$y) ? sprintf("%04%02%02",$y,$m,$d) : false; わかりません。
732 :
729 :04/02/29 15:09 ID:???
なんか今日は暖かくて気持ちいいんでやる気がありません >731 おおー。試してみる
PHPって中のパr
734 :
685 :04/02/29 16:54 ID:???
>>688 解説どうもありがとうございました。PHPから始めてみようと思います。
けどPHPに絶対に出来なくてPerlに出来る事ってあるのですかね?
PHPはWebに特化している。
>>736 parse_urlを使ってみるといいかも
厨な質問ですみません クラス書く時のクラス変数って varでいちいち宣言しなくても使えるような気がするんですが (変数の初期化はコンストラクタでやるとして)、 あれって何のために定義するんですか?
というか、ちゃんと宣言してやるほうが強固なアプリになります。 まぁ、インタプリタはあんま関係ないか・・・
普通の変数が宣言してなくても使えるのと同じ。
742 :
739 :04/02/29 18:36 ID:???
744 :
nobodyさん :04/02/29 19:42 ID:WEm9qIiD
多重ループについて、入れ子のループから一気に親のループを抜けたいと思っています。 for($i=0;$i<100;$i++){ for($j=0;$j<100;$j++){ if($aaa[$i] == $bbb[$i][$j]){ // ここの処理でループを抜けたい } } } perlだったらlast LABEL みたいにできるのですが、 PHPで同じことをやってみたらエラーになりました。 同様の処理をするにはどのように記述スレば良いでしょうか?
壊弐
748 :
736 :04/02/29 20:08 ID:???
>>737 ありがとうございます。
parse_urlで最初の処理できたんですね。
["path"]の部分を1階層毎に上がって行く部分を、
文字列関数かarray_chunkでやろうと思うんですけど、
これ以外にいい方法がありませんか?
749 :
744 :04/02/29 20:18 ID:???
750 :
nobodyさん :04/02/29 21:08 ID:r4smmvq+
eregとかpregじゃなくてstr_repalaceでマッチングさせたいんだがみつからん…だれか教えてください
752 :
nobodyさん :04/03/01 07:37 ID:wL4abq3r
馬鹿な事聞くのかもしれないけど
>>722 の何がいけないの?
掲示板のログファイルの取得にはfile使ってるんだけど。。
753 :
752 :04/03/01 07:43 ID:wL4abq3r
ちなみにスキンファイルにはfile_get_contents使ってるんだけど。。
>>752 722じゃないけど、fileで問題ないと思うよ。
読み込みたいファイルのサイズにも依るだろ 俺はfileみたいにファイル丸ごとメモリにロードする関数は好かん
>>756 で、
>>722 を釣り認定?
もともと、
>>721 でも全て読み込んでるやん。
phpの場合はwhileブロック内で処理できるけど、
perlの@data=<DATA>;と同等な処理はfile()だろ。
ファイルサイズに因るというのは同意だが、
許せるサイズなら、一発で読みきった方が速い。
掲示板のログ取得にfile()は妥当なのだろうか?
>>759 2ちゃんのログデータくらいだったら余裕
ログがでかいと無駄にメモリ食う
762 :
nobodyさん :04/03/01 12:12 ID:Yathn1RH
PHP+Postgresなのですが、 DBはS-JISで作ってデータもS-JISで登録しています。 で、PHPもS-JISで作っているのですが、 文字化けしてしまう文字があります。「エプソン」とか。 文字化けを無くすにはどうしたらいいでしょうか。
>>762 ソ\噂欺圭構蚕十申貼能表暴予禄饅 など、2バイト目に'\'(5C)がくるような文字を使うのを止める。
>>762 何でPHPをSJISで作るの?マニュアルにSJISには対応してないって書いてるのに。頭おかしいんじゃない?
767 :
764 :04/03/01 12:44 ID:???
768 :
nobodyさん :04/03/01 12:47 ID:Yathn1RH
えーと、PHPというよりも、 Postgresにデータを登録してそれを見る時点で既に文字化けしてるんで PHPはあんまり関係ないかもしれません。
769 :
766 :04/03/01 12:52 ID:???
>>767 --enable-zend-multibyte でコンパイルし、php.iniで正しく設定すればスクリプトをSJISで記述できます。
で、どっちかちゅうと、PostgreSQLはSJISで格納できないはず。ただしこちらも設定でSJIS<->EUC変換を
DB側でやってくれるので、見かけ上SJISのまま登録することは可能。
770 :
764 :04/03/01 13:06 ID:???
>>769 あれ?いつからできるようになったの?
マニュアルが追いついていないってこと?
771 :
766 :04/03/01 13:13 ID:???
>>768 mySQLでも「ソ」は化けます。Postgreでも通じるか分かりませんが
エスケープシーケンス置いて「\ソ」にすることで文字化けを回避できてます
というかスレ違いの気がする
>>768 だからぁ
Shift_JIS固有のトラブルであり超FAQだっつーの!!
顔洗ってこい
>>767 頭おかしいんじゃない?
君にPHPの内部エンコーディングを解説してもらいたいYO!
775 :
764 :04/03/01 13:41 ID:???
頭おかしいんじゃない? ↑ これ流行ってんの?
>>770 PHP3でもsjis使えるけど・・・。
すみません、別人ですがまた5C関連(mb)について質問です。
$mailto = 'さんま<
[email protected] >';
$mailfrom = 'こなか<
[email protected] >';
$mailsubject = '(メール件名です)';
$mailbody = '(メール本文です)';
mb_send_mail($mailto,$mailsubject,$mailbody,"From: $mailfrom\nReply-To: $mailfrom\n");
としてメールを送信すると正常なメールがきます。ところが
$mailfrom = 'みーたん<
[email protected] >';//5C
と変更すると差出人名が化けます。$mailtoでも同様に化けました。
boolean mb_send_mail ( string to, string subject, string message [, string additional_headers [, string additional_parameter]])
mb_send_mail()でもtoやadditional_headersはmb_convert_encoding()などする必要があるのでしょうか?
あるいは差出人名や宛名にマルチバイト文字は含ませないのがいいのでしょうか?
環境はApache/1.3.29 (Unix) PHP/4.2.2 SJIS記述です。
>>778 mb_language("Japanese");
って、ちゃんとしてる?
>>779 あ、してません。。。
ずっとmb_language() を知らずやってませんでした。
勉強になりました。ありがとうございます。
>>780 mb_language("Japanese");だけで済むはずだが、
老婆心ながらもう一ついっとくと、
mailのヘッダフィールドは
mb_encode_mimeheader()
を使って変換汁。
何度もすみません。
>>778 ,780です。一応ご報告。
Japaneseがカレント言語になっていたようで
mb_language("Japanese");
だけでは文字化けは解消されませんでしたが
差出人等の名前部分をmb_encode_mimeheader()する事で
文字化けは解消されました。皆さんどうもありがとうございました。
783 :
nobodyさん :04/03/01 15:03 ID:fvE2mlcV
初歩的な質問ですいません。 文字変数$hensuの中に'変数'という文字が含まれている場合に $flagを-1とする場合の判定方法を教えてください。 PHPが4.1なのでmb_eregは使えません。
>>782 あれ、mbstring関係の設定を正しくしていれば、一つ一つ変換しなくても
出来ていたような気がするのだが...違ったか?
>>783 $flag=(strstr($hensu,'変数')!==FALSE)? -1 : FALSE;
PHPって、 if($hoge) { $hoge = $hage; return true; } else { $hoge = $hige //この行のセミコロンが抜けている(*1) return false; } のようなスクリプトの場合、$hogeがtrueの場合でも、(*1)の文法エラーを 指摘して、warningを吐くじゃないですか。 それはつまり、スクリプトを処理する場合に、全体をまとめて文法チェックを しているということですよね? だから、ifとelseの処理が大規模になる場合で、それぞれ別々のファイルに 分割できる場合は、一つのファイルの中でifを用いて条件分岐をさせずに、 別々のファイルに分けて処理をさせた方が良いのでしょうか?
>>784 三項演算子キモイからやめてくれません?
if文で書いてください
>>786 黙ってstrstr()使えよ
気に入らない部分があるなら脳内で変換しろや
そんなくだらないことで脳を働かせたくない。 回答側が書式を変えればいいのです
( ゚д゚)ポカーン
>>788 なんでお前みたいなクレクレ野郎の為に手間かけにゃいかんの?
ヒントくれるだけ有り難く思えや
これはちょっとやらせ臭すぎ。
HTMLファイルに 1) <? print ("<p>テスト</p>\n"); ?> とやると正常に出力されないんですが、 2) <p><? print ("テスト"); ?></p> と変更すると正常に出力されます。 拡張子をhtmlのままで、1)を出力する方法はあるのでしょうか? 今日PHP入門書を購入してきたのですが、printの ( ) の中にHTMLタグを含めることができないとか、 拡張子をphpにすれば、動作するようなことが書かれていないので、 判断に困っています。 また、ブラウザからソースを表示させた際に、phpのソースが丸見えというのは、なんか怖いのですが、 どう対応したらいいですか?
>>794 拡張子をphpにすれば動くのが判っているなら、そうすればいいじゃん。
> また、ブラウザからソースを表示させた際に、phpのソースが丸見え
拡張子がhtmlなら、そうなるだろうね。
慣れるまでは下手なことをしようとせずに、とりあえずマニュアルに従っておいた方がよさげ。
>>794 それはpタグの機能であってPHPにこれっきり関係ない。
帰れ
797 :
795 :04/03/01 20:12 ID:???
一番肝心なことを忘れていた。 > 拡張子をhtmlのままで、1)を出力する方法はあるのでしょうか? 普通は、無理(普通じゃないのはどんなケースか、とかは訊かないように)。
>>794 HTMLだったら、テキストで表示されるんだからソースそのまま表示されて当たり前。
>拡張子をphpにすれば、動作するようなことが書かれていないので、
>判断に困っています。
そんなレベルのことは”言うまでもない”。こんな質問してるようじゃ先は長いよ
>>794 取り合えず"書名"出した方が良いよ。
本と言えどもウソ書いてないとも限らんし、どういうシチュエーションで
どういった記述なのか、持ってる人の中で判断つく人もいるだろうから。
(1)も(2)もPHPとして処理させれば、どちらも表示されるはずだけど?
794に書いていることを見るに、どうも(1)も(2)もPHPとして処理されてない
>ソースを表示させた際に、phpのソースが丸見え
のに、片方はPHPで処理されてると思い込んでいるフシがある。
最初から本に書かれている通りにやってごらん。
>>794 *.htmlで使いたいならhttpd.confでAddType。
皆さん、PHPはどの文字コードで書いてるか教えてください。 配布スクリプトは割とShift-JISで書かれていますが。
誰か、PHPでのクラス名やメソッド、プロパティの命名規則について解説しているサイトしらない?
>>801 コーディングはEUC
出力は、内容全部変数に入れて
最後にこんなの echo mb_convert_encoding($html,"SJIS","EUC-JP");
UTF-8ってDBで文字化けしないようになったんだっけ?
>>804 mb_http_output("sjis");
じゃだめなの?
>>801 今はEUCだけど、やっぱいつかはUTF8へ移行しなきゃならんかな。
>>802 PEARのコーティング規約に命名規約が載ってます。
>>806 MySQLは4.1.xからUTF-8をサポートしているね。
でも、それ以前のバージョンでもBLOB型にバイナリで入れればいいやん。
検索なんかもそのままできますよ。
811 :
nobodyさん :04/03/01 23:49 ID:H7Bp+/Po
質問です。ひょっとしてPHPの話ではないかもしれません。 フォームを作成してデータを登録するページを作成しています。 サブミットした後にブラウザの「戻る」で戻り、再度サブミットされるのを 防ぎたいと考えています。そこでフォームを表示するページでユニークな キーを作成し、hidden属性で登録プログラムに送り、登録ページでは そのキーのデータが登録済みかを判定することで所定の目的を達しました。 しかしインターネットでは同じようなページで、「戻る」を押した時にエラーを 表示(データの有効期限が切れたなど)するページがあることに気づいたの ですが、このようなページはどのように実現するのか、お知恵を貸してください。
>>811 |
| ('A`) セツメイスルノマンドクセ
/ ̄ノ( ヘヘ
とりあえず、あんさんが作った登録ページを表示後、
別のページに移って戻ると、[有効期限切れ]のページが
表示すると思うのだが。そこから推測汁。
>>807 それをスクリプトの先頭で明示すれば、自動的にSjisに変わるの??
ソースはEUC
--------------
<html>
<head></head>
<body>
<?php
echo "test";
?>
</body>
</html>
--------------
この場合、タグもsjisで出力されるならかなり便利だけど
mb_http_output("sjis");は<?php ?>の中だけでしょ?
814 :
794 :04/03/02 00:27 ID:???
>>795-800 どうもありがとうございます。
今参考にしている書籍は「[PHPプログラミング入門」と「今日からつかえるPHP4サンプル集」
習うより、慣れろでいろいろいじくり回した方が覚えるのが速いと思っています。
HTMLとPHPは同じファイル内に記述できると書かれていたので、
HTMLファイルを作って、一行だけのprint文にタグを含ませて実行したら、処理されなかったので、
「???」と思ったんです。
PHP日本ユーザーの会も調べてみたのですが、PHP文だけの時とHTMLタグが混合の場合の
注意点見つかりませんでした。また、実行させる際に、拡張子が「.php」と「.html」でPHPとHTMLの
記述方法がどう違うかという文も見つけられなかったので、質問をしてみました。
また、ファイルの拡張子が「.html」と「.php」で実行できるのかどうかという点については、
>>795 や
>>796 は、実行不可能という書き方だし、
>>799 や
>>800 は実行可能というし…。
また、
>>798 が
> HTMLだったら、テキストで表示されるんだから(PHPの?)ソースそのまま表示されて当たり前。
> ( )内は付け足しました
とあるけれど、サーバーサイドのスクリプトなのに、なぜ実行結果だけを残さない仕様なのか
そこら辺も知りたいです。
>>813 もちろん<?php〜?>の中外関わらず、sjisになるに決まってると思っていたけど。
タグって、sjis、EUC関係あんの?ASCIIでしょ?
>>814 簡単に書くけど、
.htmlはそのまま表示
.phpはphpが処理(スクリプトを実行)して表示。
普通の設定ではこうなる。
設定次第では、.htmlでもphpスクリプトとして処理可能だが、普通はしない。
phpスクリプトを実行したければ、拡張子はphpにしておけ。
>>814 一般論を言うと拡張子がphpじゃないとサーバは中身を見て処理をしてくれない
だから拡張子がhtmlの場合はそのまま表示されたわけだ
>>800 のいうようにちょっと工夫すれば拡張子がhtmlの場合でもphpとしてサーバに処理させることができる
でもふつうはこんなことしない
>>813 <?php ?>内外は関係ない。
ただ、mb_http_output("sjis")だけでいいかというとそうでもない。
出力バッファ周りの設定も関与してくる。
821 :
nobodyさん :04/03/02 01:33 ID:6XTR3yB6
PHP初心者ですが、下記の様なコードを実行すると <?php $a = 'a'; echo '<table><tr>'; $td = '<td class = "'.$a.'">bbb</td>'; echo $td; echo '</tr></table>'; ?> 結果 <table><tr><td class =" a">bbb</td></tr></table> となります。 <td class =" a">のスペースを取り除き <td class ="a">とするにはどうすればいいのでしょうか??
>>821 スペース入らないよ?
$td = '<td class = " '.$a.'">bbb</td>';
とかになってない?
823 :
821 :04/03/02 01:51 ID:???
ソースを再度確認しましたが、
>>821 で書いた通りでした。
何故だろう・・・
$td = '<td class = "'.$a.'">bbb</td>'; なら <td class =" a">bbb</td> ではなく <td class = "a">bbb</td> になるハズですよ
>>814 先ず「HTML(html)」と「html(htm)という拡張子のファイル」とは"違うもの"と理解してくれ。
HTMLはHTMLの規則に従いタグでマークアップされ、HTTPにおいて転送される際
(ブラウザでWebサーバのHTMLコンテンツを見た場合)には、text/htmlというMIMEタイプが指定される。
#本来これがtext/plainと指定されていた場合には、HTMLのマークアップをしてようが
#していまいが、送り手側は普通のテキストとして送ってきてるので、それを勝手にHTML
#として解釈するIEは欠陥品。
html(htm)の拡張子のファイルは、あくまでもそういった名前のファイル
というだけで、そこには中身がHTMLということとは関係がない。
a.htmlというGIF形式の画像ファイルがあっても構わない。
ただしOS(Windows等)では拡張子により、そのファイルの中身を類推して
扱いを決めるという仕組みがあることと、ApacheなどのWebサーバでは
特定の拡張子に関して一律に中身を定めて、それをブラウザなどに通知する機能がある。
この機能により、通常はhtmlやhtmの拡張子はtext/htmlのMIMEタイプで、
txtの拡張子はtext/plainで、gifの拡張子はimage/gifで出力などという設定されている。
その他にPHPの使える状態になっているWebサーバでは、phpの拡張子に
「PHPの処理を行った後に出力する」という設定がされている場合が多い。
(同様の設定が行われている可能性のある拡張子にはphtmlやphp4などがある)
このため、PHPを使うなら設定された拡張子(php)にしなさいという説明になる。
#htmlやhtmの拡張子だとPHPで処理する設定なっていないから。
826 :
821 :04/03/02 02:07 ID:???
今さらに気が付いたんですが、
<table><tr><td class =" a">bbb</td></tr></table>
の先頭にもスペースが入ってました。
一体何なんだろう??
>>824 すいません、
<td class = " a">bbb</td>
こうなります。
「HTMLとPHPは同じファイル内に記述できる」というのは、 PHPが処理する際に、HTMLの記述とPHPスクリプトが同じファイル内で混在していても 分けて処理(HTML部分はそのまま出力、PHPスクリプト部分はPHPが処理して出力) できるということであって、HTMLの中にPHPスクリプトが記述できるということではない。 HTMLの規則に<?php ?>なんてタグは無いでしょ(XMLは若干違うが) PHPでの処理の話なので「同じファイル」でのファイルはphp等の拡張子を持つもの。 [PHP入門]の中ではHTMLファイルという用語を使っているが、 最終的にtext/htmlのMIMEタイプで転送される元になるファイル程度に 読み直す感じかな。URLで指定して引っ張ったときに、ブラウザでは HTMLと解釈可能なファイル。「ソースを表示」ではHTMLのマークアップしかない状態。
>>814 「HTMLとPHPは同じファイル内に記述できる」というのは、
PHPが処理する際に、HTMLの記述とPHPスクリプトが同じファイル内で混在していても
分けて処理(HTML部分はそのまま出力、PHPスクリプト部分はPHPが処理して出力)
できるということであって、HTMLの中にPHPスクリプトが記述できるということではない。
HTMLの規則に<?php ?>なんてタグは無いでしょ(XMLは若干違うが)
PHPでの処理の話なので「同じファイル」でのファイルはphp等の拡張子を持つもの。
[PHP入門]の中ではHTMLファイルという用語を使っているが、
最終的にtext/htmlのMIMEタイプで転送される元になるファイル程度に
読み直す感じかな。URLで指定して引っ張ったときに、ブラウザでは
HTMLと解釈可能なファイル。「ソースを表示」ではHTMLのマークアップしかない状態。
長文の2重カキコ済まぬ
>>826 こうなります。じゃねえよ。
なぜ出力結果を始めからコピペしなかった?
コピペしなかった時点で>821は信憑性が無く、意味をなさないんだよ。
どうせ元のソースコードも間違ってるんだろ?
1からやりなおせ。ここでじゃなく自分でな。
>>830 >>821 の時点で出力結果書いてあるじゃん・・
>>823 でソースコードも再確認したって書いてあるじゃん
何でそんなに喧嘩腰なのかさっぱり分からんぞ
>>831 class属性の「=」の右側のスペースが
>>821 出力結果で無いだろ
>>831 で再度確認してるのに
>>826 で実はありました。と言ってる。
確かにおれの言い方は悪いが、再現されんソースコードを書くなと言いたい。
質問させてください
mb_language("Japanese")
$subject = "タイトル";
$text = "内容";
mb_send_mail($mail,$sbuject,$text,'From:
[email protected] ');
これでメール送信しても文字化けしてしまうのですが・・・
PHPのバージョンは4.3.3です
>>821 そんな筈ねーだろって試したら、aの前にスペース入って" a"になってた…
ブラウザのソース表示の所為みたいだよ。Firefox0.8(en)の表示だと
スペース入ってたけど、生HTTPやIEのソース表示では入ってなかった。
836 :
835 :04/03/02 07:04 ID:???
>>832 この場合(環境依存なれど)再現されるソースではあったが、
再確認してOKで、その後で実は…という下りは
文字だけのコミュニュケーションにおいては、念を入れるべきところだな。
特にスペル違い等とは違う性質のモンだからさ。
=以降のスペースが全てクォートに入ってしまうみたい。
仕様というよりバグっぽい挙動なんで、Bugzilla覗いて、
無けりゃエントリーしときますわ。
837 :
834 :04/03/02 07:55 ID:???
送られてきたメールのヘッダ部分を見てみると Content-Type: text/plain; charset=ISO-2022-JP となっているのですがなぜか文字化けしてしまいます うぅぅ…
>>834 文字化けって一言で思考停止しないで、
もちっと、どういう風(ビットが欠けてるとかエンコードが違うとか)
に文字化けしてるのか調べなよ。調べられるのは貴方だけなんだから。
それが判れば、まあわかった時点で自分でどこが変なのか
判ってしまうかもしれないけど、見てる方もどこが変だと指摘できるんだから。
思考停止してもいいじゃない どんどん質問しようよ
840 :
779 :04/03/02 09:21 ID:???
>>836 昨日の
>>778-782 でちょっと気になっていて試してみたんだが、
やっぱり、mbstring周りをちゃんと設定していれば、mb_send_mail()だけで
全て変換してくれる。当方スクリプトや内部コーディングは全てEUC-JP。
あと、
>>834 はtypoが2箇所。コピペミス?だとは思うのだが。
4.3.3 は、php.ini に [mbstring] mbstring.language = Japanese が入っていないと、ソースの中でmb_language("Japanese")って やっても文字化けします。
>>840 >>778 ,780,782です。度々ありがとうございます。
参考にしている書籍でもmb_send_mail()ではmb_encode_mimeheader()しておらず、
実はぼくもちょっと腑に落ちないところがありました。
当方借鯖(設定変更不可)でphpinfoを見る限りmb設定が最適化?されていないとも思えないので
このあたりがSJISの不都合な点かと解釈しました。(EUCではもちろん正常に動作)
とりあえず文字化け回避・SJIS記述する必要があるので
mb_encode_mimeheader()してごまかします。
>>782 で
>>779 さんの解決策が足りなかった、というような書き方になりすみません。。
843 :
814 :04/03/02 11:03 ID:???
>>817 >>818 >>825 >>828 よくわかりました。わざわざありがとうございます。
「当然出来ねえだろ」ではなく、理由を書いていただけて助かりました。昨日はこんなことで、3時間も
はまりましたので…。
今回HTMLファイルに直接PHPのスクリプトを書こうと思ったのは、PHPの処理による実行結果だけを
表示させたかったからです。
HTMLタグと混在にできるという話だったので、SSIみたいなことができるのかなと勘違いしていたんです。
# そういえば、SSIもファイルの拡張子は「.shtml」でしたね…
>>808 亀レスですがありがとうございました。
参考になりました。
845 :
779 :04/03/02 11:31 ID:???
>>840 の一行目
>>836 は
>>834 の間違い。スマソ
>>841 あぁ、そうかもしれない。一部共有借鯖でmbstringをまったく設定していない鯖があるのだけど、
その鯖では、mb_encode_mimeheader()してた。漏れが建てた鯖は全てmbstringをEUC用に
してあるので無問題。
>>842 別に気にしてませんので。
で、いちいち設定変えてまで検証する気にならないのだが、SJISの場合だと、
mbstring.language
mbstring.internal_encoding
mbstring.script_encoding
あたりをしっかり設定すればよさそうな気がしないわけでもない。
設定は .htaccessでも可能。(ini_setでも可能だが有効に働くかどうかは疑問)
#なにげに思い出したが、先日のアクセスカウンタの件はどうなったのだろう。
#なにも報告がないということは壊れていないということかな?
847 :
nobodyさん :04/03/02 12:28 ID:YK9hnlM3
非常にしょーむない質問で申し訳ありません。 PHP って文の途中で改行してもいいんですよね。 マニュアルにこのこと書いてありますか?
>>847 <?
echo
"
P
H
P
"
;
?>
こういう事か?
>>847 スペース(半角空白)を書けるところは、他のホワイトスペース(タブや改行)でも問題なし
$hoge = array("a","b","c"); を a,b,c という文字列にして変数に入れたい場合どうすれば簡単にできますか。 配列の数はランダムです。
>>850 適当なデリミタでくっつけて出力する関数があったよ
join
インプロード使え
$day = 1; $dayが一桁だったら "01" にしたいのですが、 そういう関数ありますか? もとから二桁だったらそのままです。
sprintf('%02d', $day);
file()って配列に入るんですね・・・
今作ってるプログラムは1行ごとに表示するのがないのでスカラ変数にガバっといれたいんですが
その場合は
>>721 みたいにwhileで中を$data.=ってするしかないんでしょうか
file_get_contents? 使ったことないけどな
>811 とは逆に有効期限が切れのページうぜー・・・ session_cache_limiter("public"); session_start(); でも出るんだけど何か解決法はないかな・・・ もうだめぽ
861 :
857 :04/03/02 21:21 ID:???
$tempr=""; $temp=file($file); for($i=0; $i<count($temp); $i++) $tempr.=htmlspecialchars(chop($temp[$i]))."\n"; こんなのでいいのでしょうか。for使うとなんとなくスリムじゃないような気がするのですが
PHPってjoinみたいな関数無かったっけ?
864 :
857 :04/03/02 21:57 ID:???
いんぷろおどぉ?
866 :
860 :04/03/03 00:24 ID:???
>>863 戻るでも再度読み込むようなのって無いんですかね(;;
867 :
860 :04/03/03 00:31 ID:???
>>863 流石にそれは・・・w
皆さんどうしてるんでしょうか?
868 :
860 :04/03/03 00:33 ID:gEMsGQ5h
連投すいません かちゅがバグった・・・つくづく(ry
$hoge[3] = "aaa"; print $hoge[3]; 指定した添え字の要素に値が入らないのですがなぜでしょうか。
<?php $hoge[3] = "aaa"; print $hoge[3]; ?> とだけ書いてあるPHPで出力を確かめましょう。 何も表示されませんか?
871 :
nobodyさん :04/03/03 10:19 ID:udhRxoh1
php4.2.3でGD使いたいんですが、php.iniの ;php_gd.dll の;を外して extentins_dir=/usr/local/src/php-4.2.3/ext/ に変更しても動作しません。どうすればいいでしょうか、、?
LinuxにインストールされているPHPのバージョンを 4.2.4-devから4.3.4へアップデートさせようと思うのですが 現在稼働しているプログラムの動作に支障はありますか?
まぁ、なんだ。春厨つうか新入社員か。 自分で調べる=ネットで聞く なのか。 大手ならまだ研修中だと思うのだが。 あ、そこそこの規模のところなら、PHPよりJavaやASPか。
ネットの中でも季節の移り変わりってよく分かりますね
>>871 明らかに間違ってるっぽいので、まず使っているシステム情報
(OSやPHPのインストールにはどういったパッケージを使ったか等)
を出してください。
>>871 よくわかりませんが、4.2.3ってphp_gd.dllってあります?
マニュアル見ると、下のように書いてます。
Windows版は前から付いてるのかな?
http://jp.php.net/manual/ja/ref.image.php 注意: PHP 4.3以降、GD libの付属版が付属しています。
この付属版にはαブ レンディングのようないくつかの機能が追加されています。
この版のコードは、より管理が行き届き、安定しているため、
外部ライブラリの代わりに使用されるべきです。
ちなみにWin + PHP4.3.4なら、 ;extension=php_gd2.dll ↓ extension=php_gd2.dll extension_dir = "./" ↓ extension_dir = "c:\usr\local\php\extensions" で、使えると思われ。 参考にせよ。 phpinfo(); でのチェックも忘れるな。
>>879 Windows版のZIP形式のフルパッケージには入ってた>GD
>>881 PHP4.2.3の頃にはGD2はない。
でもポイントは合ってると思われ。
883 :
882 :04/03/03 12:36 ID:???
>>881 ごめん、GD2はPHP4.2.3含めもっと前から添付されてたわ。
自分が互換性がないから使ってなかっただけ>GD2
setcookieを使うと、cookieに記録されるときとされないときがあります… setcookie("HOGE",$value_hoge,time()+7*24*3600); setcookie("MOGE",$value_moge,time()+7*24*3600); としてもMOGEが記録されなかったり、MOGEのところが空欄になって値だけ記録されたり…
>> 884 > クッキーは他のヘッダーを送信する前に送信 される必要があります。 setcookie()の前にechoとか、printとかやってない?
886 :
884 :04/03/03 13:16 ID:???
>>885 そう思って <? の直後にしてみましたが…ニントモカントモ
<?の直後だと$value_****に何も入ってないですタイ
どっかでtypoしてるかなんかの凡ミスだろ。 <?php $value_hoge="ほげ"; $value_moge="もげ"; setcookie("HOGE",$value_hoge,time()+7*24*3600); setcookie("MOGE",$value_moge,time()+7*24*3600); echo "<html><body>"; echo $_COOKIE["HOGE"]."<br>"; echo $_COOKIE["MOGE"]."<br>"; ?> だけで試してみ。 #一度目は何も表示されない。リロードして”ほげ”と”もげ”が表示される。
889 :
884 :04/03/03 13:29 ID:???
すいません、できました。 フォームにデータを入力→submitでPHP_SELFに返して、値が入っていたら記録としていたのを 別ファイルにsubmitしてそこで記録→headerで元のところに飛ばすとしたらOKでした。
「日本語」という文字列を Array = ( [0] = "日", [1] = "本", [2] = "語", ) みたいに一文字ずつ配列にしたいのですが、 簡単な方法はないでしょうか?
892 :
890 :04/03/03 14:32 ID:???
>>891 え??どうやるんですか?
explode("", "日本語")
は FALSE を返しますよね?
>>890 ほぼ、一発っぽく
for($i=0;$ar[$i]=mb_substr($a,$i,1);$i++);
894 :
893 :04/03/03 14:58 ID:???
文字列($a)に"0"が含まれるとダメじゃん_| ̄|○
895 :
890 :04/03/03 15:06 ID:???
>>893 >>894 お、なるほど。こうかな。
while (($ar[$i] = mb_substr($a, $i++, 1) !== false);
何だかインクリメントの評価順が直感的でない悪寒。
896 :
893 :04/03/03 15:09 ID:???
>>895 それだと永久ループしねぇか。
あと、$iが初期化されてないのも嫌だし。
素直に外に出す。
for($i=0;mb_substr($a,$i,1)!==FALSE;$i++)$ar[$i]=mb_substr($a,$i,1);
897 :
893 :04/03/03 15:18 ID:???
>>896 あっと。これでいいのか。
for($i=0;($ar[$i]=mb_substr($a,$i,1))!=NULL;$i++);
898 :
890 :04/03/03 15:19 ID:???
>>895 >>896 じゃーこうだ。
$i = 0; while (($ar[] = mb_substr($a, $i++, 1) !== false);
最後に余分なメンバができるけどw
これで永久ループするんなら
>>896 のソースでもループするような気が…。
for($i = 0;$ar[$i] = mb_substr($a, $i, 1) and $ar[$i] !== false; $i++);
900 :
893 :04/03/03 15:26 ID:???
>>897 で漏れも気づいたんだが、
型チェックする場合、mb_substrはあくまでstring型を返すみたいだから、
FALSEじゃダメなんだよ。
最後の余計な要素を省くには、やっぱ外出さないとだめだな。
つーか、漏れも暇だなw
901 :
890 :04/03/03 15:33 ID:???
>>900 なるほどね。でも手元で試したら動いたんだけどなぁ。
まぁいいや、おつきあいサンクスコ。
for($i = 0;$ar[$i] = mb_substr($a, $i, 1) and $ar[$i] !== ""; $i++);
903 :
nobodyさん :04/03/03 16:44 ID:jgAMw7EM
可変変数なんてよく使いますか? ややこしくなるだけのように思うんですが。 それから、どういう場面で使うと便利なんですか?
>>890 こんな手段もあるかな。
$str = '日本語';
$arr = explode("\n", mb_ereg_replace('(.)', "\\1\n", $str));
print_r($arr);
改行部分の扱いをどうするかが問題かもしれないけど。
>>873 多分不正なSJISコードとか、削除されます。
i-modeとかの絵文字は消去。
>>871 あれ、extension=はWindows上で動作する時のみ
関係あるディレクティブだと思ったけど、
extentins_dir=/usr/local/src/php-4.2.3/ext/ の
指定の仕方だと違うOSのようにも見えるな。
つまるところ
>>878 な訳だが。
908 :
878 :04/03/03 20:45 ID:???
>>907 そもそも/usr/local/src/php-4.2.3/ext/という、
如何にもWindowsでなさそうなOSな感じでありながら、
・dllを指定している
・ディレクトリをsoでなくsrcの入ってるところを指定している
という駄目駄目満載なので、徒労の前に訊いてみた。
909 :
nobodyさん :04/03/04 14:58 ID:G8TumMOx
VBのRight$のような関数はありますか?
そろそろ、○言語で言う○○っていう関数ありますか?がウザイ
913 :
nobodyさん :04/03/04 16:58 ID:SI8u2VDD
2ちゃんねる用語で言うあぼーんのような関数ありますか?
abone('107616315',913);
>>913 直接はできないけど、自作functionをarray_walk();で呼べばいいんじゃない?
array_filter() だな。
>>911 個人的に同意するが別にスレの趣旨に反する訳じゃないのでスルーしとけ。
918 :
void :04/03/04 21:14 ID:NlcfFdxs
CGIの引数の扱いについて教えてください。 通常は呼び出し側で、たとえば name という変数を設定している場合 echo($_POST["name"]); でCGIの引数を確認できると思います。 しかし、もし呼び出されるときに直接URIを指定された場合、 PHP Undefined index: name というエラーになってしまいます。 これを回避する方法を教えてください。
919 :
nobodyさん :04/03/04 21:29 ID:SI8u2VDD
!empty($_POST['name']) || $_POST['name'] = ""; としておく。
920 :
401 :04/03/05 00:04 ID:???
>>415 さんのように改造して、しばらくサイト運営していましたが
見事に壊れなくなりました。ありがとうございます。
律義な401タン萌え(;´Д`) ハァハァ
922 :
nobodyさん :04/03/05 03:36 ID:fxR/ujQS
新しく借りたレンタルサーバに、 従来のコンテンツを置いてみたのですが、 Call to undefined function: mb_convert_variables() と言われました。 phpinfoを見ると、configureは以下のようになっています。 ./configure' '--prefix=/usr/local' '--with-mysql=/usr/local/mysql' '--enable-mbstr-enc-trans--enable-mbstring' '--enable-track-vars' '--with-apxs=/usr/sbin/apxs' '--enable-mbregex' --enable-mbstringと書かれていますが、 スペースが空いていなくて''で区切られていません。 これは間違ってインストールされているということでしょうか? (phpは業者が最初から入れてくれていました)
>>920 タイミングが合えば壊れると思う。 ちゃちゃをいれてみる
>>922 業者のミスは業者に修正してもらうといいよ。
>>922 必ずしも現在入っているPHPの内容と、
phpinfoでのconfigure情報は一致はしなけど、
mbstring系でエラー出てて、phpinfoにも表示が無いなら
configure情報の表示の通りのが原因だろうね。
926 :
922 :04/03/05 06:22 ID:???
やっぱりインストールミスだったんですね。 業者に頼むと待たされそうなので おのれで入れ直し、 無事エラーが出なくなりました。
>>920 401さん報告どうも。
壊れなくてヨカッタヨカッタ。< って人柱かよぉw
>>403 に書いていたが、やっぱり「PHPだから壊れる」って訳じゃないよなぁ。
928 :
nobodyさん :04/03/05 09:03 ID:GVN3A58S
文字化け?で悩んでいます・・・ テキストフォームで”松”という文字が正しく扱えません。 例えば、”松”1文字だけ入力した場合は 〜hoge.php?a=%8F%BC という形でhoge.phpに引き渡されますが、 PHP側で $a=$_GET['a'] とやっても、$aは空になってしまいます。 また、”松あ”のように”松”の後ろに文字がある場合は、$aは文字化けのような状態になります。 でも、例えば”あ松”のように”松”の前に他の文字がある場合は正しく扱えます。 これは何が原因なのでしょうか?チェックすべき点などご教授下さい。 ※携帯用のフォームなのでGETメソッドを使用しています。またHTMLはSJIS、スクリプトはEUCです
>>928 HTTP入力エンコーディング(SJIS)
→スクリプトエンコーディング(EUC-JP)の変換をどっかでしる!
> またHTMLはSJIS、スクリプトはEUCです ここが解っていながら、何故こんな質問をするんだ?
931 :
928 :04/03/05 09:57 ID:???
>>929-930 ひぇぇぇごめんなさい・・・肝心なことを書き忘れていました・・・
スクリプトの流れは↓こんな感じです
$a=mb_convert_encoding(trim(htmlspecialchars(rawurldecode($_GET['a']))),"EUC-JP","SJIS")
if ($a=="") {
※1
} else {
※2
}
で、hoge.php?a=%8F%BC (←”松”)のときになぜか※1の処理をしてしまいます・・・
”松あ”のときは※2の処理をします
932 :
928 :04/03/05 10:00 ID:???
↑すみません、タイプミスです。本来は$aの後ろにセミコロンついてます
>>931 質問とは関係ないけどrowurldecodeは自動でやってくれてるからいらない。
>>928 質問とは関係ないけどPOSTの使えない携帯ってあるの。
>>931 mb_convert_encodingこいつがじゃましてるんじゃない?
php側で勝手に変換してくれてないか
mb_convert_encodingの第3引数を mb_detect_encoding("元の文字") に変えてみるとか。
mbstring.encoding_translation = On これがOnになってると自動変換に失敗するときがある。
938 :
nobodyさん :04/03/05 11:31 ID:C7gv6RYy
スレ違い&厨な質問だったらすみません・・・ 今借りているレン鯖で、新規にMySQLをインストールしてもらいましたが、 phpinfoのConfigure が'--without-mysql' になってしまっています。 ですが、レン鯖業者に言ったら「それくらい自分で設定して」と言われてしまいました・・・ (知人の紹介でめちゃくちゃ格安で借りていて、本来有料のMySQLインストールも タダでやってもらったので、文句言えないのです・・・) SSHでサーバーに接続して、MySQL自体はちゃんと動いていることを 確認したので、PHPからMySQLへアクセス可能にするには どのようにすれば良いでしょうか? よろしくお願いします
>>934 質問者じゃないけどVodafoneでPOST使えない。
でもPOST指定しても勝手にGETに変換されるから、
別に問題ないような気もする。
変換は機種依存じゃないと思うけど、調べてない。
>>938 --without-mysql でコンパイルされてるんじゃ mysql 系の関数は
設定をどうがんばっても使えるようにはならないよ。
その鯖でシェル使えたりするなら自分でPHPインストールしなおせ
ばいいけど、FTPしか出来ないような状況なら管理者に言うしかない。
本来 MySQLが有料とのことなので、おそらく金払ってる会員用の
Apache には MySQL 関数が有効になった PHP がインストールされ
てるんだと思うけど。
>>938 phpinfoのConfigure情報は、PHP本体のConfigureオプションだから
ダイナミックロードとかされてるのは表示されないよ。
phpinfoのMySQLの項目は表示されてる?されてなかったら、
その業者の言ってる通り「自分でphp.ini変えて読み込ませろ」ってことかな。
設定はサーバ環境にもよるから、RHLでのRPMを使った場合の設定などを参考に自分でしる。
まあ格安の分だけ自分で努力すると言うことで。
昔は make distclean せずに configure し直しても Configure情報は 更新されなかったけど、今もそうですか? だとしたらそういう可能性もあり。
てめぇで、モジュールをコンパイルして、dl()汁ってことかも。
>>942 make distcleanしないとconfigureが(一部)反映しないだろ。
プログラム技術板に書いて板違いと言われましたので、こちらに来ました。 厳密に言うとPHPの質問とは言いがたいのですが、 この板には「スレ立てるまでもない質問〜」などのスレがないので ここで質問させてください。 PHPとapacheとpostgresという組み合わせで ブラウザ上からデータ入力、それを加工してブラウザ上で出力する というものを作りました。 この場合データの不正チェックはどこに入れるのがいいのでしょうか? わたしはデータ入力時のみ不正データチェックをしていますが、 やはり、画面へ出力するときもチェックをした方がいいのでしょうか?
>>944 お、あんたさっき見かけたよ!
そりゃした方がいいとは思うけど?
データ入力時のデータチェックは完璧だと言い切れるの?
>>944 板違いだろね>マ板
どういうのが定石判らんけど俺は基本的に影響を及ぼす可能性のある
直前でサニタイズしている。例えばSQLインジェクションはクエリの発行前に
(まあプリペア使うけど)、XSS系やブラウザの表示に影響を及ぼすのは
HTTP出力前に。RSS関係も出力前に。メール用に半カナや機種依存を
自動置換してるけど、これも直前。データの保持は出来るだけ加工前の
生の状態であることが基本としてる。
不正チェックといってもユーザによる一般的な適正値のチェックは
Javascriptでもやってるし、値を受けとった直後でも当然やってる。
>>944 扱うデータに因るんじゃね。
数値データをDBに格納するのなら、格納時=入力時にチェックしないと入らないだろうし。
当然SQLインジェクション回避も入力時に行はないと意味ないし。
XSS回避の為のhtmlspecialcharsは出力時でも構わない。
と、カキコ前にリロードしたら
>>946 が全て言っているわな。
ま、せっかく書いたので。
回答ありがとうございます。 いろいろ気をつける点が分かりました。 わたしの質問はもっと初歩的なものでして、 データ入力時にテキストフィールドにnullを入れるのは駄目なので それは、入力時にエラーとして出力する。 データ出力時にも、何か原因がわからないが、 DBの該当する項目にnullが入るかもしれないことを想定して nullデータが返ってきたらエラー画面を出す。 ということをするか否かと言うものです。 質問の仕方があやふやだったのが問題でした。
DBでセッション管理してるんでSQLインジェクション回避はセッション変数に渡す直前だな XSS回避は出力直前 システム上のデータチェックはフォーム側でJAVASCRIPTにて行い、php側で受け取った後にも行ってる 上の2人と同じ事を言ってるな俺
SQL淫ジェクションって何をエスケープしてる?
淫 貴方のIMEはエロい事ばかり学習してますね
952 :
938 :04/03/05 19:20 ID:???
>>940-943 今日ずっとUNIX関連の勉強をして、
なんとか自力でPHPの再コンパイル(!?)に成功したみたいです!
MySQLにアクセスできるようになりました!
御助言ありがとうございました
953 :
928 :04/03/06 09:06 ID:???
>>933-937 いろいろありがとうございます。
昨日から試行錯誤を繰り返していますが、今のところ
mb_detect_order("SJIS,EUC-JP");
を追加して、
$a=trim(htmlspecialchars($_GET['a']));
だけにした場合、例えば”松本”などの文字が正しく受け取れるようになりました。
ですが、相変わらず”松”1文字だけの場合は$a==""です・・・
>>937 さんの指摘の通り、mbstring.encoding_translation = On に
なっていました。
ですが、ini_set("mbstring.encoding_translation","off"); と書いても
変化ありません・・・
ちなみに、サーバーのmbsring の設定は
mbstring.detect_order=auto
mbstring.encoding_translation= On
mbstring.func_overload= 0
mbstring.http_input=EUC-JP,auto
mbstring.http_output= auto
mbstring.internal_encoding= EUC-JP
mbstring.language= neutral
mbstring.script_encoding= no value
mbstring.substitute_character= no value
引き続き何かアドバイスありましたらよろしくお願いします
>>953 なんじゃこりゃー。無茶苦茶杉。
php.iniを変更することはできるのか?
.htaccessで書き換えることができるのか?
955 :
928 :04/03/06 13:13 ID:???
>>954 php.iniの変更はできません・・・
また、.htaccess に
php_flag mbstring.encoding_translation off
を記述すると、サーバーエラーになります・・・困った・・・
>>955 php.iniのoverrideが禁止されてるんだろ、諦めれ
>>945 ちょっと気になったんだが、その言い分だと
データ出力時チェックも入力時チェックも同じようなもの使うだろうから
同じじゃないのか
結局のところ、入力時チェックにもれたものは
出力時チェックにももれるんじゃないのか?
出力時チェックは入力したデータが改ざんされたときか、
入力ツールがバグっているときに意味があるのあるのだろう。
XSS回避とかSQLインジェクションの話はおいておくとして。
>>948 >データ入力時にテキストフィールドにnullを入れるのは駄目なので
>それは、入力時にエラーとして出力する。
これはまあ、Javascript&入力値の確認の画面でやる感じだな。
>データ出力時にも、何か原因がわからないが、
>DBの該当する項目にnullが入るかもしれないことを想定して
>nullデータが返ってきたらエラー画面を出す。
これは要件による。例えばこのデータ出力を見る人がごく一般のユーザで
あれば極力エラーには遷移せずに、そのまま気にせずに動作が可能なようにし、
(何故なら一般ユーザにはDBがnullになるようなデータを生成できる権限がない→責任がない)
管理者宛にはログなりで通知する。データ出力を見る人が管理者に相当、もしくはエラーを
管理者に通知する行為を押し付けても構わないユーザ(社内の身内等)なら、
エラー画面に遷移としてもよい。
一般ユーザが「極力そのまま動作が可能」としたが、それが不可能だと
その後の行為がにっちもさっちもいかなくなるような場合はエラーで
「ごめんなさい」することもあるだろう。例えば何らかの原因で
DBMSに自体に接続できない等の状態のとき等。PHPの関数エラーを
そのまま出しちゃ駄目だよ。
>>955 スクリプト内で、http_inputやencoding_translationの変更はGETやPOSTに対しては多分無効。
「松」の字だけだと、正しく判別できないようなので、
GETされる文字列がSJISと判別されるように、
ダミー文字列を送るってのはどうよ。
hoge.php?dummy=%83_%83%7E%81%5B&a=%8F%BC
とか。
>>955 ウチの環境(Windows版PHP4.3.4(php4apache.dll))だと、
php.iniのディレクティブやhttp.conf内でのphp_flagでは使えるんだけど
.htaccessのphp_flagだと「php_flag mbstring.encoding_translation On」
が効かない。OnじゃなくてOff|0|1なら効くんだけどね。
register_globalsなどは普通にOff|Onの記述でも変更可なんだが…
(勿論AllowOverride Allだけど、どちらにしても設定値までは関係ないと思う)
ソース見ても
STD_PHP_INI_BOOLEAN(
"mbstring.encoding_translation", "0",
PHP_INI_SYSTEM | PHP_INI_PERDIR, (後略) )
で効かない筈はないんだが。
AllowOverrideで引っかかってるかは、他のmbstring系の値ではどうなるかを試した上で。
- php_flag mbstring.encoding_translation 0
- php_value mbstring.encoding_translation "Off"
(BOOLEAN値でもphp_valueは一応使える)
辺りでも試してみれ。
ところで、そもそもmbstring.encoding_translationが設定できない
PHP4.3.0より前のPHPを使ってないよな。phpinfoに値が出てるようだけど。
phpってなんですか?
963 :
928 :04/03/06 19:35 ID:???
>>959 ありがとうございます!!!!
その方法で解決しました!!!
目から鱗な方法で感動です
>>960 いろいろとやってみたのですが、何をしてもサーバーエラーでした・・・
AllowOverride で引っかかっている、ということですよね
あと、PHPのバージョンは4.3.4です
今更ながら気が付いたんだけど、PHP4.3.4ですら、 まだ0x5c (バックスラッシュ)を2バイト目に含む文字って禁忌なのね。 情けないことに半日もそれが原因でハマってしまった。 いい加減対応して貰えないものだろうか… 5.xってどうなってるの? っていうかこういうバージョン間差異についての話って、 このスレでいいのかな? PHPスレ多くて分からん。
>>964 スマソ、ボケるの忘れてた。
次から気をつけるw
968 :
965 :04/03/06 22:16 ID:???
>>967 _人人人人人人人人人人人人人人_
> な・・・・なんだってー!! <
 ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
_,,.-‐-..,,_ _,,..--v--..,_
/ `''.v'ν Σ´ `、_,.-'""`´""ヽ
i' / ̄""''--i 7 | ,.イi,i,i,、 、,、 Σ ヽ
. !ヘ /‐- 、u. |' |ノ-、 ' ` `,_` | /i'i^iヘ、 ,、、 |
|'' !゙ i.oニ'ー'〈ュニ! iiヽ~oj.`'<_o.7 !'.__ ' ' ``_,,....、 .|
. ,`| u ..ゝ! ‖ .j (} 'o〉 `''o'ヽ |',`i
_,,..-<:::::\ (二> / ! _`-っ / | 7  ̄ u |i'/
. |、 \:::::\ '' / \ '' /〃.ヽ `''⊃ , 'v>、
!、\ \. , ̄ γ/| ̄ 〃 \二-‐' //
どのバージョンから?
っていうかもしかして何か追加設定必要?
Win2k+Apache 1.3.29+PHP4.3.4Moduleで―(0x815C)含んでると、
エスケープしないとだめだったんだけど。
クォーテーションはダブルでもシングルでも。
ユーザーがcookieを許可している環境ではSIDがcookieに保存され そうじゃない時はURLに ?SID=hoge が自動的に付加されています。 下記環境でユーザーのブラウザ設定に関わらず、 cookieを利用させず、自動 ?SID=hoge にさせる事はできませんか? (会員専用ページでの会員認証が目的です) 環境はphp4.2.2、php.ini変更.htaccess使用の権限は共にありません。
>>968 要はスクリプトがSJISで書けるかどうかってことだろ。
>>762-771 辺り参照。
実際にSJISでスクリプトを書いたことがないので、
外していたらスマソ。
>>969 ini_set("session.use_cookies","0");
だったかな。少しはマニュアル嫁
972 :
nobodyさん :04/03/06 23:50 ID:dQC6QPhR
PHPの参考書を元にファイルアッププログラムを作ったのですが、 容量が大きいファイルはアップ出来ません。(1M以下くらいならOK) 何か設定があるのでしょうか?
upload_max_filesize
974 :
965 :04/03/07 00:04 ID:???
>>970 サンクス。
DB関係無いけど、Shift_JISメインのヘタレなんで、
config関係の情報は参考になります。
975 :
nobodyさん :04/03/07 00:20 ID:B00vxOxL
976 :
nobodyさん :04/03/07 00:22 ID:K16TCfHu
2chみたいに、IPを元にIDを生成するのは どうすればいいでしょうか?
>>971 ありがとうございます。確か出来たハズ、と
マニュアルや書籍でsession_*関数ばかり探してました・・・
ref.session.phpに出てましたね。失礼しました。
>>976 トリップもそうだけど、crypt()を使っている。
解説サイトはググればでてくる。
979 :
nobodyさん :04/03/07 00:58 ID:5eFwPDAz
classとかいうやつの使い方がよくわからないのですが、 なんの為に使うのでしょうか。 あとどんなプログラムにもそれは必要ですか?
>>965 正直、前段後段の余計な変換でスピードが遅くなるのに
PHPスクリプトをSJISで書く奴の気が知れない。
(PHPで使っているZendEngineのコア自体はSJISには対応してない)
スクリプトはEUCか、まあ一番良いのはUTF-8なんだけど、それで書いて
必要なページについてはHTTPの出力変換でSJISにしなよ。
相手が低機能のケータイだろうが問題ないよ。
982 :
nobodyさん :04/03/07 07:32 ID:kp9cCllH
EUCで統一する方がよっぽど楽だと思うが。
984 :
nobodyさん :04/03/07 11:34 ID:jKMO9RlN
perlだと変数を定義していなくてもそのまま処理できたのですが
PHPだと変数が未定義ですとエラーが表示されてしまいます。
具体的に言うと、フォームからデータを送り、GETメソッドで取得し
$modeにregistやdeleteなどの文字を格納するようにしたいのですが、
$modeになにも入ってないとき、つまり
http:// 〜〜〜/test.php
とかでアクセスしたとき、$modeが未定義と出ます。
PHP.iniのほうでエラーを表示しないようにする方法があるのは分かるのですが、
そうしちゃっていいのでしょうか?
何かいい方法はないでしょうか?
985 :
984 :04/03/07 11:35 ID:???
すいません。新スレに移動します。
いや、来なくていいから。
>>986 〜〜〜 (;´д`)ノ ソ・ソンナ・・・
>>984 定義しておけばいいだけの話。
echo $mode = !empty($_GET['mode']) ? $_GET['mode'] : ""; //undefined index errorは起きない
このスレで何回目だ、この質問? ↑これも
>>990 質問した奴がまとめてレスするのが相場だと思うが?
まあサマリが必要とは思わんが、前に質問した香具師がどんどん
回答側にまわる流れができてない。成長する椰子がすくねぇ昨今。
へえ〜、相場だったのかあ。 質問する奴がまとめるのかあ・・・。 そりゃblogだろっ!
993 :
991 :04/03/08 04:31 ID:???
>>992 相場つうか、基本的に質問した奴以外に
「質問の回答として欲しかったもの」かどうか判らないだろ。
回答者は回答はできるが、それ=解答じゃない。
勿体無い部分はあるが2chのスレでサマリを義務的にまとめる
必要はないとは思う。前の質問者が回答者になる、つまり人の
頭の中にストック出来てれば本当は充分。
だから「流れのサイクル」が欲しい
994 :
991 :
04/03/08 04:37 ID:??? >>992 ところで、質問する奴がまとめたりしてる?>blog
そんなblog見たこと無いんだが。たまに独断的なアンケートして集計してるの
ぐらいは見たことはあるけど。でもそれは広範囲なアンケートにならないから、
限られた価値にしかならないよね。密度は濃いかもしれないけど。