【PHP】下らねぇ質問はここに書き込みやがれ 26
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
2006/08/07(月) 13:11:50ID:???まず読め→【PHP マニュアル】http://www.php.net/manual/ja/
PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレは>>2-10 関連スレは>>4-10 FAQは>>6-10 辺り
◆質問する場合の注意
1. 自分のIDを表示させること。(メール欄に何も記述しないでください)
2. サーバーのOS、WebサーバーとPHPの種類やバージョン等を明記すること。
3. 己の行った操作、変更などを詳しく明記すること。
4. エラーメッセージはそのまま表記すること。「エラーが出ます」では絶対分かりません。
5. 質問者としても態度をわきまえること。
6. 事前に公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
◆質問後の注意
・質問者は必ずIDを表示させてください。(メール欄に何も記述しないでください。)
・2回目以降は最初に質問した際のレス番号を名前欄に入れてください。
(逆に回答者は質問者に対して>>(アンカー)をつけて答えてください。)
・解決しなくても回答をもらった場合はお礼を言う。
(荒らし、煽りは除く。逆に煽られたときも、無闇に反論せずスルーすべし)
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークはそれぞれの該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
・オブジェクト指向については良スレがないから本を買え。理解できないならムリに使うな。
・速さについては自分でベンチをとってここに書け(違う環境の人も調べてくれるかも)
0825nobodyさん
2006/08/19(土) 19:46:39ID:???if (strlen($x))
0828nobodyさん
2006/08/19(土) 20:04:45ID:m4Ae+hcOありがとうございます。
要は""とNULL以外はTRUEを返すのを、簡単に表記したかったんです。
===を使うと
if (!($x === "" or $x === NULL)) {
こんな感じになって冗長かなぁと、、、
>>825
下のを使うと
if (strlen($x) != 0) {
こんな感じですか?
0829nobodyさん
2006/08/19(土) 20:08:35ID:???0830nobodyさん
2006/08/19(土) 20:30:15ID:???if (strlen($x) != 0)
if (strlen($x))
一緒、strlenの戻り値はint
0831nobodyさん
2006/08/19(土) 20:31:14ID:???0832831
2006/08/19(土) 20:32:36ID:h+QG0TQi0833nobodyさん
2006/08/19(土) 20:51:20ID:???id を メルアドにするか 任意な文字列にするか迷ってます。
メルアドのほうが管理がらくだと思いますが、どちらが良いでしょうか。
0835nobodyさん
2006/08/19(土) 21:12:39ID:???・任意の文字列
サイト側としては個人情報を入力させたりDBに持たなくても済む
ユーザ側としては登録はしやすいが忘れやすい
ID忘れちゃうとリマインダはメール送ってもらうしかない
・メールアドレス
ユーザ側としては忘れにくい
ただ信用できるかどうか微妙なサイトには入力したくない
個人情報を抱えるリスクは生じる(メリットもある)
ちょっとしたツール的なサイトなら文字列ID、
ECとかメールアドレス必要前提のサイトならメアドかなあ
0836nobodyさん
2006/08/19(土) 21:18:27ID:???$hoge[5]="追加";
とかやると元々あった要素が削除されちゃいますよね?
http://210.143.110.132/~php/man/ref.array.html
ここを読んでも実現できそうな関数は見あたらなかったのですが…
0839nobodyさん
2006/08/19(土) 21:32:12ID:???setXXXやgetXXXなどのメソッド名はよく有りますが、
あるプロパティの値をtrueにする為のメソッド名はどのようにつけるべきだと思いますか?
とりあえずsetXXX(true)としてますが、デフォルトがfalseのためそのメソッドを呼べばtrueになるようにしたいのです。
引数でtrueを渡さないとなると、やはりsetXXXでは変な気がします。
そのプロパティをpublicにすればいいのですが、今回の場合それは微妙な感じですので。
0840nobodyさん
2006/08/19(土) 21:35:09ID:???0841nobodyさん
2006/08/19(土) 21:36:59ID:???0843839
2006/08/19(土) 23:20:58ID:???なんでそれが頭に浮かばなかったのか・・・あぁ、やっぱり頭が悪い。
本当にありがとうです。
0844nobodyさん
2006/08/20(日) 01:41:59ID:???eclipse+phpeclipse+PHP/dbg+Samba+subversionでやってます。
一人自宅でだけど。
統合開発環境スレは無くなっちゃったのかな?
0846nobodyさん
2006/08/20(日) 09:30:48ID:???ファイルの更新日時の取得ってどうやるんですか?
0848nobodyさん
2006/08/20(日) 12:35:12ID:???0849nobodyさん
2006/08/20(日) 12:38:20ID:???0850nobodyさん
2006/08/20(日) 12:38:49ID:???0851nobodyさん
2006/08/20(日) 12:40:10ID:O6c5lrE6test.php
<?php
echo "<!-- test -->\n";
?>
index.php
<?php
require('test.php');
?>
で、実行すると
<!-- test -->
と出力されるはずが
?<!-- test -->
となってゴミが付いてしまいます
レンタルサーバでもテスト環境でも結果は同じです
バージョンはともに4.4.2
0852nobodyさん
2006/08/20(日) 12:51:23ID:O6c5lrE6実害は無いのですが、精神衛生上よろしくないので
回避する方法、間違い等あれば教えてください
0853(^ω^)
2006/08/20(日) 12:54:40ID:???UTF-8じゃなかったらごめんね
0854nobodyさん
2006/08/20(日) 13:07:49ID:???べつの作業でツールの文字コード設定変えたままでした
ありがとうございました
0855nobodyさん
2006/08/20(日) 13:22:45ID:???gethostbynameはコアに含まれるのでPHP的には使える。
ただし、サーバからniku.2ch.netに向かってのDNSポートが閉じていると当然使用不可能
0856nobodyさん
2006/08/20(日) 13:44:58ID:???大抵の言語はDNSにアクセスできるでしょ?
つまり言語に依存しないってこと
0857nobodyさん
2006/08/20(日) 13:47:02ID:???0858nobodyさん
2006/08/20(日) 13:50:18ID:???0859nobodyさん
2006/08/20(日) 15:37:42ID:SEQXzGDk0860nobodyさん
2006/08/20(日) 16:51:11ID:???http://pc8.2ch.net/test/read.cgi/unix/1014614044/
http://pc8.2ch.net/test/read.cgi/unix/1000484092/
http://pc8.2ch.net/test/read.cgi/unix/1059971117/
http://pc8.2ch.net/test/read.cgi/unix/999837578/
http://pc8.2ch.net/test/read.cgi/unix/1007136614/
http://pc8.2ch.net/test/read.cgi/db/1057289721/
0862nobodyさん
2006/08/20(日) 17:55:18ID:SEQXzGDk0863nobodyさん
2006/08/20(日) 18:17:57ID:???hoge
└hoge1
└foo1.php
└hoge2
└foo2.php
というフォルダの構成だとして、foo1.phpから
foo2.phpに書かれたクラスを利用するには
foo2.phpをfoo1.phpでrequireしないとだめでしょうか?
php.iniでパス設定しないという前提で。
0864nobodyさん
2006/08/20(日) 18:29:26ID:???なんでそんな依存関係のあるクラスがhoge1とhoge2で分けられてるんだろ、という気がするが、
foo1をrequireするプログラムでfoo2もお約束としてrequireする、というのはダメか?
0865nobodyさん
2006/08/20(日) 18:58:00ID:???クラスのことが全然わかってないんですが、そもそも
PHPのクラスパスってどうなってるんでしょうか?
基本的にrequireしてからじゃないとクラス利用できない…なんてことは
ないようですし、php.iniのincludeで設定したパスのところに
置かないとクラスを読み込めないんでしょうか?
ほんとにくだらないレベルで申し訳ないですが、この辺説明した
書籍ってなかなかなくて…
0868nobodyさん
2006/08/20(日) 19:17:53ID:???0870nobodyさん
2006/08/20(日) 22:23:49ID:???フレームワークで自動で読み込まれるのは
http://www.php.net/manual/ja/language.oop5.autoload.php
を利用したり、iniで設定されたものを事前に読み込んだりしている。
0871nobodyさん
2006/08/21(月) 00:59:41ID:???0872nobodyさん
2006/08/21(月) 01:03:13ID:???それともプログラム中から呼び出すor書き込む等、必要に応じて
その都度セッション・ファイルから読み出し・書き込みされて、
スクリプトの終了と共にメモリから解放されるの?
0873nobodyさん
2006/08/21(月) 01:32:07ID:???Railsを参考にしたフレームワークは結構開発されてる。
詳しくは専用スレでドウゾ。
http://pc8.2ch.net/test/read.cgi/php/1151706907/
>>872
このスレで答えになる話題でてるぞ。探せ。
0874742
2006/08/21(月) 10:34:33ID:bnVaTE3o返答ありがとうございます。またせっかく回答をして頂いたのに返事が遅くなって、申し訳ないです。
クラス定義より前にデータを読み出しているという状態が、どんな状態か
ちょっとよく分からないのですが、以下の状態が同じ配列に並列にならんでいます。
object(stdClass)(11) {
["ItemAttributes"]=> &object(stdClass)(13) { ["Author"]=> string(16) "ほげ ほげお"
(略)
["ItemAttributes"]=> array(16) { [0]=> string(16) "ほげ ほげお"
}
毎回同じ本のデータがこの状態になります。
しかし本家Amazonのページで同じ本を検索すると問題なく著者が表示されているので、
私の方に何か問題があると思えるのですが、見当も付きません。
0875715
2006/08/21(月) 11:26:33ID:Xr9Z9Klv早速、金曜日の続きを以下のスクリプトで表現してみました
「確認画面」を押すと、別のphpファイルに飛ばしたいのですが、どうするのがベターなのでしょう?
<?php
$zz = $_POST['number1'];
if(mb_strlen($zz) == 6){
$ab ="OK";
}else{
$ab ="英数字で6文字";}
?>
<form method="post" action="test1.php">
<TABLE border="1">
<TBODY>
<TR>
<TD><INPUT size="6" type="text" maxlength="6" name="number1"
value="<?php print($zz); ?>">
</TD>
<TD>
<?php print($ab); ?>
</TD>
</TR>
</TBODY>
</TABLE>
<?php
if(mb_strlen($ab) == 2 ){
print "<input type=\"submit\" value=\"確認画面\">";
}else{
print "<input type=\"submit\" value=\"登録\">";
}
?>
</form>
0876nobodyさん
2006/08/21(月) 11:39:44ID:???if(mb_strlen($ab) == 2 ){
print "<input type=\"submit\" name=\"preview\" value=\"確認画面\">";
}else{
print "<input type=\"submit\" name=\"regist\" value=\"登録\">";
}
と区別可能な識別子を設定した上で
if(isset($_POST['preview'])) {
require("preview.php");
exit;
}
と指定された識別子があれば別のPHPファイルを読み込む。
0877715
2006/08/21(月) 11:41:38ID:Xr9Z9Klvありがとうございます!!
なるほど、nameで分けて、再度、IF文ですね
やってみまつ
0878nobodyさん
2006/08/21(月) 11:46:13ID:???1.POSTされたデータをセッションなどに格納した上で、
header("Location: /preview.php?sessid=セッションID");
exit;
とLocationヘッダで別ページに遷移する。
2.print "<input type=\"submit\" value=\"確認画面\" onclick=\"this.form.action='preview.php'\">";
として確認画面をクリック時にJavaScriptで遷移先を切り替える。
などもある。
0880nobodyさん
2006/08/21(月) 12:40:23ID:???どうしたらいいんでしょうか?
単純にソースコードを自分のサイトからDLできるようにしとけばいいのか、
それともsourceforgeみたいなところに登録(?)すべきなのか。
著作権などは維持しつつ、皆に無料で使ってもらうにはどういう方法がベストでしょうか。
0881nobodyさん
2006/08/21(月) 12:55:16ID:???著作権についてはドキュメントで明示すればよし。
0882715
2006/08/21(月) 13:20:52ID:???今回のところは、こうしました
<?php
if(mb_strlen($ab) == 2 ){
print "<input type=\"submit\" name=\"preview\" value=\"確認画面\">";
}else{
print "<input type=\"submit\" name=\"reverse\" value=\"登録\">";
}
if(isset($_POST['preview'])){
header("location:summer.php");
exit;
}
?>
次はCookieを使ってみます
0884nobodyさん
2006/08/21(月) 14:15:14ID:Dzmazm0+function is_yowai_pass($str) {
$regex = "(.{0,7}|[a-z]+|[A-Z]+|[0-9]+)";
if (ereg($regex,$str) == TRUE){
return TRUE;
} else {
return FALSE;
}
}
if (is_yowai_pass($password) == TRUE){
echo "脆弱だよ";
}
このとき、$passwordに「12345678」とか「abcdefgh」が入っていれば「脆弱だよ」と表示されて、
それはもちろん期待通りの動作なのですが、$passwordに「pass1234」など英数字を混ぜたものが
入っていても「脆弱だよ」が表示されてしまいます。英字と数字が混じっていれば
「脆弱だよ」と表示されないように作ったつもりなのですが、どこがおかしいのでしょうか??
0885nobodyさん
2006/08/21(月) 14:31:02ID:???正規表現に「^」と「$」をつけとかないと文字列全体をチェックできない。
今の状態だと「英字1文字」か「数字1文字」があれば必ず脆弱となる。
0886nobodyさん
2006/08/21(月) 14:33:17ID:???0887軟式PHP
2006/08/21(月) 15:17:34ID:???0888nobodyさん
2006/08/21(月) 15:37:14ID:???天才的関数名だなw
関数名以外の変数名とかはしっかりしてるというか、上級者らしいのに
is_yowai_passとは・・・「分かっててやってる」天才にしか出来ない技だぜ。
0889nobodyさん
2006/08/21(月) 16:25:41ID:???0890nobodyさん
2006/08/21(月) 16:36:13ID:???{
if ($my_konomi_type === $partner_konomi_type) {
return TRUE;
} else {
return FALSE;
}
}
0891nobodyさん
2006/08/21(月) 16:41:45ID:???$my_konomi_type === $partner_konomi_type だと、お互いに同じ性質を持つ人間でなければなりませんが。
0893715
2006/08/21(月) 17:03:41ID:???test1.php
----------
<?php
session_start();
$zz = $_POST['number1'];
if(mb_strlen($zz) == 6){$ab ="OK";}else{$ab ="英数字で6文字";}?>
<form method="post" action="test1.php">
<TABLE border="1"><TBODY><TR>
<TD><INPUT size="6" type="text" maxlength="6" name="number1" value="<?php print($zz); ?>"></TD>
<TD><?php print($ab); ?></TD></TR></TBODY></TABLE>
<?php
if(mb_strlen($ab) == 2 ){
print "<input type=\"submit\" name=\"preview\" value=\"確認画面\">";
}else{print "<input type=\"submit\" name=\"reverse\" value=\"登録\">";}
if(isset($_POST['preview'])){
$_SESSION['zz'] = $zz;
header('Location: test2.php');
exit;}?></form>
test2.php
----------
<?php
session_start();
if($_SESSION['zz']){
$zz = $_SESSION['zz'];
print($zz);
exit;}
?>
0894nobodyさん
2006/08/21(月) 18:48:19ID:???0895nobodyさん
2006/08/21(月) 18:51:10ID:???どうにかならないんでしょうか?
あと、メンバ変数に文字列を格納するときに . でつなぐ方法ってないんでしょうか。
PHP4が最悪だったので、5に移行したけど、やっぱあいまいすぎるこの言語・・・・泣
0897nobodyさん
2006/08/21(月) 19:26:52ID:???なんも表示されない。
なぜだかかわかる方いたますか?
0898nobodyさん
2006/08/21(月) 19:33:47ID:???perl よりかはマシって言う程度だからな
こういうスクリプト言語ではユニットテストがかなり重要
C++とかなら、コンパイラが出すエラーをユニットテストで見つける
ほかない
0899nobodyさん
2006/08/21(月) 19:43:28ID:???function is_love_me( $my_value, $partner_konomi_type )
{
if ($my_value === $partner_konomi_type) {
return TRUE;
} else {
return FALSE;
}
}
だろうが。
0901nobodyさん
2006/08/21(月) 21:13:43ID:???そうなんですか。
別のミラーとかから落としても駄目でした。
もう、ユーザー会のサイトの前文検索使わせてもらおうと思います。
0902nobodyさん
2006/08/21(月) 21:56:23ID:???ありがとうございます。
__set, __getで制御できるようですが、PHPの通常のエラーのように発生させたかったため
うまい方法が見つかりませんでした。
あとメンバの初期値設定時に、 . を使って文字列をつなぐとエラーがでてしまいます。
マニュアルにはphp4 ではムリと書いてあるけど、5については何も書いてないんだよなぁ・・・・
ムリならムリと5もかいてほしい・・・・
0903nobodyさん
2006/08/21(月) 23:23:47ID:???mysql_queryしようとするとなぜが成功しません。
select文は成功しました。
どこが原因なんでしょうか?
0904nobodyさん
2006/08/21(月) 23:29:20ID:???何の必要があるの?
普通にブラウザでアクセスしてスクリプト走らせてデバッグするのと何が違うの?
0905nobodyさん
2006/08/21(月) 23:36:52ID:???プロジェクトによってその単位とか、テストの方法もろもろ変わってしまうけど、
単体テスト⇒結合テストと行うことで、バグの発見をしやすくするんだと思う。
通常単体テストでは、1画面を1つの単位としてテストを行うと思うけど(自分の経験では)
そのときは、ブラウザを使おうが、デバッガを使おうが、単体テストだよ
0906nobodyさん
2006/08/21(月) 23:40:22ID:???本当にまんま同じSQLを発行しているかPHPでデバッグプリントして味噌
でも分からなければ問題無い範囲でここに貼りなされ
0907nobodyさん
2006/08/21(月) 23:43:02ID:???すいません。いまちょっといろいろためして見たら日本語が入ったらダメなことに気づきました。
文字セットの問題だとは思うのですが、php.iniをいじったら直るのかな。。。
0908nobodyさん
2006/08/21(月) 23:56:44ID:???たいていは、メソッド一つづつ、成功と失敗をする条件を与えて
期待通りに動くかテストする方法
早期にバグを見つけて、その処理の精度を高める
いきなり結合テストから始めると、バグが見つかったときに
解決をするのが時間かかったり、めったに出ない条件によって
引き起こされるバグを見落としたりする
0910nobodyさん
2006/08/22(火) 00:00:05ID:???う〜ん、、、おっしゃっている意味がよく分かりません。
俺が普段行っているデバッグ作業は、「単体テスト」というのを繰り返して、
結果的に「結合テスト」というものになっているんでしょうか・・・。
>>908
メ、メソッド・・・・
あの、実はOOP理解できないのでクラスとか全く使ってないんだけど、
それでもユニットテストというのは必要?&有効?
0911nobodyさん
2006/08/22(火) 00:15:56ID:???PHPでサーバーに接続した直後に
mysql_query("SET NAMES SJIS");
と、やったら表示されるようになりました。
(参考)http://tag.oops.jp/wordpress/archives/5
おっしゃる通り、PHPとMySQLはバージョンによって設定がかなり異なってきますね。
むやみに新しいバージョンを入れるのは控えたほうがいいかもしれません。
てか、設定に何分無駄な時間を費やしたんだよ俺ww
0912nobodyさん
2006/08/22(火) 00:36:10ID:???まず設計時点で機能を細かく分けてシンプルな関数の集合体にする。これが大前提。
その上で関数単位にテストを行いデバッグした上で、関数の集合であるプログラムのテストを行う。
さらにシステムは大抵の場合複数のプログラムの集合体になるから最終的に全体でのテストを行う。
それが単体テスト→結合テスト→総合テストの流れ。
オブジェクト指向を使わなくても、昔からある構造化設計でもこれはプロとして当たり前の作り方。
>>904みたいなテストしかしてないんなら、テストがどうこう以前に設計自体が素人レベルなんでしょう。
単体テストはブラウザ上でもコマンドラインでもどっちでもできるよ。
大抵はこれを行うために「ドライバ」や「スタブ」といった、上位・下位部分を担うテストプログラムを作成する。
このテストプログラムで多種多様なテストケースを実行し、通常の操作ではなかなか発生しないような
レアケースなデータでの挙動などもテストするわけだ。
0913nobodyさん
2006/08/22(火) 01:03:18ID:???0914nobodyさん
2006/08/22(火) 01:36:54ID:???俺はクラスは全く使わず、自作関数も数えるほどです。
あとはいわゆる「ベタ書き」と呼ばれるヤツなんだと思いますが、
そういうわけで単体テストというものの意味やイメージが湧きません。
PHPの標準関数ばかり使ってるから、その時点で「単体テスト」は終わってると見なしていいんでしょうか?
いわゆる「ベタ書き」の場合、ブラウザからアクセスしてのテスト(すなわち実運用と同じことをやってみる)しか
考え付かないのですが・・・。
0915nobodyさん
2006/08/22(火) 01:47:07ID:???だからそもそも設計が素人レベルなんだって。
その設計では単体テストは「不可能」で「無駄」。
そもそも「単体テストができるように作る」ことに意義があるの。
それができない時点で、一定率以上の品質は保てないんだよ。
ただ、ちっこいプログラムしか作ってない分には品質が多少低くても
それほど問題になることはないだろうから、必要はないんじゃない?
下手に中規模以上のシステムを作ってみようとか思わなきゃおっけー。
0916nobodyさん
2006/08/22(火) 02:58:21ID:???べた書きで困っていないんならそれでいいのかな
それである程度の規模のを作ってるんだとしたら引き継ぎたいとは思わんが・・・
0917nobodyさん
2006/08/22(火) 03:11:44ID:???いや、それもちゃんとしたテストだよ。
例えば顧客管理という機能があったとして、もうちょっと細かく分けると顧客の登録、削除、更新って言う機能が
必要だってのはなんとなく分かるでしょ?
で、登録、削除、更新って言う機能を別々に作ってそれぞれがちゃんと動くかテストする。これが単体テスト。
それが上手く行けば次はそれぞれをくっつけて全体としてちゃんと動くかテストする。これが結合テスト。
本当はさらに顧客の登録だけでも細かく分けるから上記の例が100%正しい訳では決して無いけど、とりあえずイメー
ジとしてはこういうもんだって把握しとけ。
0918nobodyさん
2006/08/22(火) 03:13:48ID:???ユーザ関数とか使われるといちいちその関数を探すのがメンドクサイ。
0919nobodyさん
2006/08/22(火) 04:22:34ID:???・呼び出し側ではその中身まで意識しなくても全体の動作を読める
・関数側では自身のみに着目して機能と実装を検討できる
という可読性のメリットがはじめて得られるわけで、そもそもは全体をまとめて読む必要を無くすもの。
しかし、正しい設計で作られた関数でなければそれらのメリットは生まれない。
いちいち関数を呼んでる場所毎にその中身を追っかけなきゃいけないんなら
それは関数の設計自体がどっかおかしいんだろう。
0920nobodyさん
2006/08/22(火) 07:17:40ID:???まったくもって、それでOKですよ
逆に、それが一番望ましいのです
テスト用のアクションリストを作成して
UI経由で人間が直にテストしていく行為を行わないベンダーが多くてね
まぁ丸投げの世界じゃ、口頭で「テストしたか?」程度が現実w
システムっていってもさ
小規模も中規模も大規模もかわらないって
ぶっちゃげネットワークが大きいか小さいか、ノード数が多いか、少ないかだよ
だからパフォーマンスチェックは、どのベンダーも意外と真面目ねw
なので考えに間違いがないので安心してね
0921nobodyさん
2006/08/22(火) 09:00:10ID:???機能追加のしやすさを考えれば自然と流れの読みやすいものになるよ。
関数名探すのが面倒ってのはエディタが悪い。
もしくは関数をどのファイルに関連付けるか整理できてない。
0922nobodyさん
2006/08/22(火) 09:22:16ID:???0923nobodyさん
2006/08/22(火) 09:44:42ID:???まさか埋め込みメールフォームとかのレベルの話じゃないだろうな。
0924軟式PHP
2006/08/22(火) 09:58:06ID:???それが大企業から降りてきたプロジェクトなどは、
CI > 単体テスト > 結合テストとか結構ややこしい手順を踏まないといけないことがあるよ。
0925nobodyさん
2006/08/22(火) 10:03:00ID:???少なくとも、コアになるような処理に関してはね
レス数が900を超えています。1000を超えると表示できなくなるよ。