トップページ⇒php
1001コメント324KB

【PHP】下らねぇ質問はここに書き込みやがれ 39

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/02/12(月) 20:33:59ID:???
まず読め→【PHP マニュアル】http://www.php.net/manual/ja/
PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレ、関連スレ、FAQなどは>>2-10辺り

◆前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 38
http://pc10.2ch.net/test/read.cgi/php/1170520777/

◆質問する時の注意
・ 自分の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
・速さについては自分でベンチをとってここに書け(違う環境の人も調べてくれるかも)
 しかし初心者が目的も定めずに速度を気にしたところでほとんど意味は無いぞ
07577542007/02/20(火) 15:40:27ID:???
>>755-756
ちょっと書き方が分からないのですが、、、
preg_match("/http://([0-9a-zA-Z])[\"]/",$html_code,$html_array);

ではないですよね?
0758nobodyさん2007/02/20(火) 15:44:30ID:???
ではないですよ。
0759nobodyさん2007/02/20(火) 15:44:33ID:???
>>748
> 商用の場合MySQLはタダじゃない

どこにそんなライセンスがある??
商用の場合だってタダのケースが多々あるぞ。
逆に言えば、どのケースの場合が有料なのかを示してほしいね。
そっちのほうが少ないから。
0760nobodyさん2007/02/20(火) 15:44:54ID:/OHhVetq
>>741-752
ありがトン
セキュリティーはSSIで対応するとして、ワンクリックで課金というようなものでもないです。
ただ、内部のものが気軽にいじれるんでは困るので…
postgreSQL調べてみます。
0761nobodyさん2007/02/20(火) 15:52:11ID:???
>>757
「<a href="」と「" target="_blank">」にはさまれてる、という書き方が楽かと。
0762nobodyさん2007/02/20(火) 15:52:55ID:rS4uJTur
function hoge() {
  if (条件) {
    $str = "string";
    return $str;
  }
  return true;
}

こんな感じで、条件によって返り値の型が違うのですが、
問題ないでしょうか?
0763nobodyさん2007/02/20(火) 15:54:26ID:???
>>759
はいはい、じゃああんた商用のプログラムのソースコードを公開しなさい
http://www.mysql-partners-jp.biz/license.html
0764nobodyさん2007/02/20(火) 15:55:29ID:???
>>762
動くか動かないかで言えば動く。
でも普通、返り値があるならそれを、そうでなければ false を返した方が
自然な流れじゃね?
修正したりするときも、そっちのがわかり易いと思う。
0765nobodyさん2007/02/20(火) 15:57:26ID:rS4uJTur
>>764
やっぱそうですよね。
他の書き方に変えたいと思います。
どうもありがとうございました。
0766nobodyさん2007/02/20(火) 15:57:35ID:???
>>762
返り値の型が違うこと自体は問題ないけど、意味のわからんコードは問題ある。
0767nobodyさん2007/02/20(火) 16:00:02ID:???
nullでいいよもう
0768nobodyさん2007/02/20(火) 16:03:06ID:???
>>762
PHPは標準関数でも戻り値がmixedのやつが多い
0769nobodyさん2007/02/20(火) 16:03:15ID:rS4uJTur
ちょっと意味を読み間違えていました。

function hoge() {
  if (条件) {
    $str = "string";
    return $str;
  }
  return false;
}

これなら大丈夫でしょうか?
0770nobodyさん2007/02/20(火) 16:07:02ID:???
>>769
俺はいいと思う。
その方が自然だし。
0771nobodyさん2007/02/20(火) 16:10:11ID:rS4uJTur
>>770
どうもありがとうございます。
これでまた少し賢くなりました。
早速続き書いてきます。
0772nobodyさん2007/02/20(火) 16:54:56ID:wxBC7nWr
>>769
こういう関数を作る時、false→エラーとなるような場合には

・関数内でエラー処理までさせる
・返り値で判別させる

