【PHP】下らねぇ質問はここに書き込みやがれ 54
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/09/09(日) 12:42:57ID:64tYOx8RPHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレ、関連スレ、FAQなどは>>2-10辺り
◆前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 53
http://pc11.2ch.net/test/read.cgi/php/1188047468/
◆質問する時の注意
・ 自分のIDを表示させること。(メール欄に何も記述しないこと。空白も入力しちゃダメ)
・ サーバーのOS(Linux、Windows他)、WebサーバーとPHPの種類やバージョン等を明記すること。
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
◆質問後の注意
・偽者防止に必ずIDを表示させること。(メール欄に何も記述しない)
・2回目以降は最初に質問した際のレス番号を名前欄に入れること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
0521nobodyさん
2007/09/19(水) 14:46:55ID:???MVCをしたいってこと?
なんかフレームワーク使ってる?
それとも、デザイン込みで1ファイルにしたいの?
質問ばかりでごめんね。
やりたいことがはっきり見えなくて。
0522nobodyさん
2007/09/19(水) 14:50:09ID:ywTkCFkiこっちこそ詳しくかかずにすみません
PEARを使ってます
デザイン込みで1ファイルなので
<?
$type1 = Aの場合のPHP+HTML文
$type2 = Bの場合のPHP+HTML文
$type3 = Cの場合のPHP+HTML文
?>
<html>
<body>
<?
switch ($regist){
case "A":
$typeAのPHP+HTML文を実行
break;
case "B":
$typeBのPHP+HTML文を実行
break;
case "C":
$typeCのPHP+HTML文を実行
break;
}
?>
</body>
<html>
0523nobodyさん
2007/09/19(水) 14:50:41ID:VHjt1ihLrequire_once("hoge{$resgit}.php");
かな
0524nobodyさん
2007/09/19(水) 14:53:58ID:ywTkCFkiどもです。
ですが、require_onceを使うためには実行するPHPを別ファイルで保存しなくてはいけないので、
それをしないで、実行する文を変数か何かに格納して条件別にそれを実行したいのです。
ヒアドキュメントで
$text = <<<_HTML_
<html>
<body>
<? echo "テスト" ?>
</body>
</html>
_HTML_;
eval($text);
としてみたのですが、evalはPHP文のみみたいですね・・・。
0525nobodyさん
2007/09/19(水) 14:56:09ID:DH/EOPt7やろうとしている事がアホすぎるってのは理解して、尚それをやろうとしてるの?
それとも、やろうとしてることがアホだって理解してないの?
0527nobodyさん
2007/09/19(水) 14:58:33ID:VHjt1ihLはぁはぁ、つまりユーザーアップロードのテンプレートを使わせたいわけだろ。
アップロード時に検査して問題がなければPHPとして置き換えたらいいでしょ。
それが嫌なら毎回置き換えろ。
0528nobodyさん
2007/09/19(水) 14:59:54ID:ywTkCFkiよく考えたらそれでよかったです・・・
有難うございましたorz
0529nobodyさん
2007/09/19(水) 15:08:48ID:???0530nobodyさん
2007/09/19(水) 15:09:10ID:???0532nobodyさん
2007/09/19(水) 15:14:01ID:???0533nobodyさん
2007/09/19(水) 15:44:14ID:ywTkCFki$test = "example.com";
$2ch = "まろゆき";
function Test(){
global $hogehoge;
global $test;
global $2ch;
echo $hogehoge;
echo $test;
echo $2ch;
}
Test();
外部の変数を取り込むにはglobalが必要ですが、
上記の場合では、
global $hogehoge;
global $test;
global $2ch;
としなくてはいけないですが、
変数を全て取り込むような宣言はありませんか?
0534nobodyさん
2007/09/19(水) 15:48:17ID:VHjt1ihL0535nobodyさん
2007/09/19(水) 15:52:00ID:DH/EOPt7何がしたいのかよくわからないが、引数で配列にでもして渡せば?
0536nobodyさん
2007/09/19(水) 16:05:39ID:???0537nobodyさん
2007/09/19(水) 16:08:09ID:???0538nobodyさん
2007/09/19(水) 16:08:48ID:???0539nobodyさん
2007/09/19(水) 16:47:29ID:???$GLOBALS[hogehoge] = "あああ";
$GLOBALS[test] = "example.com";
$GLOBALS[2ch] = "まろゆき";
function Test(){
global $GLOBALS;
というわけだよ
っうか
global $hogehoge,$test,$2ch;
でよくね?
これで20個渡したりする場合もあるよ?
0540nobodyさん
2007/09/19(水) 16:51:02ID:???( д) ゚ ゚
0542nobodyさん
2007/09/19(水) 16:53:50ID:???なんだそりゃ・・・
$hogehoge = "あああ";
$test = "example.com";
$2ch = "まろゆき";
function Test()
{
echo $GLOBALS['hogehoge'];
echo $GLOBALS['test'];
echo $GLOBALS['2ch'];
}
0544nobodyさん
2007/09/19(水) 16:57:52ID:???ネタだよな?w
つhttp://search.net-newbie.com/php/language.variables.scope.html
例 12-3. globalのかわりに$GLOBALSを使用する
<?php
$a = 1;
$b = 2;
function Sum()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
Sum();
echo $b;
?>
0545nobodyさん
2007/09/19(水) 16:58:26ID:???class ex
{
private $hogehoge = "あああ";
private $test = "example.com";
private $ch = "まろゆき";
public function ex_print(){
echo $this->hogehoge;
echo $this->test;
echo $this->ch;
}
}
$a = new ex();
$a->ex_print();
もしくは
$a = array('hogehoge'=>'あああ','test'=>'example.com','2ch'=>'まろゆき');
test($a);
function test($output_array){
foreach( $output_array as $val ){
echo $val;
}
}
0546nobodyさん
2007/09/19(水) 17:02:10ID:???$hogehoge['aaa']
$hogehoge[aaa]
''って使ってる派? 使わない派?
どっちが多いのかな
0548nobodyさん
2007/09/19(水) 17:05:37ID:???0550nobodyさん
2007/09/19(水) 17:06:45ID:???明示的を重視して使ってる。(noticeもエラー扱いだし)
うちは’(シングルクォート)だけど、
’(シングルクォート)と”(ダブルクォート)だとどっち使ってる人が多いのかな?
0552nobodyさん
2007/09/19(水) 17:09:46ID:???0554nobodyさん
2007/09/19(水) 17:14:28ID:???PHPマニュアルさんがファビョってたから
$foo['bar']つかう。
0555nobodyさん
2007/09/19(水) 17:15:16ID:???グローバル変数使う奴なんて馬にけられて死ねばいい
だけど、自作フレームワークにsmarty組み込む時に、
一々assignするのがめんどうでGLOBALSの中身全部assignしてしまった俺も死ね
0556nobodyさん
2007/09/19(水) 17:16:14ID:???0557nobodyさん
2007/09/19(水) 17:17:37ID:???echo $foo[bar];
define('bar', "boo");
echo $foo[bar];
0558nobodyさん
2007/09/19(水) 17:19:53ID:???>下位互換性の維持のため、未定義の定数は同じ名前の文字列に自動的に変換されます。
PHPは地獄だぜヒャッホー
0559nobodyさん
2007/09/19(水) 17:20:06ID:???PHP初心者のおれにもわかるように説明して下さい
エロイ人
0561nobodyさん
2007/09/19(水) 17:23:55ID:???グローバル変数は、ご存知のとおり適用範囲が必要以上に大きくなってしまう。
例えば、レンタルサーバーの場合、一人の住民がグローバル変数の値を変えると、
その変数を使っているレンタルサーバー内の住民の変数が全て変わってしまう。
そういう事情があって、使わない方がいいというより使ってはいけない。
0567nobodyさん
2007/09/19(水) 17:32:03ID:???0568nobodyさん
2007/09/19(水) 17:32:51ID:DH/EOPt710ファイルくらいのスクリプトをグローバル変数だけで書いてみな。
意味がわかるだろ
0569nobodyさん
2007/09/19(水) 17:37:23ID:???僕が、globalを嫌ってる理由はね。
理由1 ソースを追っかけにくい
どこで変数の値が変わるか分からないので、
いちいち全体を追っかけないといけない。
モジュールが増えれば増えるほど困難になる。
理由2 多人数での開発が難しい
適用範囲が広いってことは、変数名がぶつかったり
途中で違うものになったりして結合時などに大変なことになる。
理由3 昔の自分が書いたソースは意味不明w
理由1とほぼ同じ。
0570nobodyさん
2007/09/19(水) 17:41:42ID:???$hogehoge['1'] = "ほげほげほげお";
for($i=0;$i<300000;$i++){
print $hogehoge['1'];
}
$hogehoge["1"] = 1.14〜1.22秒
$hogehoge['1'] = 1.22〜1.33秒
$hogehoge[1] = 1.11〜1.2秒
結論
30万回ループで差がない=変わらない。
0571nobodyさん
2007/09/19(水) 17:42:15ID:???0572nobodyさん
2007/09/19(水) 17:50:51ID:???for($i=0;$i<300000;$i++){
print $hogehoge[ほげほげほげお];
}
$hogehoge["ほげほげほげお"] = 1.2秒
$hogehoge['ほげほげほげお'] = 1.2秒
$hogehoge[ほげほげほげお] = 1.6〜1.7秒
差はでたが微妙すぎる
0573nobodyさん
2007/09/19(水) 17:52:22ID:???NFCとかNFDとか
0574nobodyさん
2007/09/19(水) 17:52:22ID:???「Noticeを、許したタイポで、地獄見る」
define('type', false);
if(typo){
echo "PHP「罠にかかったな小僧!」\n";
};
0576nobodyさん
2007/09/19(水) 17:56:04ID:???皆は自動でクオートするように設定してる?
自動にすると、なんかこの機能っていろんな意味で不便じゃね?
0577nobodyさん
2007/09/19(水) 17:58:30ID:???自動ONでやってる。
"の送信が\"になるのは
$_POST[a] = eregi_replace("[\]", "", $_POST[a]);
で回避してる。
0582577
2007/09/19(水) 18:17:29ID:???あーーー!!!!
0583nobodyさん
2007/09/19(水) 18:24:13ID:???の正規表現はどう書くか教えて下さい。
----------
...
...
文章この行まで(以下空白部分を削除したい)
-----------
0584583
2007/09/19(水) 18:27:08ID:???0585nobodyさん
2007/09/19(水) 18:32:14ID:???0586nobodyさん
2007/09/19(水) 18:59:30ID:???$begin = microtime(true);
for($i=0; $i<=300000; $i++){ if($test['abc'] == 'ghi'); }
echo microtime(true) - $begin . "\n";
$begin = microtime(true);
for($i=0; $i<=300000; $i++){ if($test["abc"] == 'ghi'); }
echo microtime(true) - $begin . "\n";
$aaa = microtime(true);
for($i=0; $i<=300000; $i++){ if($test[abc] == 'ghi'); }
echo microtime(true) - $begin . "\n";
結果
0.054291009903
0.0549669265747
0.413056850433
相当遅い。
0587nobodyさん
2007/09/19(水) 19:04:33ID:???あとこういうのやってみた。
$test['abc'] = 'def';
$key = 'abc';
$y = 'y';
for($i=0; $i<=300000; $i++){ if($test[$key] == 'ghi'); }
for($i=0; $i<=300000; $i++){ if($test["$key"] == 'ghi'); }
for($i=0; $i<=300000; $i++){ if($test["ke$y"] == 'ghi'); }
for($i=0; $i<=300000; $i++){ if($test['ke'.$y] == 'ghi'); }
0.0560829639435
0.0782399177551
0.2595911026
0.241644859314
やはり差が出る。
0588nobodyさん
2007/09/19(水) 19:11:28ID:???0589nobodyさん
2007/09/19(水) 19:37:54ID:???0590nobodyさん
2007/09/19(水) 19:56:01ID:???0592nobodyさん
2007/09/19(水) 20:27:02ID:???レスポンス差を生んでしまうならそれはかなり大きな問題だと思うがな。
体感で分からんとか言ってるやつは、その0.1秒の差が
サーバーが対応可能な秒間アクセス数を確実に決定付けるという
高負荷サーバーのチューニングとかやったことないレベルの人だろう。
>>586
1番遅い結果が出た $test[abc] はPHPの処理でかなり遅い
シンボルの検索をやるのが致命傷なんだろう。
リファレンス使った参照渡しとかもこれが原因で処理遅いんだよな。
0593nobodyさん
2007/09/19(水) 20:28:43ID:???> for($i=0; $i<=300000; $i++){ if($test["ke$y"] == 'ghi'); }
> for($i=0; $i<=300000; $i++){ if($test['ke'.$y] == 'ghi'); }
この辺が遅いのは内部的にメモリのリアロケーションが発生するせいかね。
0594nobodyさん
2007/09/19(水) 20:31:34ID:???チューニングとはボトルネックになっているとわかってから
効果がある場所にかぎってやるもの。
すべての箇所でやるもんじゃない。
0595nobodyさん
2007/09/19(水) 20:44:49ID:???こういうこと言う奴はどうしようもないよな
その程度の負荷をチューニングするくらいならもっと元気のいいCPUにかえたほうがスマートなやり方
次にアルゴリズムとかデータ構造見直すとかした後の話だろ、カーネル再構築とか微妙なチューニング云々は
0596nobodyさん
2007/09/19(水) 20:47:09ID:???0597nobodyさん
2007/09/19(水) 20:47:18ID:6jpSclPOで、magic_quote_gpcがオフにならないのですが、何が原因なのでしょうか・・・。
0598597
2007/09/19(水) 20:53:07ID:6jpSclPO文字コードを変換した場合にも勝手にクオート入るんですね・・・。
厄介ですorz
0599nobodyさん
2007/09/19(水) 20:55:20ID:???なんでや
0601nobodyさん
2007/09/19(水) 21:06:54ID:???ボトルネックを最優先で改善するのは当然の話だが
全てのコードが満遍なく遅いってのはそれ以前の糞プログラム。
チューニングの余地すらない。全部書き直せ。
0603nobodyさん
2007/09/19(水) 21:32:47ID:+/kMM8g5OSはRedHat、verは4.4.6です(lolipopのレンサバです)
<?php
if($_POST['mail'] == 1 && strlen($_POST['message']) != mb_strlen($_POST['message'])){
mb_language("Ja");
mb_internal_encoding("SJIS");
$mailto = "自分のアドレス";
$subject = "件名";
$message = $_POST['message'];
$host = getenv("REMOTE_HOST");
$addr = getenv("REMOTE_ADDR");
if(!$host){
$host = gethostbyaddr($addr);
}
$ua = getenv("HTTP_USER_AGENT");
$message = $message . "\n\n--------------------------------------------------\n" . $host . "\n" . $ua;
mb_send_mail($mailto, $subject, $message);
}
?>
続きます。
0604603
2007/09/19(水) 21:33:38ID:+/kMM8g5<form action="スクリプトのパス" method="POST">
<input type="text" name="message"> <input type="submit" name="submit" value="送信する">
<input type="hidden" name="mail" value="1">
</form>
1行目は文字数とバイト数が一緒なら半角のみと判断して送信しないようにしています。
このようなスクリプトを作成し、フォームからメールを送信しました。
すると、「ああ」とか「あああ」で送信できないのに「いい」とか「あいあ」だと送信できます。
これはどういう現象なのでしょうか?
0605nobodyさん
2007/09/19(水) 21:34:44ID:???0606nobodyさん
2007/09/19(水) 21:45:59ID:???0607nobodyさん
2007/09/19(水) 21:49:07ID:???質問も自由。(マルチとスレ違いはだめだが)
答えるのも自由。
じゃないのか?
0609nobodyさん
2007/09/19(水) 22:01:36ID:???なんか2行目でmb_languageを今更jaに指定してるけど、
1行目の段階ではこれはどういう設定になってるの?
文字コードが変な解釈されてる気がするけど。
0610nobodyさん
2007/09/19(水) 22:02:12ID:???0611nobodyさん
2007/09/19(水) 22:06:09ID:???PHPは、送られてきた文字列のエンコードを知らないわけだから、
それなのにmb_strlenしてもデフォの内部エンコードが使われて、正しくないエンコードで計算されて期待した値にならない
0612603
2007/09/19(水) 23:17:34ID:+/kMM8g5mb_language("Ja");
mb_internal_encoding("SJIS");
の位置を先頭にしたら動きました。ありがとうございました。
0613nobodyさん
2007/09/20(木) 00:10:59ID:???その2行を先頭に持ってきたくらいじゃ根本的な問題解決にならんよ
期待している"SJIS"以外が送られてきたら不具合出るんじゃね?
0614nobodyさん
2007/09/20(木) 00:25:09ID:TpeEYAA9亀レスすいません。
あの後試してみた所、ほとんどソースをまっさらにすると、すべてtrueとなりました。
どうも自分が改造する前のオリジナルのソースでセッションが貼られてるようです(←これが本当かどうかも怪しいですが)。
それに対し、自分も別にセッションを貼ったため問題が出たのかもと思いました。
そう思ったのは>>474で書いた print_r($_SESSION); の結果が、
↓のように、一度の print_r($_SESSION); 内で timing1 や timing2 が2回実行されていたからです
(今手元に正確な情報がないのでこんな感じだったということで)。
Array ( (略)=> Array ( [action] => process [timing1] => あ [timing2] => い (略) => Array ( [timing1] => ) [timing2] => い (略) => )
そして、timing1 が一度「あ」が入力された後、空文字?で上書きされてしまっていた為、問題がおきていたのかもと思いました。
もっとも、まっさらにしたソースでは使い物にならないので、既存のソースを解析する問題は残ったままとなりますが・・・。
ともあれアドバイスいただいた皆さん、どうもありがとうございます。
0615nobodyさん
2007/09/20(木) 00:26:35ID:???動かないんですが・・・
0616603
2007/09/20(木) 01:01:49ID:ROB03O5/フォームのあるhtmlはShift-JISで宣言してあるのですがそれでもダメでしょうか?
0619nobodyさん
2007/09/20(木) 01:17:43ID:???0620山田真一
2007/09/20(木) 10:38:42ID:RRR2JFqmWarning: main(db/.php): failed to open stream: No such file or directory in /home/webmaster/public_html/link/yomi.php on line 21
Fatal error: main(): Failed opening required 'db/.php' (include_path='.:') in /home/webmaster/public_html/link/yomi.php on line 21
となって表示されません。
一応21行目を確認したら
require("db/$cfg[db_sql].php");
となっていました。
誰かわかる方教えてもらえませんか?
0621nobodyさん
2007/09/20(木) 10:41:11ID:???■ このスレッドは過去ログ倉庫に格納されています