【PHP】下らねぇ質問はID出して書き込みやがれ 82
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2009/03/09(月) 02:14:28ID:HyrthkeE過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。
◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 81
http://pc11.2ch.net/test/read.cgi/php/1234958956/
◆質問用テンプレ
【OS名】vine linux
【PHPのバージョン】php5.26
【連携ソフトウェア】mysql
【質問内容】
◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)
◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
0320nobodyさん
2009/03/16(月) 23:53:20ID:???0321nobodyさん
2009/03/17(火) 00:28:16ID:PIugUbr/$res = mysql_query($sql);
$row = mysql_fetch_array($res);
echo $row["name"];
こうしたらMySQLから1行取得出来ますが、もっと簡略化する方法は無いでしょうか?
特に、結果が1行・1フィールドだと分かっている場合、
mysql_fetch_arrayをして一旦配列に入れるのは不効率な気がしています。
0322nobodyさん
2009/03/17(火) 00:35:15ID:???0323nobodyさん
2009/03/17(火) 00:38:22ID:???SELECT name FROM address LIMIT 1
配列に代入云々は数マイクロ秒とかのゴミみたいな差しかつかない。
こいつは測定可能なレベルで実行性能に影響する。
0324321
2009/03/17(火) 01:11:49ID:???>>321のようなテーブルにアクセスして、指定値を取得する関数を
作っているのですが、 321のソースでフィールド「name」が異なる場合、
echo $row["name2"];
というように名称を指定して出力しなければいけません。
まぁ、関数を
function dbSelect($fld_name){
echo $row[$fld_name];
}
とすれば良いだけの気がしますが、
何か良い関数があるのかと思い、質問しました。
0325nobodyさん
2009/03/17(火) 02:58:59ID:???応援よろしくお願いします
0326nobodyさん
2009/03/17(火) 03:15:35ID:???0327nobodyさん
2009/03/17(火) 07:54:44ID:???PDOが使用可能であれば…
http://jp.php.net/manual/ja/pdostatement.fetchcolumn.php
0328nobodyさん
2009/03/17(火) 08:04:24ID:???ネックなのは一度もCMSを使ったことがないことだ・・
0329nobodyさん
2009/03/17(火) 09:18:29ID:???0330nobodyさん
2009/03/17(火) 10:44:32ID:Ib1RB6YLデータベースなどに以下のようなデータがあるとします。
id,word
1,日本
2,日本海
3,日本海溝
4,太平洋
これらを辞書として、
・日本海溝は太平洋側にあります。
という文章に最長で一致するものからリンクを張っていくのですが、
<a href="word/3"><a href="word/2"><a href="word/1">日本</a>海</a>溝</a>は<a href="word/4">太平洋</a>側にあります。
のように、重複してリンクが張られてしまいます。
すでにリンクが張られている言葉の内側にはリンクを張らないようにしたいのですが、
どのような対処法が考えられますでしょうか?
PHPで処理する場合の対処法を教えてください。
0331nobodyさん
2009/03/17(火) 11:14:15ID:???0332nobodyさん
2009/03/17(火) 11:32:03ID:???array(
'id' => 1,
'term' => '日本'
)
);
辞書がこんなかんじの配列にあって、
foreach ($words as $word) {
str_replace($word['term'], '<a href="word/' . $word['id'] . '">' . $word['term'] . '</a>', $body);
}
辞書は単語の文字数の長い順にソートさせてあります。
実際のコードとは違うのでどこか変かもしれませんが、流れはこんな感じです。
単純に、辞書の配列をforeachさせて、
str_replaceでアンカータグをつけたものに置き換えているだけです。
なので、重複して置き換えられてしまうのは当然なのですが、
対処法が思い浮かばなくて;
よろしくお願いします。
0333nobodyさん
2009/03/17(火) 11:33:23ID:???×
str_replace($word['term'], '<a href="word/' . $word['id'] . '">' . $word['term'] . '</a>', $body);
○
$body = str_replace($word['term'], '<a href="word/' . $word['id'] . '">' . $word['term'] . '</a>', $body);
0335nobodyさん
2009/03/17(火) 11:45:00ID:PBdJ+iXh【OS名】Windows XP
【PHPのバージョン】php4.4.4
【質問内容】
『−』を含んだ文字列を preg_match で検索するとエラーが発生するのでキーワードを preg_quote で処理すると
『ホームページ』が『ホ―[ムペ―[ジ』となってしまいます。
お知恵を貸して下さい。お願いします。
0336nobodyさん
2009/03/17(火) 11:48:44ID:Vq5xUXrnmb_internal_encoding('utf8');
mb_regex_encoding('utf8');
0337nobodyさん
2009/03/17(火) 11:49:06ID:qY/TJCjNそのエラーを表示しない方法はphp.iniで指定するってのは分かった。
これでエラーは出なくなったわけだが、画像はやっぱり出ない。
どうやらいつも同じファイルを処理した時にエラーになるので
画像ファイル側の問題だと思うけど
これをうまく処理する事はできるの?
そもそも何でこんなエラーがでるの?
知ってる人 教えてYO!
0338nobodyさん
2009/03/17(火) 11:53:27ID:???0340nobodyさん
2009/03/17(火) 13:22:05ID:PBdJ+iXh有難う御座います。
mb_regex_encodingでUTF-8にしてもやはりホ―[ムペ―[ジとなってしまいます。
>>339さん。
まだ勉強中の為に5への以降は難しいです…
0341nobodyさん
2009/03/17(火) 13:33:39ID:???0342nobodyさん
2009/03/17(火) 14:22:48ID:???0343nobodyさん
2009/03/17(火) 14:23:55ID:???0344nobodyさん
2009/03/17(火) 15:16:01ID:???0345nobodyさん
2009/03/17(火) 15:52:24ID:s4aiV5Akこのサイト(みんなのキャンパス:http://campus.nikki.ne.jp/)
のように掲示板の情報を一部だけ閲覧することができ、
登録・ログイン後に情報をある程度投稿すると全ての情報が閲覧できるような
会員制サイトを作成したいと思っています。
WordPressやOpenPNEで色々試したのですがいまいちうまくいきません。
こういうものは、どうやったら実現できるのでしょうか?
よろしくお願いします。
0346nobodyさん
2009/03/17(火) 15:55:22ID:???一部表示処理
} else {
全表示処理
}
0347nobodyさん
2009/03/17(火) 16:03:10ID:???とりあえず Wordpress の方なら is_user_logged_in() でログインしてるかどうか調べられるよ
0349nobodyさん
2009/03/17(火) 16:56:04ID:???各プラグインは自作しなければいけないからな。
俺も自作システムを作る時にWordpressやらOpenPNEやらを見たけど、
やっぱり「目的の仕様に合った作り方」をしているので、
それらを改造してオリジナルのシステムを作るのは無理があるよ。
0350345
2009/03/17(火) 17:04:11ID:s4aiV5Ak質問の仕方が悪くて申し訳ありません。
みんなのキャンパス:http://campus.nikki.ne.jp/
というサイトは登録後ログインしても、
大学の講義情報を3件書き込まないと全ての情報を見ることができません。
このように書き込まないと掲示板の他のページが見れない、といったように
するにはどういった処理が必要なのでしょうか?
よろしくお願いします。
0351335
2009/03/17(火) 17:08:29ID:PBdJ+iXhお陰で解決致しました。有難う御座います。
出来るだけ早く5に以降するよう努力致しますf^^;
有難う御座いました!
0352nobodyさん
2009/03/17(火) 17:13:30ID:???そこがどんな風な実装をしてるかは知らないけど。
ユーザー情報に「書き込んだ回数」を記録する。
一緒に「全ての情報を見れる権限」もフラグとしてDBに記録しておいて、書き込み回数が3回を越えた時点で true にする。
で、ページを表示するときにその権限を持ってるか持ってないかを判断する。
0353nobodyさん
2009/03/17(火) 17:17:13ID:???0355330
2009/03/17(火) 17:37:21ID:Ib1RB6YL0356nobodyさん
2009/03/17(火) 17:44:56ID:???自分がどうやってるか書いてないよな。推測すると、再帰でpreg_matchでもやってんのか?
まぁ、それはいいや。
単語リストをベースにトークナイザーにかけて処理するのがいいと思うよ。
0357345
2009/03/17(火) 18:00:29ID:s4aiV5Ak>>353さん、回答下ったみなさん、有難うございました!
2ちゃんねるはじめてだったのですが回答いただけてうれしかったです。
なんとなく方向がわかったので色々やってみます。
0358330
2009/03/17(火) 18:07:06ID:Ib1RB6YLすみません;
>>332 に書いたのですが、IDを出し忘れてしまって・・・
恥ずかしながら、トークナイザーというのをはじめて聞いたのですが、
どういったものなのでしょうか?
PHPには、その機能は備わっているのでしょうか?
0359nobodyさん
2009/03/17(火) 19:00:40ID:???0360nobodyさん
2009/03/17(火) 19:31:59ID:???アルゴリズムの問題だと思うけど、マッチングした文字列をいったん置き直して、展開しなすとかしたら?
日本海溝は太平洋側にあります。
<3>は太平洋側にあります。
<3>は<4>側にあります。
みたく文字列を順次置き直して、あとから <id>をリンクつきのHTMLで展開。
0361330
2009/03/17(火) 19:43:02ID:Ib1RB6YLそれだけの力があればそうしたいのですが・・・
基本的な考え方だけでもお願いしたいです。
>>360
おぉ!そういう方法がありましたね。
しかし、元の文章に<1>という文字列が含まれていた場合、面倒なことにならないでしょうか?
元の文章は、ユーザーが自由に投稿できる類のものなので・・・
<<<1>>>のように、括弧を増やしたり、!?!1!?!のように、複雑なものにすれば
出現する確立は減らすことができるのでしょうが、それでも0パーセントではないですし・・・
おっしゃるとおり、PHPに関する質問という範囲を超えているかもしれませんが、
どうかお付き合いお願いしたいです。
0362nobodyさん
2009/03/17(火) 19:51:31ID:???0363nobodyさん
2009/03/17(火) 19:51:53ID:???そんで>>360の処理のあとにもとにもどせばよい
0364nobodyさん
2009/03/17(火) 20:07:16ID:???優先順位が悪い
1,日本海溝
2,日本海
3.日本
の順でループして探索して見つかったら置き換えてbreakして位置を記録
最後に置き換えた位置から同様にして探索
これをEOFに達するまで繰り返す
0365364
2009/03/17(火) 20:10:19ID:???忘れてくれ
0366330
2009/03/17(火) 21:04:12ID:Ib1RB6YLリンク外かどうかの判定の仕方がわからなくて・・・
>>360 さんに提示していただいたように、特殊な記法に置き換える方向で行こうかと思います。
>>363
そうでした!一度エスケープのような処理をすればよかったのですね!
・・・これでなんとか解決したように思ったのですが、今度は、辞書に<id>という単語が含まれていた場合に、
問題が発生しました。
たとえば、辞書にこんな感じの単語があると、
id,word
5,<3>
長いものから置き換えるので、
まず「日本海溝」が<3>に置き換えられ、
その後、「<3>」がふたたびマッチしてしまい、
<5>に置き換えられてしまいます。
最終的に出力されるのは
<a href="word/5"><3></a>
になってしまいます。
意外と難しいですね;
>>364
位置を記憶するというのはやってみたのですが、
文字数の長い順に出現するとは限らないのでだめでした・・・;
0367nobodyさん
2009/03/17(火) 21:13:49ID:???そもそも最終的に生成するHTMLにタグじゃない < > を入れてどうする気だ。
テキストとキーワードにあらかじめhtmlspecialchars しておけばいいやん。
0368366
2009/03/17(火) 21:20:04ID:Ib1RB6YLそうでした;;
キーワードもエスケープ処理しておくことでうまくいきました!
おかげさまで、当初の目的が達成できました。
もっと精進します・・・w
レスをくれたみなさん、ありがとうございました!
0369nobodyさん
2009/03/17(火) 21:26:48ID:???"WEBプログラミング"なら、"WEB"や"プログラミング"より
"WEBプログラミング"の方が指定がより明確だから重要度が高いよね。
それに最長一致なら被らない。
処理の重さに関しては、保存時はゆっくり反映で良いので問題ない。
はてダみたいに、外部リンクのサイトのタイトルの文字列まで取得して
投稿を書き換えようとするのは外部サイトの都合で時々タイムアウトしてるけど、
自鯖の中でのリンクの置き換え程度なら、よっぽどキーワード数が多いとかじゃなければ
タイムアウトはまず起こらない。
キーワードを使うケースの場合、ROMユーザーが書き込むユーザーより圧倒的に多いし
そうでなければそのサービスは成り立たないから、ROMユーザーに対して
内容がキャッシュされてれば投稿時はかなり重い処理でも構わない。
0370nobodyさん
2009/03/17(火) 21:29:46ID:???0371nobodyさん
2009/03/17(火) 23:09:10ID:whdlEm3/を
array('a','b','c','d')
にする簡単な方法があれば教えて下さい
0372nobodyさん
2009/03/17(火) 23:25:11ID:???foreach( $oldarray as $key => $value ){
array_push( $newarray, $key ); array_push( $newarray, $value );
}
0373nobodyさん
2009/03/17(火) 23:50:49ID:???$newArray = array_merge(array_keys($oldArray), array_values($oldArray));
0374nobodyさん
2009/03/17(火) 23:52:05ID:???$newArray = array_keys($oldArray) + array_values($oldArray);
0375nobodyさん
2009/03/18(水) 02:04:43ID:???こっちで懐かしいやつが暴れてるぞ
0376nobodyさん
2009/03/18(水) 03:57:38ID:Zcgp4DkA0377nobodyさん
2009/03/18(水) 04:05:19ID:???0378nobodyさん
2009/03/18(水) 08:50:19ID:???0379nobodyさん
2009/03/18(水) 09:22:56ID:???is_int
のことじゃないかとエスパーしてみる
0380nobodyさん
2009/03/18(水) 09:24:58ID:???0381nobodyさん
2009/03/18(水) 09:39:50ID:???///)
/,.=゙''"/
/ i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!!
/ / _,.-‐'~/⌒ ⌒\
/ ,i ,二ニ⊃( ●). (●)\
/ ノ il゙フ::::::⌒(__人__)⌒::::: \
,イ「ト、 ,!,!| |r┬-| |
/ iトヾヽ_/ィ"\ `ー'´ /
0382nobodyさん
2009/03/18(水) 10:52:55ID:???正規表現で調べればよい
if (preg_match("/^[0-9]+$/", $string)) {
妥当
}
0384nobodyさん
2009/03/18(水) 11:00:44ID:???なら
if (preg_match("/^-?[0-9]+$/", $string)) {
妥当
}
かな
0385nobodyさん
2009/03/18(水) 11:03:09ID:???またパターンを増やせばよい
0386nobodyさん
2009/03/18(水) 11:07:58ID:???その辺も考慮しないといかんかな
strlenで32ビット以内かどうか調べる処理とか
0387nobodyさん
2009/03/18(水) 11:10:31ID:???2^32を2の補数で表した値の範囲かどうかだな
?2147483648〜2147483647
0388nobodyさん
2009/03/18(水) 11:22:00ID:???0389nobodyさん
2009/03/18(水) 11:46:44ID:???それから、0123は整数か?
0390nobodyさん
2009/03/18(水) 12:01:38ID:???厳密な数値かはわからないよね
だってそれだと下のどれでも引っかかるからね
123
-123
"123"
"-123"
0391nobodyさん
2009/03/18(水) 12:13:56ID:???0392nobodyさん
2009/03/18(水) 12:33:33ID:???0393nobodyさん
2009/03/18(水) 13:00:35ID:???0394nobodyさん
2009/03/18(水) 13:17:37ID:???0395nobodyさん
2009/03/18(水) 13:24:34ID:???0396nobodyさん
2009/03/18(水) 13:27:19ID:???いちいちグチグチ言うやつは黙ってればいい
0397nobodyさん
2009/03/18(水) 14:23:57ID:R7u4YHhcデジカメとかだとBMPで出力するカメラも結構有るし需要あると思うけど。
ビットマップからイメージ作れるユーザー関数ありますか?
0399nobodyさん
2009/03/18(水) 14:47:40ID:meKzf6DJ0400nobodyさん
2009/03/18(水) 15:58:45ID:???0402nobodyさん
2009/03/18(水) 16:42:30ID:???0403nobodyさん
2009/03/18(水) 17:10:10ID:???画面半分に納めるのはよいプラクティスだって昔だれかがいってた。
スクロールしないと見れないメソッドはクソの匂いがするとも。
0406nobodyさん
2009/03/18(水) 19:48:17ID:???メソッドを何行に収めるかの話が
関係あるのか?
0407nobodyさん
2009/03/18(水) 20:07:04ID:???0408nobodyさん
2009/03/18(水) 20:37:37ID:???0410nobodyさん
2009/03/18(水) 21:14:44ID:???0412nobodyさん
2009/03/18(水) 23:15:59ID:gf2MXR+O開発のローカルのwinかで、
デバッグ云々用とかで判別するのは
if (DIRECTORY_SEPARATOR == '/') { ...
で問題なし?
0413nobodyさん
2009/03/19(木) 00:18:23ID:???それと、Win環境で本番環境同様の状態をエミュレートしたくなった場合も身動きが取れなくなる。
function isDevelopEnvironment()
とかをどこかグローバルにアクセスできる場所(グローバル関数か、クラスのstatic関数)に置いとけ。
他の場所からはこの関数で判定するようにしておけば、判定方法が変わっても変更が一箇所で済む。
実装と意図の分離は設計の基礎。
呼び出し側でやりたい事(意図)は環境の判別なのだから、関数名はそうなっているべき。
環境を識別するのにDIRECTORY_SEPARATORを使う、ってのは実装の話で、意図じゃない。
(もっと言うなら、開発環境がWinで運用環境がUnixなのも「たまたまそうなってる」だけの、つまり実装依存な話)
で、実装の話だが。
俺ならホスト名を開発環境と本番環境で変えておいて、それで識別する。もしくは設定ファイルか何かに書いておく。
WinとUnixを識別できればそれでいい、ってんなら>412で問題ない。
php_uname()関数の例にもディレクトリ・セパレータでOSを判別するコードが載っている。
0414nobodyさん
2009/03/19(木) 00:19:30ID:???それ。
is_numeric()は"."を許したよーな気がする。
気をつけたほうがいいよ〜
D:\tools\php-5.2.8-Win32>php -r "var_dump( is_numeric( '1.5' ) ) ;"
bool(true)
0415nobodyさん
2009/03/19(木) 00:31:24ID:???これはどう?int判定
0416nobodyさん
2009/03/19(木) 00:34:08ID:???0417nobodyさん
2009/03/19(木) 00:35:21ID:???行数っていうのとは違うけど
コメントを書かなくていいくらいに分かり易い
っていうのを目安にするといいっていう考え方もあるね。
コメントで「○○を処理する」とか入れるくらいなら
そのまとまりをprivateなメソッドにする感じ。
まぁ好き嫌いもあるけどねー。
0418nobodyさん
2009/03/19(木) 00:46:01ID:???OOPっていう概念よりも
そもそもプログラミングにおいてクラス使うと何が便利?
って考えたほうが分かりやすいかもしんない。
0419nobodyさん
2009/03/19(木) 00:49:33ID:???常識で考えて・・
■ このスレッドは過去ログ倉庫に格納されています