と迷うのですが、普通はどちらにするものなのでしょうか。
今は関数の使いどころに応じて使い分けています。
0773nobodyさん2007/02/20(火) 16:59:56ID:???
>>772
普通かどうかはわからないが

if (!$str = hoge()) {
error();
}

とかやって、falseを返してエラー関数を呼び出すな
0774nobodyさん2007/02/20(火) 17:33:09ID:???
好き嫌いありそうだけど。
関数・クラス設計上ありえないエラーは、内部で
無理やりExitさせたりしてる。
入力によっては有り得るエラーはCall元で処理させてる。
0775nobodyさん2007/02/20(火) 17:40:17ID:???
好みとか決めの問題、仕様の問題になるけど、基本返り値で判断させてる。
関数内でエラーチェックさせてると、後で見たときにエラーチェックをしているかどうかを
関数の中を見ないといけないのが面倒だし、返り値でfalseを使う以上、
返り値を見るのがスジかなあと思っているので。
ただし、その関数があちこちで呼ばれているなどで、関数内で判断させた方がいい場合もあるし、
一概には言えない。
主な仕様を決めてしまって、それにのっとってやるのが良いと思う。
0776nobodyさん2007/02/20(火) 17:54:07ID:???
となると、やっぱphp5で気楽にthrowできることのありがたみが身にしみるな。
0777nobodyさん2007/02/20(火) 17:56:03ID:???
どうして例外が出てこないのか不思議だったw
0778虚弱PHP2007/02/20(火) 18:05:14ID:???
自分で作ったプログラムはなるべくエラーを返さずに済むようにするw
throwも問題はあるから、あんまり使いまくるのは良く無さそう。
0779nobodyさん2007/02/20(火) 18:21:32ID:???
>>763
MySQLのダメダメなところは、そのライセンス体系の複雑さと曖昧さ。

「再頒布しないのならライセンス不要」と言ってる一方で、
「■MySQLを含んだソフトウェアを顧客に販売し、顧客が自身のマシンに当該ソフトウェアをインストールする場合」はライセンスが必要だとも言っている。
この両者は矛盾する。
なぜなら、「頒布」という言葉は多数に広く配布することだから。
ある特定の顧客一人(一社)に有償で譲渡することの何が「頒布」に当たるのか? MySQL ABはその辺がダメだ。
0780nobodyさん2007/02/20(火) 18:24:18ID:???
数学的解釈では何の問題もないけどね。
もちろんその解釈じゃ駄目なんだろうけど。
0781虚弱PHP2007/02/20(火) 18:28:46ID:???
MySQLのライセンスの話になると、
ライセンス発行してる会社ですら曖昧な事しか言わなくなる。
心配ならライセンス買っとけって言われるんだよね。

というわけで、俺はMySQLライセンスをきちんと理解してませんw
0782nobodyさん2007/02/20(火) 18:30:32ID:???
>>778
throwの問題とは?
0783nobodyさん2007/02/20(火) 18:32:48ID:qg/4MsFw
オブジェクト指向を勉強しようということで、カウンターから始めてみました。
以下のクラスを$action->IP_Check($_SERVER['REMOTE_ADDR'])
で呼び出してみたところfgetsとfcloseで"supplied argument is not a valid stream resource"
とエラーログを吐かれました。これは「クラス内でファイルを読み書きするな」ってことですか?
というか、オブジェクト指向はこんな記法であってるでしょうか?

class IP_Check{
 function IP_Check( $IP ){
  $fp = fopen($IPchecklog, "r");
   $compareIP = fgets($fp, 1024);
  fclose($fp);
  if($IP == $compareIP){ return false; }
  else { return true; }
 }
}
0784nobodyさん2007/02/20(火) 18:34:17ID:???
>>783
本当にファイルがopenできてる? 失敗しているんじゃない?
fopenしたあとの$fpの値を調べてみるよろし。おそらくfalseになってる。
0785軟式PHP2007/02/20(火) 18:35:26ID:???
>>783
IPchecklogってどっから来たんだ。
あとfopenの後はエラー処理をしませう。
0786nobodyさん2007/02/20(火) 18:40:50ID:wxBC7nWr
>>773-778
やはりそういうものですか。
参考になりました、ありがとうございます。
07877832007/02/20(火) 18:45:20ID:qg/4MsFw
>>784,785
方々のご推察の通り$IPchecklogがクラスの外にあり、
ファイルオープンできてませんでした。
ありがとうございました。

