【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カテゴリ)の各スレで
0220216
2007/09/13(木) 19:47:53ID:HG9TD0jfどのようにしたらいいでしょうか?POSTで別ファイルにデータを送り取得する方法以外で
ヒントでも教えて頂けると嬉しいのですが。
0221216
2007/09/13(木) 20:09:07ID:HG9TD0jf0223nobodyさん
2007/09/13(木) 20:57:25ID:???if (・・・) {
$error+=1;
} else {
if (・・・) {
$error+=2;
} else {
if (・・・) {
$error+=4;
} else {
//エラーが無いなら処理
}
}
}
このように様のifのネストが深くなっていくことが想定された場合
swich (0) {
default:
if (・・・) {
$error+=1;
break;
}
if (・・・) {
$error+=2;
break;
}
if (・・・) {
$error+=4;
break;
}
//エラーが無いなら処理
}
上記の様にswitchまたはdo-whileなどで囲み、エラーはbreakで脱出するという書き方は邪道でしょうか?
0224nobodyさん
2007/09/13(木) 20:59:11ID:???0226nobodyさん
2007/09/13(木) 21:33:08ID:???0227nobodyさん
2007/09/13(木) 21:41:18ID:???0228223
2007/09/13(木) 21:43:20ID:???$res=& $db->query($sql, $foo);
if (!DB::isError($res) && $res->numRows()==1) {
$res->fetchInto($row);
$sql = "UPDATE tableB SET hoge=? WHERE foo=?";
$res=& $db->query($sql, array($row['hoge'], $foo));
if (!DB::isError($res) && $db->affectedRows()==1) {
$res->fetchInto($row);
$sql = "UPDATE tableC SET hoge=? WHERE foo=?";
$res=& $db->query($sql, array($row['hoge'], $foo));
if (!DB::isError($res) && $db->affectedRows()==1) {
//以下(ry
}
}
}
こんなケースはどうでしょう?
どうやってネストを回避しますか?
0229nobodyさん
2007/09/13(木) 21:55:01ID:???即座に中断
ぐらいは誰でも瞬時に思いつく
0230nobodyさん
2007/09/13(木) 21:58:54ID:???俺はこうする
if (・・・) {
$error+=1;
} elseif (・・・) {
$error+=2;
} elseif (・・・) {
$error+=4;
} else {
//エラーが無いなら処理
}
0231nobodyさん
2007/09/13(木) 22:08:30ID:???(2行目)|項目1-1,項目2-1,項目3-1,項目4-1,項目5-1
(3行目)|,,,,
(4行目)|項目1-2,項目2-2,項目3-2,項目4-2,項目5-2
(5行目)|,,,,
(6行目)|項目1-3,項目2-3,項目3-3,項目4-3,項目5-3
↑…というcsvファイルを
データのない行(上の例では3・5行目)で区切って、
1〜2行目、4行目、6行目とそれぞれ配列に格納するには
どういう考え方でプログラムを組んだらよいでしょうか。
横方向であれば、file()で読み込ませた後に、
list()やexplode()関数で分割する考え方になりますが…
0232nobodyさん
2007/09/13(木) 22:15:31ID:???0234nobodyさん
2007/09/13(木) 22:33:59ID:???function hoge() {
$sql = "SELECT hoge FROM tableA WHERE foo=?";
$res=& $db->query($sql, $foo);
if (DB::isError($res) || $res->numRows()!=1) return false;
$res->fetchInto($row);
$sql = "UPDATE tableB SET hoge=? WHERE foo=?";
$res=& $db->query($sql, array($row['hoge'], $foo));
if (DB::isError($res) || $db->affectedRows()!=1) return false;
$res->fetchInto($row);
$sql = "UPDATE tableC SET hoge=? WHERE foo=?";
$res=& $db->query($sql, array($row['hoge'], $foo));
if (DB::isError($res) || $db->affectedRows() != 1) return;
//以下(ry
return true;
}
0235nobodyさん
2007/09/13(木) 22:34:31ID:???でいいじゃんw
0236nobodyさん
2007/09/13(木) 23:06:47ID:???0237nobodyさん
2007/09/13(木) 23:07:57ID:KIVNzqAT皆さんは自力でエスケープしてます?
0238nobodyさん
2007/09/13(木) 23:09:13ID:???本家ダウンロードページでは最新バージョンへのリンクしか見つかりませんでした。
どこかでダウンロードできないでしょうか。
0240nobodyさん
2007/09/13(木) 23:20:28ID:???0241nobodyさん
2007/09/13(木) 23:21:35ID:???つttp://jp2.php.net/releases/
0242nobodyさん
2007/09/13(木) 23:23:39ID:KIVNzqATありがとうございます。そしてさすがPHP。
かゆい所に手が届きすぎです。
0243nobodyさん
2007/09/13(木) 23:24:04ID:???すげー、逆に使ってみたい。
0244nobodyさん
2007/09/13(木) 23:26:29ID:???見つかりました。ありがとうございます
なんでこのバージョンかというとクライアントの指定してきた
ミドルウェア(これもまた相当古いバージョンですが)が4.4系に対応していない為なのです。
最新版でもいけんだろ、と高をくくっていたら本当に4.4.7では動かなかったもので…
ともあれこれで作業できます。助かりました
0245nobodyさん
2007/09/13(木) 23:29:52ID:???0246nobodyさん
2007/09/13(木) 23:30:06ID:???まーそんなときもあるよな。
0247nobodyさん
2007/09/14(金) 01:10:03ID:rv5QGrrD$a = "きしkydpxckdyyrxはにr6ksれなつにxsrrkyちてとyrkきくなにき";
($aは不規則の連続文字)
だとして行の先頭から指定の文字数(またはバイト)で
改行を差し込みたい場合はどうすればいいのでしょうか?
mb_substrでバイトを測れても、これだと
最初の改行を入れた後に次の行の先頭から測ることが必要ですよね
で、正規表現で測っても、eregi_replaceなどで変換ではなく
文中に差し込む必要があるため、どうしていいのかわからなくなってます;;
0248nobodyさん
2007/09/14(金) 01:36:49ID:???0249nobodyさん
2007/09/14(金) 01:38:38ID:???0251nobodyさん
2007/09/14(金) 02:36:09ID:07nleTLs&&をつかうと"Parse error: syntax error, unexpected T_STRING "
がでてしまいます。
if(($a) == "XX" && ($c) == "XX"){
でなにかおかしいところってありますか?
0254nobodyさん
2007/09/14(金) 03:26:09ID:n3vYsmYwDB:SQL Server or Oracle
Webサーバ:Apache
次のような処理を現在ではPHP(+APC)を使っておこなっています。
これよりも、もっと高速に処理したい場合、どんな手段があるでしょうか?
(例えば、Cで作ったCGIとか、Apacheモジュール使うとか)
また、どの程度(1割くらい、とか倍以上、とかレベルでOK)早くなるでしょうか。
ちなみに、Webサーバを分散させる、マシンのスペックを上げる、そもそもHTTP使うな、
では、ちょっと無理な事情があるので、これ以外でお願いします。
やりたいこと
クライアント(ブラウザではない)からPOSTされてきたデータを元に以下の処理をします。
1.SQL文のWhere句にくっつけて実行、結果の値をクライアントに返す
2.パラメータの値により異なるファイルをダウンロードさせる
3.ファイルがアップロードされてきたときは特定のフォルダに保存
※1〜3はURLによって処理内容を分けています。
これらを1時間に20万リクエストくらいをさくさくこなしたい。
ちなみにサーバはCPU:3GHz、メモリ2〜3GBな感じを考えてます。
よろしくお願いします。
0255nobodyさん
2007/09/14(金) 06:54:59ID:???Cで専用のApacheモジュールを作るのが1番早いけど
ボトルネックはファイルのアップダウンでプログラムの処理する部分はたいしたことないから全然変わらないと思う
0257nobodyさん
2007/09/14(金) 08:36:46ID:???Javaで作ったほうがいいと思うが・・・
0258nobodyさん
2007/09/14(金) 09:02:48ID:rtA26Ijr20万アクセスに耐えるプログラムは組めたとしても
サーバー構成が1台でWEB+DBの設計だと持たないと思われるので
むりじゃね?
0259nobodyさん
2007/09/14(金) 09:05:19ID:???処理内容を見る限りプログラム側の処理なんて微々たるもので
ほとんどはWebサーバーのパワーと帯域次第って感じに見えるから
PHPでもmod_perlでもJavaでもそんな変わんないんじゃないかな。
(CGIだとCで作ったって何で作ったって確実に今より遅くなると思う。
あとApacheモジュールって…PHPは最初からApacheモジュールなんだが)
ちなみにこれ、
1.Whereに付加する条件って何項目くらいあるの?十分に最適化されてるの?
2.ダウンロード・アップロードするファイルの平均サイズは?
3.ダウンロード・アップロードのリクエスト頻度は?
が気になるけど、処理速度を改善するとしたらダウンロード用か
アップロード用にWebサーバーと回線を分離してやるのがまず第一だと思うけどね。
聞いてる限りじゃボトルネックになりそうなのはここしか見当たらないから
それ以外に改善の余地なんてほとんどない気がする。
まずボトルネックになってるのはどこかちゃんと分析してやりなよ。
少ない資源でチューンしようって言うならそんな漠然とした話じゃ無理。
0260nobodyさん
2007/09/14(金) 09:27:38ID:???0261nobodyさん
2007/09/14(金) 09:31:26ID:???こんなんでどうだろ。
$a = "きしkydpxckdyyrxはにr6ksれなつにxsrrkyちてとyrkきくなにき";
$b = $a;
do {
$a = $b;
$b = mb_ereg_replace('^([^\n]{4})([^\n])', "\\1\n\\2", $a, "m");
} while($a != $b);
var_dump($b);
結果:
string(67) "きしky
dpxc
kdyy
rxはに
r6ks
れなつに
xsrr
kyちて
とyrk
きくなに
き"
0262nobodyさん
2007/09/14(金) 09:32:18ID:ri4+Axdv<?
$text = "あいうえお";
echo mb_strlen($text);
?>
での出力が「8」になるのですがなぜでしょう?
ちなみに、文字コードはUTF-8です。
Shift_JISに直すと「5」と、正常に表示されます。
0264nobodyさん
2007/09/14(金) 10:01:15ID:ri4+Axdv有難うございます
文字コードを指定して使えるんですね。
完全に見逃していました。
0266nobodyさん
2007/09/14(金) 10:12:11ID:ri4+Axdv0267nobodyさん
2007/09/14(金) 13:16:52ID:ri4+Axdvパーミッション何にするのがいいのでしょうか?
0700?
0269nobodyさん
2007/09/14(金) 13:23:29ID:ri4+Axdvサンクス
その方法頂きます
0270nobodyさん
2007/09/14(金) 13:30:44ID:ri4+Axdv0271nobodyさん
2007/09/14(金) 13:34:58ID:???0272nobodyさん
2007/09/14(金) 13:38:12ID:ri4+Axdv0273nobodyさん
2007/09/14(金) 14:19:16ID:???600か606にするしかないんじゃないかな。
600にしようと思ったらApacheの実行ユーザで
アップロードしないといかんと思うけど。
0274nobodyさん
2007/09/14(金) 14:21:28ID:ri4+Axdvそかー
どもです。
0275nobodyさん
2007/09/14(金) 14:22:42ID:???0276nobodyさん
2007/09/14(金) 14:47:02ID:???してるよ。
0277nobodyさん
2007/09/14(金) 16:45:35ID:sODpU595EUC-JPなPHPで処理をしているのですが、IE7やFirefoxなどでは化けてしまいます。
JIS-X0213(でしたっけ?)のローマ数字なのだと思うのですが、
正しく扱えない文字なのでしょうか?それともPHPが何か変な変換でも
かましていたりするのでしょうか?
UTF-8を使うのが正解なのかな。
0278nobodyさん
2007/09/14(金) 16:50:55ID:???こういう事では?
0279nobodyさん
2007/09/14(金) 18:29:39ID:???UTF-8がいいと思うけど
EUC-JPにも種類があってはしごたかやローマ数字等の拡張文字部分に違いがある
Postgresは知らないけどたぶんeucJP-ms(eucJP-win)だと思う
一方IEやFirefoxのEUC-JPはコードページ51932というやつ
最新のPHPではCP51932が使えたと思うから変換すれば使えるかも
$str = mb_convert_encoding($str, "CP51932", "eucjp-win");
でもEUCからEUCへの変換ってあほっぽいよね
何のために文字コード統一したのかわからない
で1行目に戻る
0280nobodyさん
2007/09/14(金) 18:46:54ID:sODpU595utf-8やsjis-winに変換すると '?' になります。
>>279 さんのを試してみると見事に変換に成功しました。
("utf8", "eucjp-win"); とか("sjis-win", "eucjp-win");
でもうまくいけるようです。
EUCからEUCへ変換するのは確かに間抜けですけど、
まぁ仕方ないのかもしれません。
これがバッドノウハウって奴でしょうか。
0281nobodyさん
2007/09/14(金) 18:50:25ID:???htaccessが置けるなら、includeされるファイルを置くディレクトリを用意して、直アクセスは弾けば良い
0282nobodyさん
2007/09/14(金) 19:23:17ID:sODpU595Javaで書かれたコードでは正しく処理されていたので、
Javaはeucjp-winと同じ方法でutf-8と変換していたという事でしょうか。
0283nobodyさん
2007/09/14(金) 21:37:58ID:PTuC71hk0284nobodyさん
2007/09/14(金) 21:41:13ID:???2.次に訪れたら保存した日時を取り出す+記録する
3.表示する
0286nobodyさん
2007/09/14(金) 21:46:58ID:???0288nobodyさん
2007/09/14(金) 22:09:16ID:PTuC71hk挑戦してきます。レス有難うございました。
0290nobodyさん
2007/09/14(金) 23:11:59ID:???ログイン認証するようなサイトならともかく、
一般的な個人サイトならやめときな。
仕組み知らない訪問者は不気味がってアクセス数減るよ。
0291nobodyさん
2007/09/15(土) 02:17:30ID:???0292nobodyさん
2007/09/15(土) 04:39:32ID:V+kYhkB110〜60の時はそのままで、0〜9の時は先頭に0をつけてて00や05にするには
何かいい方法ないでしょうか?
今は、if($a<10){ などとしてるのですが。
0293nobodyさん
2007/09/15(土) 04:43:39ID:???0295nobodyさん
2007/09/15(土) 05:59:12ID:???0296nobodyさん
2007/09/15(土) 07:51:26ID:rDYCANkK0297nobodyさん
2007/09/15(土) 10:58:43ID:???0298nobodyさん
2007/09/15(土) 11:01:39ID:???0299nobodyさん
2007/09/15(土) 11:52:54ID:FRg1UB2Sマルチバイト関数
0300nobodyさん
2007/09/15(土) 12:26:59ID:V+kYhkB10301nobodyさん
2007/09/15(土) 13:56:23ID:rxB3R/I3危険な香りがするのですあが・・・
ttp://usuarios.arnet.com.ar/larry123/safe.txt
0302nobodyさん
2007/09/15(土) 15:25:45ID:???フリーの領域が何バイトあるかとか
別に危険な香りはしない
0303nobodyさん
2007/09/15(土) 16:02:42ID:CbXLFV8Y$func = new Hoge();
$func('gorua');
こんなふうにやりたいのよ。
0304nobodyさん
2007/09/15(土) 16:56:17ID:???0305303
2007/09/15(土) 17:08:47ID:CbXLFV8Yオブジェクトの主要目的は関数オブジェクトにしたいなーと。
$factory = new MyFactory();
$obj = $factory->produce('foo');
よりは
$obj = $factory('foobar');
がイイナー。
まぁ、どっちでもいいんですが。
単にできないものかなと。
0306nobodyさん
2007/09/15(土) 17:15:52ID:???$test = GetwordIntag("<title>ほげほげ</title><b>あああ</b><title>いいい</title>");
print_r($test);
function Hoge($str) {
preg_match("/<title>([^<]+)<\/title>/",$str,$match);
return $match;
}
と、このようにして、titleタグで囲まれた文字を配列で全て返すようにしたのですが、結果は
Array
(
[0] => <title>ほげほげ</title>
[1] => ほげほげ
)
となってしまいました。
どなたか、全て返す方法をご存知ではないでしょうか?
0307nobodyさん
2007/09/15(土) 17:16:34ID:???$test = GetwordIntag("<title>ほげほげ</title><b>あああ</b><title>いいい</title>");
↓
$test = Hoge("<title>ほげほげ</title><b>あああ</b><title>いいい</title>");
です。すみません。
0309nobodyさん
2007/09/15(土) 17:27:58ID:???preg_match_all はどうですか?
http://jp2.php.net/manual/ja/function.preg-match-all.php
0311nobodyさん
2007/09/15(土) 19:14:03ID:???縦に名前、横に日付、で○×という感じのUI (↓が例)にしたいのですが、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 〜 31
名前1
名前2
名前ごとにSQLでforeachをさせるとHTML的にも簡単ですが、SQL回数が人数×日付になり
人数が増えた場合に速度や負荷が心配です。
(まあ気にするほどではないかもしれないが、設計的に間違ったスクリプトは嫌です)
日付でSQLをすると、該当月の末日数のSQLでDB鯖にはやさしいが
まず配列などに結果を入れて、後で表示HTML用にforeachする感じになり複雑です。
時と場合によると思いますが、皆さんは根本的にはどちらが好みでしょうか?
0312nobodyさん
2007/09/15(土) 19:22:40ID:???日ごとに○と×なら整数型のビットフィールドにするとか。
1回のクエリーで1月分をまとめて取れるYo。
DBのテーブル設計を見直した方がよくないかい。
0313nobodyさん
2007/09/15(土) 19:41:30ID:???ああああああ
いいいいいい
というのを、phpで
<p>ああああああ</p>
<p>いいいいいい</p>
と<p>タグで囲って出力したいのですが、方法が見つかりません
どのようにすれば良いのでしょうか?お願いします
0314nobodyさん
2007/09/15(土) 19:50:25ID:???foreach (file('text.txt') as $line) { echo "<p>{$line}</p>\n"; }
こうか?
0315311
2007/09/15(土) 19:53:28ID:ITnns1Uw1回!? マジですか
DBの設計まで行くと板違いになるので、情報小出しのようになってしまいましたが、
月の表示は>>311で、各○の部分はリンクで、押すと該当日のスケジュール(グラフ表示など)
という風にする予定です。 それでDBは日が中心のテーブルになってました。
(id, date, user_no, start_time, end_time, note こんな感じ)
DBのほうで月の表示用テーブルを増やし、各利用者が日のスケジュール登録時に
そっちのテーブルにも記録するような設計にする というのがイイのですかね?
いつもDB設計は変えず、表示のPHP側で色々複雑にしてた場合が多いので参考になります。
ただ、1回のクエリーでまとめて取る方法が分からないです。
もし宜しければ、簡単な表の例でいいのでSQLや処理を御教示お願い致します。
0316312
2007/09/15(土) 20:12:00ID:???スケジュール表が、日ごとの有無と見えたので、
それなら1回のクエリで十分に見えました。
32ビットの整数なら1月分まとめて取り出せるなーと。
あと、1回のクエリで済ますなら配列を使う必要がありますね。
SQLは昔に少しかじった程度なのですぐに例をあげるのは無理です。
なんか偉そうなこといってスマンかった。orz
0318nobodyさん
2007/09/15(土) 20:25:18ID:???0319317
2007/09/15(土) 20:26:26ID:rDYCANkK>>314で正解だ。
0320nobodyさん
2007/09/15(土) 20:51:54ID:???ありがとうございます。ちょっと頭が固かったみたいです…
何度も質問すみません
今、Wikiもどきを作成しているのですが、
[http://nantoka.com:title=なんとか]
を
<a href="http://nantoka.com">なんとか</a>
のように出力することは可能でしょうか?
また、その方法があればご教授ください。。。
■ このスレッドは過去ログ倉庫に格納されています