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見たこと無いんだが。たまに独断的なアンケートして集計してるの
ぐらいは見たことはあるけど。でもそれは広範囲なアンケートにならないから、
限られた価値にしかならないよね。密度は濃いかもしれないけど。