コイツは前途多難だな .... orz
0788nobodyさん2007/02/20(火) 18:48:46ID:???
まあがんばれ。結果チェックなんて面倒くさいと思いがちだが
結果をチェックしないほうが事態が面倒くさくなることのほうが多いぞ
0789虚弱PHP2007/02/20(火) 18:51:45ID:???
>>782
throwはgoto文より強力な制御構造だから。
使い方に注意しないと、
本当にやるべきことをやってるのか後で確認するのが辛くなる。
小規模だったら問題ないと思うけど。
0790nobodyさん2007/02/20(火) 18:53:49ID:???
>>788
結果チェックより事前チェックだろw
できるだけ早い時期に障害を見つけるのが肝要だ。
fileの処理でいうなら、ファイルを開く前にファイルの存在チェックや
読み取り(書き取り)可能かをチェックすることだ。
0791nobodyさん2007/02/20(火) 19:07:11ID:???
>>783
オブジェクト指向ってのは書き方の概念というか
抽象的な物だからこれが正解ってのはないけど
そんな感じに一つのオブジェクトでの役割を簡潔にして
同じような処理は関数化しておいたりして
組み立てていく感じでいいと思うよ。や、俺もよくわかってないが…
0792nobodyさん2007/02/20(火) 19:08:12ID:???
>>781
本家本元のサイト見ても、曖昧な記述しか載ってないからねww
●●の場合はライセンス購入を「お勧めします」だもんw
「購入する必要があります」って断定じゃないからね。
0793nobodyさん2007/02/20(火) 19:21:17ID:???
>>779
再頒布若しくはMySQLを含んだソフトウェア販売の場合はライセンスを取得しなくてはならない
ってことでしょ?
何が難解なの?
0794nobodyさん2007/02/20(火) 19:23:29ID:???
>>793
単純なお前がウラヤマシス
0795nobodyさん2007/02/20(火) 19:24:33ID:???
>>793
アフィ厨が言ってるようなバックエンドでMySQLが動いてる
商用Webアプリは「再頒布」でも「ソフトウェア販売」でもないよな?
これはどっちだ?無償とも有償とも読み取れないぞ
0796nobodyさん2007/02/20(火) 19:52:06ID:???
もうOracleかDB2でいいよ
0797nobodyさん2007/02/20(火) 20:08:11ID:???
そもそも>>737の、
>PHPとMYSQLの組み合わせがベストでしょうか?
という質問をなんでPHPのくだ質スレでするのか…?
0798nobodyさん2007/02/20(火) 20:54:53ID:???
>>796
DB2は、とっくの昔にMSのSQLServerに吸収されちゃっているけど、何か?
0799nobodyさん2007/02/20(火) 20:55:07ID:wdqQBZkR
ピザまん買ったら、ピザまんに『ピザ』って書かれてた
http://www.uploda.org/uporg700785.jpg
0800nobodyさん2007/02/20(火) 20:57:44ID:???
>>798
まだあるだろ・・・常識的に考えて
0801nobodyさん2007/02/20(火) 21:18:41ID:???
>>793
「頒布」という言葉を辞書で調べろ。
0802nobodyさん2007/02/20(火) 21:25:31ID:???
>>801
順序が逆だろw
日本語訳じゃなくて、原文(英文)をよく読め。
0803nobodyさん2007/02/20(火) 21:31:34ID:???
>>789
うーん、gotoはどんな処理をしているのかが非常にわかりにくくなる面があるけど、throwは処理を中断する方向にしかいかないし、そもそも「どこまで飛ぶか」を意識する必要もないんじゃないかな。
エラーとか入力チェックとか変数のnullチェックとかで、つじつまを合わせるのが難しいと感じたら、すぐthrowするくらいの勢いで問題ないと思うよ。
まあ確かに限度はあるだろうけど・・・。
0804nobodyさん2007/02/20(火) 21:43:11ID:???
うん。throwはばしばしとばしまくりで問題ないと思う。
気をつけなければならないのはcatchの方。
要らないやつまで細かくcatchすると、どこで捕捉されているのかわからなくなる。
0805nobodyさん2007/02/20(火) 21:48:48ID:???
>>803-804
throwってどうやって使えばいいの?
ifとかexitとかで代用できそうな気がしていまいちよく分からない
0806nobodyさん2007/02/20(火) 21:57:06ID:???
俺も知りたいです。
or die使いまくりなもんで。。
0807nobodyさん2007/02/20(火) 22:03:52ID:???
>>805
代用できなくはないけど、例外処理のほうがフレキシブル。
exitは一回呼び出したら全てが終了するけど、throwした例外はcatchさえすれば、回復して元の処理を継続することができる。

