【PHP】下らねぇ質問はここに書き込みやがれ 41
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/03/06(火) 15:39:46ID:naBsdy1ZPHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレ、関連スレ、FAQなどは>>2-10辺り
◆前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 40
http://pc11.2ch.net/test/read.cgi/php/1172151461/
◆質問する時の注意
・ 自分のIDを表示させること。(メール欄に何も記述しないこと。空白も入力しちゃダメ)
・ サーバーのOS(Linux、Windows他)、WebサーバーとPHPの種類やバージョン等を明記すること。
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
◆質問後の注意
・偽者防止に必ずIDを表示させること。(メール欄に何も記述しない)
・2回目以降は最初に質問した際のレス番号を名前欄に入れること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ http://pc10.2ch.net/php/subback.html
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで http://pc10.2ch.net/db/subback.html
0693nobodyさん
2007/03/13(火) 14:24:16ID:???結論=無理。氏ぬがいいw
っていうか単なるテンプレート的な使い方のためだけにテンプレートエンジンだの
クラスだのと難しいことをする必要はない。
単に任意の変数を埋め込んだHTMLを拡張子.phpで用意しておき、
それをロジック・スクリプトからrequireして変数部分を展開すればいいだけ。
0694nobodyさん
2007/03/13(火) 14:26:27ID:???0695nobodyさん
2007/03/13(火) 14:29:49ID:???どういうファイル構成になってるんだかさっぱりなんだが
クラス定義ファイルの読み込みはrequire_onceでやるか
クラス定義のとこで定義済みかどうかを判別するだけでは。
まさか複数ファイルにクラス定義をそれぞれ書いてるとかいう
ありえない設計をしてるわけもないだろうし。
0696nobodyさん
2007/03/13(火) 14:42:22ID:Y+fr5f3lprint.php
-----------------------
require_once(テンプレートA);
$A = new Template;
//うぁぁTemplateが解除できねぇぇ
require_once(テンプレートB);
$A = new Template;
templateA.php , templateB.php
-----------------------
class Template extends TemplateBase
{
...
}
>>693
現状から少々の追加・修正でなんとかできないでしょうか・・
各テンプレートPHPで宣言しているクラス名を修正しても良いです。
>>695
ありえない設計になっていますでしょうか・・
0697nobodyさん
2007/03/13(火) 14:52:53ID:???0698nobodyさん
2007/03/13(火) 15:01:48ID:Y+fr5f3lテンプレートオブジェクトの生成コード
new Template が統一して使用出来ないと思ったからなんです。
newには静的にクラス名を与えるしかないですよね・・?
0699nobodyさん
2007/03/13(火) 15:08:19ID:???1000 2000 3000 の整数値が入った変数があったとして
これら3つの中から最も低い数値だけ抜き出すアルゴが知りたいです
もちろんif文などでも実現できますが、何かいい関数がないかと思いまして
無知なところすみませんがよろしくお願いします
0701軟式PHP
2007/03/13(火) 15:20:46ID:???<?php
$nums = array(2000,1000,3000,5000,100,7000);
sort($nums);
print $nums[0];
?>
0703虚弱PHP
2007/03/13(火) 15:30:04ID:???ありえない設計だね。
設計変えずに素早くなんとかするとしたら、
可変クラス名でも使ってやるしかないんじゃないかな。
・クラス名はテンプレート毎。
・テンプレートクラスのファイル先頭に$TemplateClassName = <テンプレートクラス名>
$A = new $TemplateClassName();
0704nobodyさん
2007/03/13(火) 15:34:44ID:???だからさぁ、テンプレートの仕組みはこんな感じ↓にすれば簡単なのに。
なぜ皆わざわざテンプレートエンジンとか難しいことやろうとするの?
●print.phpの中身
$hoge = "これを表示するべ";
require_once(template.php);
-----------------------
●template.phpの中身
echo <<< EOM
<html><body>
↓ここの表示は自由自在だぜ!<br>
{$hoge}
</body></html>
EOM;
0706軟式PHP
2007/03/13(火) 15:42:48ID:???いや明らかにテンプレートエンジンのほうが簡単。
というかそれはテンプレートとは言えるレベルじゃないと思うが。
Smartyのforeachelse、cycleなどを使い始めると離れづらいと思うが。
Smartyの例
●print.phpの中身
$tpl = new mySmarty(); //Smartyを継承したクラス
$tpl->assign("hoge","これを表示するべ");
$tpl->display("template.php");
●template.php
<html>
<body>
↓ここの表示は自由自在だぜ!<br>
{$hoge}
</body></html>
0708nobodyさん
2007/03/13(火) 15:54:58ID:Y+fr5f3l$strは何を指すのですか?
憶測ですが、new TemplateをLoadTemplateのような関数と同じ意味だと思っていませんか?
多分そのやり方ではクラスを使う意味がないです。
>>703
ありがとうございます。
PHPは可変クラスなんてのが使えたんですね。
そういった機構が無いか何度も探してみたのですが、見つけられていませんでした。
まだ試してみてはいませんが、勉強になります。
なお、先の件につきまして、一応自力で解決できました。
>>703の手法に似ていますが、可変〜を使わないものです。
print.phpのテンプレート出力関数内で、空の$template_objを用意し
テンプレートスクリプトにて、global $template_objによりアクセス可能にした
$template_objへnewテンプレートしオブジェクトインスタンスを格納するようにしました。
コンストラクタの引数も同様に受け渡しをしました。
ちょっと再利用性が落ちるやり方でまた怒られそうですね。
とにかく、皆様どうもありがとうございました。
と書いている間にまたレスがついてますね。
>>703以降落ち着いたらじっくり読ませていただきます。
クラスの使い方がなってないと散々怒られてしまいましたので
よろしければ、後学のためどのような設計にすべきだったのかアドバイス頂けると幸いです。
ではでは、また死んできます。
0709nobodyさん
2007/03/13(火) 16:31:20ID:???>ループ使ったり、条件分岐つかったり
それはロジック側でやっといて、最終的に出力したい状態に整形してから
テンプレートに変数として渡せば済む話では??
>>706
その手法と>>704の手法と比べた場合、どんなメリットがあるのかサッパリ分からないっす。
っていうか結果的に同じことを単に複雑にしてるだけ、って気が・・・。
0710nobodyさん
2007/03/13(火) 16:43:09ID:???項目数の可変なテーブルを出力したいときはどうする。
$table = "<table〜</table>";
とかやってからテンプレに渡すの?
0711nobodyさん
2007/03/13(火) 16:52:56ID:???0712nobodyさん
2007/03/13(火) 16:57:13ID:???1000とあったら1,000になるようなやつです
0713nobodyさん
2007/03/13(火) 16:58:53ID:???自己解決しました
0714軟式PHP
2007/03/13(火) 16:59:36ID:???簡単なやつだからね。修飾子とか使えるし実際見やすいよ。
同じ処理を行った場合の一例
・Smarty
{$hoge | escape | replace:"これ":"それ" }
・ロジック
$hoge = str_replace( "これ", "それ" ,htmlspecialchars( $hoge ) );
>>711
number_format()
0716nobodyさん
2007/03/13(火) 19:22:17ID:???君はもうだめかもわからん
class Template {
function __construct($_str) {
/* 引数の値に応じてテンプレートを読み込む */
}
}
こう書いてもわからんというのかね
クラスに引数つけた場合はデフォルトコンストラクタではなく定義されたコンストラクタが呼び出される
クラスの概念とか判らないのならC++かJavaからやったほうがいいよ
0717nobodyさん
2007/03/13(火) 19:40:10ID:???UTF-8の"�T"(E78484)を mb_convert_encoding を使って
EUC-JPに変換すると化けてしまいます
これは mb_convert_encoding のバグでしょうか?
また対応策等ありましたらお願いします
0718nobodyさん
2007/03/13(火) 19:44:17ID:???こんな感じで検索文字を文字コード指定で指定して変換するときは、
str_replace でも大丈夫でしょうかね?
str_replace だとパラメータに配列が使えて便利なので
0719nobodyさん
2007/03/13(火) 19:46:12ID:???猫手をindex.phpに使用していたのですが、間違えて消してしまい、
どういうタグを描いていたかも忘れてしまい・・・
0720nobodyさん
2007/03/13(火) 20:05:58ID:???<include>another.php</include>
こんな感じか
0721nobodyさん
2007/03/13(火) 20:08:01ID:???ぬるぽ(include.php);
?>
0722nobodyさん
2007/03/13(火) 20:14:01ID:???include("index.php");
require("index.php");
require_once("index.php");
上にいくほど高速
0723nobodyさん
2007/03/13(火) 20:18:16ID:???htmlspecialcharsだけでは不十分でしょうか?おすすめの処理あれば教えてください
0725nobodyさん
2007/03/13(火) 21:23:04ID:6kJO88Vk1. <input type='text' name='hoge' value='<?php print(htmlspecialchars($_GET['hoge'])); ?>'>
2. <script type="text/javascript"><?php print(htmlspecialchars($_GET['foo'])); ?></script>
この二つがなぜ危険になる可能性があるのかを説明できれば大丈夫だと思う。
0727nobodyさん
2007/03/13(火) 21:48:59ID:FbvNPOWY毎日 10 時に メールを 1万通送信するプログラム を作るとサーバーに相当な負荷がかかってしまうと
思います。
この場合どういう風に作ればサーバーに負荷をできるだけかけずにプログラムを作れるでしょうか。
というより、どうすればいいんでしょうか。
一般的なメルマガ発行システムなどはどうやって処理しているのか教えてください。
よろしくお願いします。
0728nobodyさん
2007/03/13(火) 21:56:24ID:???メールを送信する処理をPHPでやっているシステムは見たことない。
0729nobodyさん
2007/03/13(火) 22:01:49ID:neUD+ow6*/1 * * * * メール送信処理
1分おきにメール送信するとサーバーに負荷かからないよ
0730nobodyさん
2007/03/13(火) 22:08:49ID:???0731nobodyさん
2007/03/13(火) 22:14:16ID:???1分おきに10000通のメールを送るとすると:
60(秒) * 10000(通) = 600000(秒)
時間になおすと:
600000 / (60 * 60) = 166.666666667
すなわち、全てのメールを送信するのに約7日かかることになる。
そんなもの使いものにならんよ。
0734nobodyさん
2007/03/13(火) 22:30:27ID:???つまり20分で10000通メール送信ってことだよな
0735nobodyさん
2007/03/13(火) 22:32:04ID:???さらに時間はかかるがw
0737nobodyさん
2007/03/13(火) 22:36:05ID:???0739軟式PHP
2007/03/13(火) 22:49:36ID:???3万人まで送信したことあるけど、今のところ問題なし。
もし途中で何らかの原因があって止まってもログから再送信させる。
0741nobodyさん
2007/03/13(火) 23:44:54ID:jbwAF33vphpmyadmin内にutf-8で格納してあります。
ブラウザーに表示するときもutf-8統一してあるのですが
文字化けしてしまいます。
<p>php</p>部分 数字は表示されるのですが
漢字 ひらがなの部分が化けしてしまいます
文字化け対策を調べてみたのですが、なかなか直らなくて
PHP 5.2.1
phpMyAdmin 2.9.2
Apache 2.2.4
MySQL 5.0.33
(xampp)以上です よろしくお願い致します
0742nobodyさん
2007/03/13(火) 23:47:33ID:???class Hoge {
function set($key,$value) {
$this->$key = $value;
}
}
$hoge->set('name', 'ほげほげちゃん');
と言う風に、varで定義していない変数を作るのってやめた方が良いですか?
PHP5なら__set、__get使ってひとつの配列に入れておくことも出来るんですが
PHP4なのでどうしようかと思いまして・・・。
むしろ、もうそろそろPHP4の事は考えない方がいいですか?
0743nobodyさん
2007/03/13(火) 23:49:28ID:???どんな風に文字化けするのか
>ブラウザーに表示するときもutf-8統一してあるのですが
どこをどういじってutf-8にしたの?
0745nobodyさん
2007/03/14(水) 00:15:32ID:lS0gqu9t<META http-equiv="Cont
ent-Type" content="text/html; charset=utf-8">
と エディエターもutf-8セットしました CSVファイルも
utf-8に変更しました
mysql内はいじっていません
[mysqld]
default-character-set = utf8
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8
等
0747709
2007/03/14(水) 01:45:21ID:???>>714 なるほど、慣れるとSmarty記法のほうが可読性が高いんですかね。
>>715 そうなんですよ、実際、ロジックに可変テーブルなどのHTMLが入り込んでて、
可読性が落ちるからどうやって解決したものかな〜〜と常々思っとりました。
にも関わらず、Smartyとか導入するのが面倒なのでやってませんorz
0748nobodyさん
2007/03/14(水) 02:39:55ID:???function set($k, $v){
$this->storage[$k] = $v;
}
だとどういう不都合があるの?
例外処理の恩恵受けられるならPHP4切る価値はあると思う。
0749nobodyさん
2007/03/14(水) 03:41:39ID:BjDS8gcH//ファイルはSJIS
mb_internal_encoding("SJIS");
mb_http_output("UTF-8");
ob_start("mb_output_handler");
はおkなんだけど、
//ファイルはUTF-8
mb_internal_encoding("UTF-8");
mb_http_output("SJIS");
ob_start("mb_output_handler");
は化けませんか?
(iconv_set_encodingでも同じ)
0750nobodyさん
2007/03/14(水) 05:17:14ID:???女子社員はかあいかったなww
0752nobodyさん
2007/03/14(水) 05:28:22ID:???0753nobodyさん
2007/03/14(水) 07:59:05ID:ouHfB1AQ何故か書き込めなかった
746PHP.iniは変えてません
749やってみます
会社でやってみます
0755nobodyさん
2007/03/14(水) 10:23:26ID:rWwTvtgK予想されるものって、テーブルをユーザー毎に個別を分けたほうがいいんですかね??
分かりやすい例で言えば、たとえばまぐまぐみたいなシステムの場合に、
マガジンごとに配送ログを取るとします。そしたらたとえば読者が10万人いるマガジンの場合、
一回発行するごとに配送ログが10万行増えますよね。そういうマガジンがいくつもあれば、
配送ログを記録するテーブルはあっという間に膨れ上がります。
こんなとき、「配送ログテーブル」としてまとめて一つ用意するよりも、
各マガジンごとにログ用テーブルを個別に用意したほうがいいんでしょうか?
なんか分かりにくい質問だったかもしれませんが、
他にもいろんな場面で似たような悩みがあります。テーブルをどこまで分割するか、で。
0756nobodyさん
2007/03/14(水) 10:24:25ID:???0757nobodyさん
2007/03/14(水) 10:32:57ID:???それともインデックスを知らずにSELECTが遅くなることを懸念してるとか?
んなワケないか。
0758nobodyさん
2007/03/14(水) 10:51:15ID:???0759755
2007/03/14(水) 10:53:51ID:rWwTvtgK>>757 膨張というか、管理の手間(?)なども考えてのことです。
>>758 単なるログ保存ではなく、ユーザー(>>755の例で言えばマガジン発行者)が
過去ログを閲覧できるようにしておきたいのです・・・
0760nobodyさん
2007/03/14(水) 11:16:31ID:???1件ずつ見ることはないだろう
必要な情報だけを集計して、集計元のデータは別途保存して
データベースから消せばいいんじゃないのか
0761nobodyさん
2007/03/14(水) 13:22:36ID:KzeU5M0F16進数から文字列に変換するJavaScriptの関数があるのですが、
それをphpに変換したいのです。
// JavaScript
function hexToString (h) {
var r = "";
for (var i= (h.substr(0, 2)=="0x")?2:0; i<h.length; i+=2) {r += String.fromCharCode (parseInt (h.substr (i, 2), 16));}
return r;
}
頑張って以下のようにしてみたのですが、JavaScriptと返り値が異なってしまいます。
恐らく JavaScript の parseInt に対応しているつもりの sprintf の使い方が誤っているのだと思いますが、
どう直していいのかわかりません。
// PHP
function hexToString ($h) {
$r = "";
for ($i = (substr($h, 0, 2) == "0x")?2:0; $i < strlen($h); $i += 2)
{
$r .= chr(sprintf("%d", substr($h, $i, 2)));
}
return $r;
}
よろしくお願いします。
0762nobodyさん
2007/03/14(水) 13:23:42ID:KzeU5M0F// JavaScript
function stringToHex (s) {
var r = "0x";
var hexes = new Array ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
for (var i=0; i<s.length; i++) {r += hexes [s.charCodeAt(i) >> 4] + hexes [s.charCodeAt(i) & 0xf];}
return r;
}
というJavaScriptの関数よって16進数に変換された文字列を、元の文字列に戻すための関数です。
0763nobodyさん
2007/03/14(水) 13:53:00ID:???$r .= chr(sprintf("%d", substr($h, $i, 2)));
じゃなくて
$r .= pack('H2', substr($h, $i, 2));
とか。
もしくは
function hexToString ($h) {
return pack('H*', substr($h, (substr($h, 0, 2) == "0x") ? 2 : 0));
}
とか。
0764761
2007/03/14(水) 14:09:21ID:???うおお〜期待通りの動作になりました。ありがとうございます。
しかしpackって奥が深いというか難しいというかクラクラしてきました。
勉強します。
0766nobodyさん
2007/03/14(水) 16:38:46ID:???ユーザがいつどのマガジンに入退会したかを記録しておけば、配送ごとにすべてのユーザに配送ログを残す必要なくなると思うが。
配送エラーがあると配送ログがつかない というのであれば逆にエラーが起きたときだけ特別にエラーログとればよいし。
0767nobodyさん
2007/03/14(水) 17:28:36ID:???つーか何を聞きたいのかよく分からない。
もう一回まとめてもらえる?
1つのテーブルにレコードが10万件あるデータベースで
ログ閲覧や管理にどういう問題があって、どうしたいと考えているの?
0768nobodyさん
2007/03/14(水) 17:38:47ID:???インデックスってどうやって張るの?
0769nobodyさん
2007/03/14(水) 17:41:55ID:???0770nobodyさん
2007/03/14(水) 18:50:28ID:???続きはmysqlかpgsqlスレへどうぞ
0771nobodyさん
2007/03/14(水) 19:26:45ID:ouHfB1AQ0772nobodyさん
2007/03/14(水) 19:30:52ID:88VqriPkcall_user_funcを使って任意のクラスのメソッドを呼ぶ事が出来ますが、
同様に任意のクラスのメンバを取得するにはどうすればいいでしょうか?
0773nobodyさん
2007/03/14(水) 19:31:14ID:???0775659
2007/03/14(水) 19:51:48ID:hmkr7h9D申しわけありません。したいことと、得られる結果が異なります。
<?php
$xmlstr = <<<XML
<cat>
<name>mike</name>
<name>tama</name>
<name>buchi</name>
</cat>
XML;
$xmlsrc = new SimpleXMLElement($xmlstr);
なんかする(これがわからん)
echo($xmlsrc->asXML());
?>
で、
<cat>
<name>mike</name>
<name>tama</name>
</cat>
って表示されるようにしたいです。
よろしくおねがいします。
0777nobodyさん
2007/03/14(水) 20:56:52ID:???$xmlsrc … 入力
$xmldst … 出力
なのでecho($xmldst->asXML());すると
<?xml version="1.0"?>
<cat><name>mike</name><name>tama</name></cat>
と出る
0779775
2007/03/14(水) 21:32:40ID:hmkr7h9D説明が下手で申しわけありません。
プログラムは、
データベースからXMLを読み込む。 -> XMLをSimpleXMLオブジェクトにする。
-> 入力値をXMLに入れる。 -> いろいろ処理をする。 -> 結果をXMLに入れ、データベースに書き出す。
という処理を繰り返し行っています。
入力値の要素数が変化するのですが、
要素数が増えるときは問題がないのですが、減ったときに余分な要素が残ってしまいます。
これをオブジェクトの名前の変更なしで消し去りたいんです。
XMLはだいたいこんな感じです。
<pet_shop>
<open_date>
<year></year><month></month><date></date>
</open_date>
<cat>
<name>mike</name><name>tama</name><name>buchi</name>
</cat>
</pet_shop>
0780nobodyさん
2007/03/14(水) 23:08:24ID:???0782nobodyさん
2007/03/14(水) 23:30:30ID:qM9Gf/TM文字列"FF"から0xFFってしたいんですがどうしたらいいんでしょう?
くだらなくてすいませんがよろしくお願いします。
0783nobodyさん
2007/03/14(水) 23:31:44ID:???$string = '0x' . $string;
0784782
2007/03/14(水) 23:46:09ID:qM9Gf/TMそれだと文字列の"0xFF"になりますよね?
16進数としての0xFFにしたいんです。
0786782
2007/03/15(木) 00:42:36ID:???駄目でした。
でも色々試したら解決しました。
"0xFF" + 0x00
としたらいけました。
もうちょっとスマートなやり方はないのかな。。。
どうもありがとうございました。
0787nobodyさん
2007/03/15(木) 00:43:25ID:???0790nobodyさん
2007/03/15(木) 00:58:02ID:???同じ関数を2つも並べて書くなんてアホっぽいじゃないですか
一発で配列にして返したりするのが欲しいんです
unpack("C*", $str)みたいな
↑
はいろいろイジって頭おかしくなりかけたのでもう試しません
0791nobodyさん
2007/03/15(木) 00:59:20ID:???1秒150通でも十分に速いと思う。。。
ちなみに俺がXREAの有料鯖でPHPで組んだメール配信システムだと、
だいたい1秒で10〜20通くらいしか送れない。(朝の時間帯だから鯖は混んでないのに)
メールの宛先ごとに本文の内容が違うし、名前の差込処理などもやってるので、
単純にメールの送信処理だけじゃないからこんなに遅いのかな?
それとも、それを考慮したとしても遅すぎるだろうか・・・? みんな、どう思います?
ちなみに、メール送信処理部分(mb_send_mail)を除いたコードで処理時間を計測すると、
メール100通分の処理でも0.00…数秒しかかかってない。
すなわち、mb_send_mail()処理で大幅に時間を食ってるようだ。
0792nobodyさん
2007/03/15(木) 01:15:24ID:???mb_send_mailで時間がかかってるってのはどこまでの範囲なんだ?
メールを送信する処理自体はSMTP鯖だろうから一概にPHPが駄目と
はいえないと思う。
PHPはSMTP鯖のキューにメールを置くところまでしかやらないはずだから
・SMTP鯖のキューに置くまでの時間=PHPのメール処理
・キューからメールを吐き出す時間=SMTPのメール処理
となると思う。
■ このスレッドは過去ログ倉庫に格納されています