たくさんthrowしても、まとめて全部catchすることもできるし、catchブロックはエラー等の対処という明確な位置づけで考えることができるから、一度理解してしまえばすごくわかりやすいしね。
とにかく、エラー処理(=面倒くさい処理)を一箇所にまとめることで、コードがとても清潔で健康な状態に保たれる。
0808nobodyさん2007/02/20(火) 22:04:19ID:???
>>802
> 原文(英文)をよく読め。

その必要は全くない。
公式な日本語訳が存在してるんだから。
0809nobodyさん2007/02/20(火) 22:35:07ID:???
if (func1()==false) {
エラー処理
}
if (func2()==false) {
エラー処理
}
func3();

08108092007/02/20(火) 22:36:21ID:???
try {
func1();
func2();
func3();
}
catch {
エラー処理
}
08118092007/02/20(火) 22:37:57ID:???
いまいちな例かもしれんが、
プログラム組んでると正常処理が異常処理に埋もれてしまう。>>809
try,catch使うと、これらを分離しやすい。>>810
のもtry,catchの利点かもな
0812nobodyさん2007/02/20(火) 22:40:42ID:???
いや、わかりやすかった
08138092007/02/20(火) 22:41:18ID:???
一方、どの関数からどんな例外が投げられるかが
>>810 ではわからん。というのはデメリットだな。
>>789 がgotoより強力といってるのはこれのことかと。
0814nobodyさん2007/02/20(火) 22:45:46ID:???
>>813
そういうのはthrowする側が例外オブジェクトで通知してくることなんじゃないかな。
0815nobodyさん2007/02/20(火) 23:08:40ID:WMH2bERy
$subject = "";

if(preg_match('/^([0-9a-zA-Z]*)$/', $subject))
    echo "マッチしました";
else
    echo "マッチしませんでした";

$subject は、空文字列 ( "" ) なのでこの正規表現では
マッチしないはずなのですが、「マッチしました」が出力されます?
なんででしょうか……。
0816nobodyさん2007/02/20(火) 23:13:46ID:???
preg_match('/^([0-9a-zA-Z].*)$/', $subject)
0817軟式PHP2007/02/20(火) 23:14:04ID:???
*だからね。
0818nobodyさん2007/02/20(火) 23:15:13ID:???
>>815
*は0以上マッチすることを表す。
つまり、空文字にもマッチする。
恐らく君が望む場合*を+(一回以上のマッチ)に変更しなければならない。
0819nobodyさん2007/02/20(火) 23:19:40ID:WMH2bERy
>>816, >>817, >>818
なるほど!よくわかりました。
ありがとうございました。
08208162007/02/20(火) 23:20:18ID:???
すまん、1文字以上は+だったわ
あれ?ドットってなんだっけ?1文字だけだったよな
0821nobodyさん2007/02/21(水) 01:28:57ID:???
 
無   理   す   ん   な
 
0822nobodyさん2007/02/21(水) 01:45:20ID:???
正規表現のレスをした後って、必ず一抹の不安が残るよねw
0823nobodyさん2007/02/21(水) 01:56:21ID:???
一応テストしてから書くようにしているからさほど心配はしないけどなw
0824nobodyさん2007/02/21(水) 03:33:33ID:???
フォームの値を取得する際にどこから来たのか調べたいので

$hoge = ほにゃらら
if($hoge != $_SERVER["SERVER_NAME"]) {
error();
}

とやりたいのですがほにゃららに当てはまる処理はどのように記述したら良いでしょうか?
0825nobodyさん2007/02/21(水) 03:40:57ID:???
$_SERVER["HTTP_REFERER"]

まあ偽装できるけどね。
あと!=じゃなくてstrposとか部分一致で判断しないとダメ。
0826nobodyさん2007/02/21(水) 03:46:22ID:???
$AcceptHost = "/example\.com/";

if( preg_match($AcceptHost, $SERVER['HTTP_REFERER']) ) {
 error();
}
0827nobodyさん2007/02/21(水) 03:47:19ID:???
- if( preg_match($AcceptHost, $SERVER['HTTP_REFERER']) ) {
+ if( !preg_match($AcceptHost, $SERVER['HTTP_REFERER']) ) {
0828nobodyさん2007/02/21(水) 03:49:38ID:???
>>824
判定させる意味が分かんないけど>>825の言っている様に
どこから来たのかというのがリファラーで
それを吐かない場合にエラーを吐くのであれば''かnullか!で
0829nobodyさん2007/02/21(水) 04:06:42ID:???
strposだと
ドメインがabc.comでリファラーがabcd.comだとエラーになりませんよね?
0830nobodyさん2007/02/21(水) 04:09:42ID:???
aabc.comとabc.comです
0831nobodyさん2007/02/21(水) 05:20:09ID:???
"http://";.$_SERVER["SERVER_NAME"]

にすればいいじゃん
0832nobodyさん2007/02/21(水) 05:22:40ID:???
くそ、Janeのバグか。

"えいちてぃーてぃーぴー://".$_SERVER["SERVER_NAME"]

にすればいいじゃん。
0833nobodyさん2007/02/21(水) 05:42:48ID:???
同じだろ
0834nobodyさん2007/02/21(水) 05:59:03ID:???
いや、IEだと普通に見えるけどJaneだとリンクが化けてるんだよ
0835nobodyさん2007/02/21(水) 06:00:08ID:SAIWRW73
<?php
include $_POST....
?>

↑で色々なHP表示させたんですが、サイトによっては
文字化けしたり、しなかったりします。 何故なんでしょうか?

yahooはOKで、googleは化けたりします・・・うーん
0836nobodyさん2007/02/21(水) 06:03:34ID:???
http://up2.viploader.net/upphp/src/vlphp019543.jpg
?
0837nobodyさん2007/02/21(水) 06:51:24ID:???
>>832
それでwwwありとwwwなしのURLをどう区別する?
0838虚弱PHP2007/02/21(水) 10:23:58ID:???
>>813
まあ、そんなとこです。
>>810で言えば、func1()の中にも関数を呼び出しているところがあるだろうし、
その中で例外を投げるかもしれない。
PHPでは頻度は低いけど、事後処理が必要な場合もある。
んじゃ、事後処理をどこでやるか?
そこら辺を考え出すと例外を投げるにしても、
従来の>>809のようなtry〜catchやらないと、
ちゃんと事後処理をやっているのか、やっていないのか、
後から見た人にはわからないんだよね。
バグが潜伏しちゃうことも起きやすい。
それから、モジュール間の結合も強くなる。
↑こういうのは、設計である程度は避けれると思うけど…。

まあ、自分より遥かに偉いwプログラマーであるレイモンド・チェンとかも
例外は堅牢なプログラムには向かないって感じのこと言ってるから、
偉い人に右倣えなところもあるw
0839nobodyさん2007/02/21(水) 11:50:12ID:???
>>824
話が明後日の方向へ行ってるが。

$url = parse_url($_SERVER['HTTP_REFERER']);
if ($url['host'] != $_SERVER['SERVER_NAME']) {
 error();
}

あとは好きにアレンジすればいい。
0840nobodyさん2007/02/21(水) 12:08:20ID:dxH/dP0k
無名配列にアクセスするような記述方法ってないのでしょうか?
$ary = explode('/', $_SERVER['SCRIPT_NAME']);
echo $ary[-3];
のように変数に代入せず、
echo (explode('/', $_SERVER['SCRIPT_NAME']))[-3]; //これはエラーになるけど
このような感じで一行でできないでしょうか?
08418402007/02/21(水) 12:14:17ID:???
すいません、-3なんて配列への参照はできませんね。
そこはみなかったことにしてください
08428402007/02/21(水) 12:15:31ID:???
あ、もういっこ
5行目は
echo (explode('/', $_SERVER['SCRIPT_NAME'])[-3]); //これはエラーになるけど
と言いたかったんです
スレ汚しすいません
0843nobodyさん2007/02/21(水) 12:43:14ID:nuUqtd8P
参照の概念がいまいち理解出来ないのですが、
どこかに図解で説明してあるウェブサイトはありますでしょうか?
0844nobodyさん2007/02/21(水) 13:15:15ID:???
参照渡しのことか?
ttp://www.kab-studio.biz/Programing/Codian/Pointer/05.html
0845nobodyさん2007/02/21(水) 13:17:14ID:???
>>842
正規表現ではできないですか?
08468432007/02/21(水) 13:20:43ID:???
>>844
仰るとおり参照渡しの事です。
そこは自分でググった時に見たのですが、よく理解出来ませんでしたorz
0847nobodyさん2007/02/21(水) 13:29:48ID:???
>>846
インターネットバンキングの振込機能で料金を支払うのは参照渡し
スーパーで買い物して現金で払うのは値渡し
0848nobodyさん2007/02/21(水) 13:32:19ID:gybahh3H
PHP4でmicrotimeで得られる値を秒にしたいのですが
(float)microtime()で大丈夫でしょうか?
microtime(true)はPHP5からですもんね・・・
08498432007/02/21(水) 13:37:16ID:???
あ、なんか急にわかりました。お騒がせしてすみません;
0850nobodyさん2007/02/21(水) 13:42:18ID:???
>>848
microtimeじゃないといかんの?
0851nobodyさん2007/02/21(水) 13:42:48ID:???
>>840
PHPでは基本的に無理。
かろうじて無名関数っぽいのが書けるぐらい。

>>848
http://jp.php.net/manual/ja/function.microtime.php
ズバリそのまま書いてあんじゃん。
0852nobodyさん2007/02/21(水) 13:55:49ID:gybahh3H
ありがとうございます。解決しました。
0853nobodyさん2007/02/21(水) 14:02:33ID:???
引数のオプションまで知っていながらどこ見てるんだろうな
08548402007/02/21(水) 18:31:56ID:???
>>845
>>851
ありがとうございました
0855nobodyさん2007/02/21(水) 18:43:43ID:UzIeN8wC
DBを使って、何かを作ろうと試行錯誤しているのですが、
はじめての試みなので、わからないことだらけで困惑しています。

とりあえず基礎的な質問かもしれませんが、
最初の1回のみ行う、テーブル生成などのスクリプトは独立させるべきですか?
それとも毎回、テーブルがあるかチェックしてなかったら生成などの処理をするべきでしょうか?
0856nobodyさん2007/02/21(水) 18:56:12ID:3GZpY9r/
スタティック関数を呼ぶ時に、クラス名部分を変数で指定するにはどうすれば良いですか?
以下のコードを試しましたがダメでした。

class test{
public static function testMethod(){
}
}
$method="testMethod";
test::$method();//true
$class="test";
$class::testMethod();//false
■ このスレッドは過去ログ倉庫に格納されています