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

くだすれPHP(超初心者用)5

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2008/11/22(土) 06:36:02ID:???
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
PHP使いが優しくコメントを返しますが、
お礼はPHPの布教と初心者の救済をお願いします。

PHP Home Page
http://www.php.net/
http://jp.php.net/



くだすれPHP(超初心者用)4
http://pc11.2ch.net/test/read.cgi/php/1213356756/

適当に関連スレ(マルチはだめぽ)
【PHP】下らねぇ質問はここに書き込みやがれ 69
http://pc11.2ch.net/test/read.cgi/php/1211879073/
0653nobodyさん2009/02/01(日) 21:16:32ID:???
末尾の$は改行にもマッチするから数字だけとは限らないんじゃ?
0654nobodyさん2009/02/01(日) 22:42:37ID:???
ググってたら遅くなりました
>>652
matchに漏れがなければ問題ないように思たんですが
あげてもらった関数の方が確実 でしょうか
>>653
正規表現はまだよくはわかってないのですがググったところ
\r\nのことでしょうか。
http://scripting.cocolog-nifty.com/blog/2008/12/post-c9b4.html
ここを参考に一応"/^\d{8}\r?$/"としてみましたが
>hoge$に掛かりません
の理屈が今一わかりません。
06556502009/02/01(日) 22:56:05ID:???
よく考えたら\rが混じる時点で正常なデータではないので
もとの"/^\d{8}$/"で問題なしな気がしますがどうなんでしょう
06566522009/02/01(日) 23:22:37ID:???
重視したのは分かりやすさ。正規表現だと、何を意味しているのか分かりづらい。
パターンがよほど複雑な時以外は正規表現は避けたほうがいい。

>653-654
改行とか忘れてたわ。
if(preg_match("/^\d{8}$/", "12345678\n")){
 echo 'match';
}
0657nobodyさん2009/02/03(火) 00:43:02ID:???
半年ロムってろと言われてずっと見てきたが
もうPHP諦めることにした。さっぱり分からん。

このスレのどこが超初心者用なんだ。
0658nobodyさん2009/02/03(火) 01:51:58ID:???
3年ROMってろ
0659nobodyさん2009/02/03(火) 02:00:14ID:???
もう、諦めたんだ放って置いてくれw
プログラムなんて嫌いだ。
0660nobodyさん2009/02/03(火) 09:47:26ID:???
何が分かんないんだよ
0661nobodyさん2009/02/03(火) 10:34:27ID:???
放っておいてやれよ
0662nobodyさん2009/02/03(火) 14:10:58ID:???
なんか残念だな...。

このスレだけ読み続けても、超初心者が分かるようにはならないと思う。
このスレは、超初心者も質問していいというだけで、来る質問が全部、
超初心者向けというわけではないから。

もう見てないかもしれないけれど、入門書を図書館とかで借りてきたほうが
いいと思うよ。
0663nobodyさん2009/02/03(火) 14:18:03ID:???
PHPなんってググって触ってみりゃ、どうにでもなるものを、
半年もROMってわからないなんて、ネタに決まってるだろ
もしネタじゃないなら、10年はROMるべき。
そうして人生が終わるさ
0664nobodyさん2009/02/03(火) 20:28:48ID:???
人生も諦めたらスッキリするのに
0665nobodyさん2009/02/04(水) 06:33:54ID:???
>>664
全く原因が分からないのでお聞きしたいのですが…

$im=createimagefromjpeg(image.jpg);
imagejpeg($im);
destroy

上記の様な単純な記述で画像を開きたいのですが、
ローカルならできるのになぜかインターネット経由だと
できないのです…
実行すると半角で「リ」と表示されるだけで
print hoge;などを付け足しても何もかわりません

phpinfoでGDが使えることは確認したのですが、
他に原因が思いつきません
初心者丸出しすいませんが教えていただければ尻丸出しにしますのでどうかお願いします
0666nobodyさん2009/02/04(水) 06:34:18ID:???
>>664
全く原因が分からないのでお聞きしたいのですが…

$im=createimagefromjpeg(image.jpg);
imagejpeg($im);
destroy

上記の様な単純な記述で画像を開きたいのですが、
ローカルならできるのになぜかインターネット経由だと
できないのです…
実行すると半角で「リ」と表示されるだけで
print hoge;などを付け足しても何もかわりません

phpinfoでGDが使えることは確認したのですが、
他に原因が思いつきません
初心者丸出しすいませんが教えていただければ尻丸出しにしますのでどうかお願いします
0667nobodyさん2009/02/04(水) 06:50:26ID:???
image.jpgがないんでね?
0668nobodyさん2009/02/04(水) 08:17:43ID:???
>>666
MIMEヘッダー出してる?
0669nobodyさん2009/02/04(水) 10:03:22ID:???
ああそれだな
0670nobodyさん2009/02/04(水) 17:18:03ID:???
>>667
確かにファイルは存在しています・・・
>>668
MIMEヘッダーは
header("content-type: image/jpeg");
で出力できてますでしょうか?
ご指摘の後にこれを追加してやってみてのですがだめでした。
ただ、文字化けのような表示から画像を表示できていないマーク?
のような表示にはかわりました・・・
0671nobodyさん2009/02/04(水) 17:25:29ID:???
>>670
imagecreatefromjpeg
にしてみたら?
それで、$imがfalseになってないかチェック
それから、imageやheaderを出力する前に余計な出力をしないように、ソースの冒頭でob_startして、直前で破棄

0672nobodyさん2009/02/04(水) 17:39:12ID:???
ところで皆さんPHPとMYSQLは勉強し始めて
どれくらいの期間で使えるレベルになりましたか?
0673nobodyさん2009/02/04(水) 17:41:17ID:???
使うだけなら書籍読みつつ1日でカバーできる範囲
使いこなすまでは相当かかったが
0674nobodyさん2009/02/04(水) 17:50:34ID:???
>>670
「image.jpg」→「"image.jpg"」
0675nobodyさん2009/02/04(水) 18:10:51ID:???
"imagejpg"になってたりするのか
0676nobodyさん2009/02/04(水) 18:32:32ID:???
そもそもcreateimagefromjpegなんて標準関数はないわけだが
imagecreatefromjpeg(string $filename)ならあるけど
0677nobodyさん2009/02/04(水) 18:33:11ID:???
単純にサーバにGDライブラリがはいってないだけなんじゃね?
phpinfoみてみれ
0678nobodyさん2009/02/04(水) 18:37:31ID:???
>>677
>>666
0679nobodyさん2009/02/04(水) 18:37:52ID:???
>>676
>>671
0680nobodyさん2009/02/04(水) 18:38:31ID:???
書いたとおりに載せないで情報小出しにしてる時点でもう答えようがない
0681nobodyさん2009/02/04(水) 18:38:39ID:???
要するに釣り
06826662009/02/04(水) 20:04:43ID:???
お騒がせ致しました

釣りではないのです

広告自動表示のレンタルサーバーを使用していたためにうまくいかなかったようです

広告無しのサーバーでは問題なく表示できました。

ありがとうございました
0683nobodyさん2009/02/04(水) 22:08:23ID:???
広告自動挿入のサーバーだと
ヘッダー情報ってだめなの?
0684nobodyさん2009/02/04(水) 22:09:01ID:???
PHPの講師やりたいんだけど、
どこの学校がおすすめ?
0685nobodyさん2009/02/04(水) 22:31:36ID:???
学校行ってまでPHP学びたいと思うか?
0686nobodyさん2009/02/04(水) 22:37:41ID:???
>>685
だって一日で20万もらえるってよ
バカらしくてコーダーなんかやってられないよ
0687nobodyさん2009/02/04(水) 22:41:25ID:???
SQL(SQLite)なんですが単対多のデータを取得したら
|A|a|1|
|A|a|2|
|A|b|1|
|A|b|2|
|B|c|1|
|B|d|1|
みたいになるじゃないですか。
重複した項目をまとめて(A,(a,b),(1,2)),(B,(c,d),1)な感じにする関数てあるんでしょうか。
0688nobodyさん2009/02/04(水) 22:46:57ID:???
>>685
http://pdoj.wordpress.com/2009/02/04/fetch-modes/

とりあえず翻訳やってみたけど、どう?
0689nobodyさん2009/02/04(水) 22:50:36ID:???
>>687
pdoとかMDBとかにあるよ
sqliteは知らんけど
0690nobodyさん2009/02/04(水) 22:52:37ID:???
>>688
ドキュメントの翻訳で「〜と思う」なんて普通使わない
0691nobodyさん2009/02/05(木) 00:20:18ID:???
>>689
ありがとうございます。
探したらfetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP)がそれらしいです。
ただマニュアルの例で例えると
array(3) {
["apple"]=>
array(2) {
[0]=>
string(5) "apple"
[1]=>
string(5) "apple"
}
みたいな感じにカラム0の値しか取得できてないようです。
自分がどこか間違ってるのかSQLiteが対応してないのか...
もう少し試してみます。
0692nobodyさん2009/02/05(木) 00:47:17ID:???
>>691
ほい
http://jp2.php.net/manual/ja/pdostatement.fetchall.php
0693nobodyさん2009/02/05(木) 00:49:12ID:???
$str = '4,980 円';

↑みたいなフォーマットの価格データを整数値にしたいんだけど
↓よりシンプルにやる方法ってある?

$str = str_replace(array(' ', ',', '円'),array('', '', ''),$str);
0694nobodyさん2009/02/05(木) 00:51:20ID:???
$str = (int)str_replace(',','',$str)
0695nobodyさん2009/02/05(木) 00:54:43ID:???
ありがとうg
0696nobodyさん2009/02/06(金) 21:22:00ID:???
>>692
MySQLでも試してみたのですが結果は同じでサンプルのような結果にならないのですが
どこか捉え違いしているのでしょうか。
PHP 5.2.6/MySQL 5.0.4
|apple|red|
|banana|yellow|
|apple|green|
という内容として、
$dbh = new PDO('mysql:〜','root','root');//もしくは'sqlite:〜'
$sql = "SELECT name,color FROM table1";
$sth = $dbh->prepare($sql);
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP,0);
var_dump($result);
$stmt = null;
結果
array(2) {
["apple"]=>
array(2) {
[0]=>
string(5) "apple"
[1]=>
string(5) "apple"
}
["banana"]=>
array(1) {
[0]=>
string(6) "banana"
}
}
となります。
0697nobodyさん2009/02/06(金) 21:29:26ID:???
サンプルのような結果と言われても、サンプルのような結果がどんなもんだかわからんからね。

とりあえず、FETCH_GROUPなんだし、結果が正しいように思うが?
0698nobodyさん2009/02/06(金) 21:34:36ID:???
まぁ、試しに
PDO::FETCH_COLUMN|PDO::FETCH_GROUP
じゃなく
PDO::FETCH_ASSOC|PDO::FETCH_GROUP
にしてみたら?
0699nobodyさん2009/02/06(金) 21:39:06ID:???
>>697
失礼、サンプルは>>692にもあるPDOStatement->fetchAllの例3です。
期待した結果は
["apple"]=>
array(2) {
[0]=>
string(5) "red"...
なんですが、>>696が正しいということはやっぱりなにか勘違いしてるのかなぁ
0700nobodyさん2009/02/06(金) 21:43:25ID:???
あぁそれか、fetchAllの第2引数に0が入ってるじゃん、だから、カラムが制約されてる
それ、外したらどうなる?
0701nobodyさん2009/02/06(金) 21:48:42ID:???
array(2) {
["apple"]=>
array(2) {
[0]=>
string(3) "red"
[1]=>
string(5) "green"
}
["banana"]=>
array(1) {
[0]=>
string(6) "yellow"
}
}

になったけど
0702nobodyさん2009/02/06(金) 21:49:22ID:???
ああすまん本人じゃなくて俺の環境でやったらってことね
0703nobodyさん2009/02/06(金) 22:07:01ID:???
>>700
あれ?どうも。0がなくてもうまく取得できなかった気がしたんですが
今0を外したらPDO::FETCH_ASSOC|PDO::FETCH_GROUP同様うまくいきました。
|PDO::FETCH_GROUPがついたときは第2引数で指定したPDO::FETCH_COLUMNを基準に
グループ化するのかと勘違いを…
実際は複数のカラムが必要なのでPDO::FETCH_NUM|PDO::FETCH_GROUPで
思った通りの結果が得られるようになりました。ありがとうございました。
>>701も確認ありがとうございます。
0704nobodyさん2009/02/06(金) 22:11:15ID:???
fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP,0); で普通に取得できたが?
後進のために原因を明らかにしといてくれ
0705nobodyさん2009/02/06(金) 22:21:43ID:???
>>704
もし、第2引数に0が入ってても第2カラムを取得できたんならバグだと思うよ
0706nobodyさん2009/02/06(金) 22:26:54ID:???
お前は何をいっちょるんだ?
第2引数に0を入れるということは1番目のCOLUMNを用いて残りのカラムをGROUP化するってことだぞ
0707nobodyさん2009/02/06(金) 22:29:53ID:???
>>778
何も問題ないが
0708nobodyさん2009/02/06(金) 22:30:55ID:???
すまん誤爆した
0709nobodyさん2009/02/06(金) 22:57:48ID:???
>>706
デマ書いてすまん、よくわかってなかった。
そのはずだよねぇ。
0710nobodyさん2009/02/08(日) 19:09:17ID:???
<?php
try {
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");

fntest();
function fntest() {echo "call function";}

} catch (ErrorException $exception){
echo "何かエラーだよ<br />";
echo $exception->getMessage()."<br />";
echo "line:".$exception->getline();
exit();
}
?>
これを実行するとFatal error: Call to undefined function fntest() in〜と出ます
定義を先にするかtry〜catchをなくすとエラーは出ません
何がいけないんでしょうか
0711nobodyさん2009/02/08(日) 19:26:17ID:???
定義が後でtry〜catchの中だからでは?
0712nobodyさん2009/02/08(日) 20:00:14ID:???
>>711
まんまやん というかだめなんですか?
>次の二つの例のように、ある条件下でのみ関数が定義される場合には、その関数定義は関数がコールされる前に行われていなければなりません。
に当てはまるということでしょうか
とりあえずそういうものだということで前方で定義するようにします
0713nobodyさん2009/02/08(日) 20:00:15ID:???
>>710
いったいどうしたらそういう書き方ができるのか知りたいわ
0714nobodyさん2009/02/08(日) 20:35:03ID:???
Perlから入った奴なんかはそういう書き方をする事があるな。
Perlは書き方によっては、関数の宣言や定義より先に呼び出しが来てもちゃんと動く。
0715nobodyさん2009/02/08(日) 21:05:08ID:???
PHPだって、パース対象がグローバルなら、普通にfunctionの後置定義は有効だよ。
ifやwhileやtryやfunctionの中などの節の中は後置できないだけ。

>>710なんてそんなの百も承知で釣り質問してるに決まってるだろ。
釣られてへぼい回答してんじゃねぇぞ
0716nobodyさん2009/02/08(日) 21:07:39ID:???
ツン?
0717nobodyさん2009/02/09(月) 00:04:48ID:???
PHPとMySQLで学習用のWEBシステムを作っているのですが

' % 等のDBにとっては迷惑な文字列が入力された場合に、それとHTML上の特殊文字に変換する
にはどうすれば良いですか?

簡単な掲示板を作ったのですが' %が入力された場合にエラーが発生し困っています。
0718nobodyさん2009/02/09(月) 00:12:47ID:???
基礎中の基礎すぐる
0719nobodyさん2009/02/09(月) 08:41:31ID:???
>>717
mysql_real_escape_string
addslash
0720nobodyさん2009/02/09(月) 08:53:51ID:???
addslash ? syntax error
0721nobodyさん2009/02/09(月) 09:16:28ID:???
データーベースにデーターをつっこむ直前に
データーベース専用のエスケープ処理をするのが普通
0722nobodyさん2009/02/09(月) 09:20:54ID:???
データー(笑)
0723nobodyさん2009/02/09(月) 21:42:26ID:???
>717
使える箇所ならプリペアドステートメント。これが一番安全。
ttp://jp2.php.net/manual/ja/mysqli.prepare.php
ttp://jp2.php.net/manual/ja/pdo.prepare.php

使えない箇所ならmysql_real_escape_stringなど。
どの文字が危険かはDBによって違うので、MySQLにはMySQLの、OracleにはOracleの、SQLiteにはSQLiteの専用の関数がある。
0724nobodyさん2009/02/11(水) 12:21:22ID:???
htmlの<base>のようにユーザのトップディレクトリを指定したいんですが、
ユーザのトップディレクトリを調べる方法はありますか?
0725nobodyさん2009/02/11(水) 13:56:50ID:???
環境は?OSとか
0726nobodyさん2009/02/11(水) 14:12:44ID:???
>>725
ああすみません。
開発環境はPHP5.2.6でOSXなんですがWebサーバはまだ借りてないのでどうなるかはわかりません。
PHP5でApachサーバのところを借りようとは思ってます。
なので開発環境との違いや引っ越し時のことを考えて汎用的な関数がないかと質問しました。
一応マニュアルのファイルシステム関数は目を通したんですが…
0727nobodyさん2009/02/11(水) 14:24:23ID:???
exit()ってスクリプト終了のために多用してもいいのでしょうか?
たとえばエラーチェック時にdieの代わりに自作関数呼び出して終了みたいな場合など

function return_json($flag, $data){
 if($flag == true)
  $result = $data;
 else
  $result = "ERR:".$data;
 $res = array(
  "status" => $flag,
  "result" => $result );
 print(json_encode($res));
 exit();
}

if(エラーチェック1) return_json(false,"エラー1です"); //エラーなら終了

if(エラーチェック2) return_json(false,"エラー2です"); //エラーなら終了

//最後に
return_json(true,"成功です。");
0728nobodyさん2009/02/11(水) 14:33:34ID:???
別にいいんでは?
0729nobodyさん2009/02/11(水) 15:13:35ID:???
関数はあくまで何かを返すだけにして、制御を握っているのは「メインのルーチン」ひとつにした方がいい。
あちこちの関数で好き勝手に処理を中断したり画面出力してたりすると、そのうち管理しきれなくなる。
同じ理由で、printするよりは文字列を返す(printは「メインのルーチン」で行なう)方がいいと思う。

俺ならreturn_json()はjsonを返すだけ(exitもprintもしない)にして
function generare_json(){
 if(isError1()){
  return return_json(false,"エラー1です");
 }
 if(isError2()){
  return return_json(false,"エラー2です");
 }
 return return_json(true,"成功です。");
}
とし、echo generate_json()を最後に呼び出す。
exit()はスクリプトの末尾のみ、出力はこの文のみになる。
0730nobodyさん2009/02/11(水) 15:20:37ID:???
つうか、正しいjson出力とエラー出力を別の関数にするかな。
boolを渡すより、return_error_json()の方が分かりやすい。
0731nobodyさん2009/02/11(水) 15:23:03ID:???
>>719
ヒントをサンクス。

>>723
詳しいありがとうございます。
参考にさせて頂きます。
0732nobodyさん2009/02/11(水) 17:07:46ID:???
>>726
ああもしかして、http://〜/~user/ の部分の実ディレクトリが知りたいってこと?
0733nobodyさん2009/02/11(水) 17:30:07ID:???
実ディレクトリでいいのかな?ローカルでいえば
/Applications/MAMP/htdocs/
となります。
実行ファイルがトップにあるわけではないので相対パスでのファイル指定より
基点からの絶対パスのほうがわかりやすいかなと。
0734724,7332009/02/11(水) 17:31:27ID:???
>>732
アンカーわすれてたので念のため
0735nobodyさん2009/02/11(水) 17:45:24ID:???
>>733
dirname(__FILE__) とか getcwd() とか

そういうこと?
0736nobodyさん2009/02/11(水) 17:47:36ID:???
>>733
$_SERVER['DOCUMENT_ROOT']
0737nobodyさん2009/02/11(水) 18:00:00ID:???
ユーザー関係ないじゃんw
0738724,7332009/02/11(水) 19:15:46ID:???
>>735,736
$_SERVER['DOCUMENT_ROOT']で希望のパスを得ることができました。
ありがとうございました。
07397272009/02/12(木) 16:10:42ID:rITuikA6
>>729
それだとプログラム毎にgenerare_json()を書き換えるって事ですよね
(エラーチェックは入力値が対象なのでプログラム毎に変わるから)
if〜elseのネスト地獄に陥りたくないので、if文でエラーなら残りをすっ飛ばしたいだけなのです。
それとメインルーチンのほとんどがgenerare_json()内に入ってしまうような・・・

他の方法(関数内でprintもexitもなし)だと
1.エラー時、gotoでメインルーチン末尾に飛んでprint実行
2.フラグを用意し初期値true、エラー時falseにして、if(!フラグ && isError2())と毎回チェックする
3.例外処理
が思い浮かんだんですが、gotoはv5.3からだし、2は毎回チェックが煩わしい(スマートじゃない)、
3の入力値チェックのエラーは例外とは違う気がしたり・・・

それとも例外として処理してもいいのかな・・・?
チェック用自作関数は真偽を返すのでif文でエラーならthrowとか
07407272009/02/12(木) 18:57:04ID:???
連投ですみません。
色々調べたら入力値チェックで期待しない値は異常なエラーとして例外処理してもよい、
みたいに書いてあったので例外処理することにしました。

function throw_except($msg){
 throw new Exception($msg);
}

try {
 if( isError1() ) throw_except('エラー1');
 if( isError2() ) throw_except('エラー2');
 return_json( $xxx );
} catch ( Exception $e ) {
 return_err_json( $e->getMessage() );
}

例外処理になったからreturn_xxx関数内でprintさせてます(exitは削除)
print文を関数外に出した方がいいのかもしれませんが
0741nobodyさん2009/02/12(木) 19:05:55ID:???
なんで「throw_except」←関数化してんの?
0742nobodyさん2009/02/12(木) 19:11:40ID:???
毎回throw new Exception($msg);と書くのがめんどくさいので
0743nobodyさん2009/02/12(木) 20:08:20ID:???
isError1()とisError2()側でthrowしろよ(まぁ関数名おかしくなるから変えて)
try {
isError1();
isError2();
return;
} catch (isError1Excetion $e) {
} catch (isError2Exception $e2) {
}
0744nobodyさん2009/02/12(木) 21:20:57ID:???
isErrorをtryはせんだろうw
07457292009/02/12(木) 23:45:53ID:???
>739
if else地獄?>729のコードにはelseが一行も出てないだろ。これは偶然そうしたんじゃなくて、意識してそうデザインしたんだ。
適切な規模で関数を切って、returnでエラーを通知可能にすればelseは削れるし、多くの場合throwは不要になる。

すぐthrowを使いたがる奴は、GOTO時代と脳の構造が一緒の、OOPどころか関数指向にすらなれない原始人。
ぱっと思いつく欠点挙げてやろうか。throwだと妥当性検証エラーの結果を最初のひとつしか出力に反映できない。
他にも、どこまで処理が継続するのか、どこからの処理はすっ飛ばされうるのかを判定しにくいのも例外の欠点。
ロックファイルを作って、ファイルに書き出して、さあ安心と思ったら変なところから例外が飛んできて、ロックファイル削除せずに終了、とかな。
例外は、複数の呼び出し階層をぶっ飛ばして上位層にエラーをダイレクトに通知したい場合に使うものであって、GOTO代わりに使うものじゃない。

>729のコードの完成版 ttp://gist.github.com/62642
isError1とisError2の中身を替えれば、チェックする内容はそのまま置き換わる。
両者をまとめて関数化してしまえば追加も可能。generate_jsonはノータッチでいける。

入力値検証らしい構造に書き直した版 ttp://gist.github.com/62643
入力値チェックの内容が変わる場合、validate関数を差し替える。処理内容が複雑ならisError1みたいな関数を書いてvalidateから呼んでもいい。
07467392009/02/13(金) 00:56:29ID:???
ヒートさせてしまって&作例してもらって申し訳ないm(_ _)m

if else地獄というのは>>729のコードではなく(>>727の)自作関数内でexitしない場合のこと。
(一応自分でも>>727>>740で意図してelse使わないようにしてます)

ただ作例だとisError1,isError2,validate,build_responceなど関数自体を毎回書き直す羽目になるし、
メインルーチンがほぼ丸ごと関数化(build_responce)してるのもどうも・・・

関数は一度作ったら修正したくない、極力同じような文を書きたくない、ってのが元々の理由なので。

今作ってるのは妥当性エラーは1つ(というか「入力値が間違ってる」だけ)でいいのですっ飛ばしてます。
通常の入力ではなく意図的に変更してる場合しかありえないので。

確かに原始人と思いますが、GOTOも上手く適度に使えばいいんじゃないんでしょうか?
反GOTO教信者ではないし。

まあバリデーションにthrowの使うのは>>739にも書いたけど微妙だとは思いますが↓のようにあったので使ってみました
http://takagi-hiromitsu.jp/diary/20051227.html
>>パス名を受け取ることを想定したパラメタに「../」や「..\」が含まれていたら、削除とか変換をするのではなく、
>>エラーとして例外処理して終了するというのが、本来のそのプログラムの正しい動作だろう*5。

クライアント側でもチェックしてるのでそれをわざわざ変更して送ってくるのは上記にあてはまるかと。
0747nobodyさん2009/02/13(金) 01:41:35ID:???
初心者相手なんで一応言っておくと、後者のコードは検証ルールが変わっただけなら書き換えないといけない関数はひとつ(validate)。
グローバル空間の処理や他の関数は一切触れなくて平気。
グローバル空間の処理を書き換える方が、関数を書き換えるより簡単だって言い張るならもう何も言わん。ダイクストラ以前の時代に帰れ。

「メインルーチンがほぼ丸ごと関数化してる」のは、確かに設計としては甘い。
本来は、「100%すべてを関数化すべき」だしな。
07487462009/02/13(金) 02:05:40ID:???
あー、でもとりあえず作例他ありがとです。
参考にして勉強させていただきます。
0749nobodyさん2009/02/13(金) 11:16:46ID:???
質問です。
現在、PHP4を使って携帯サイトを作っています。
新規登録してログインして日記みたいなのを登録するシステムなんですが、
ログインした後の日記登録の部分は問題なく動作します。
ところが新規登録のところで動作がおかしい部分があるのです。

動作確認はdocomo,au,softbankの実機とPC上のエミュで行っています。
現象はsoftbankの実機のみで起こるのですが、スクリプトでは
header("Location:xxxxxx.php?id=xxxxx")でページを飛ばすところで問題が起きます。
docomo,au実機、PC上の3キャリアのエミュでは問題なく動作、ところがsoftbankの実機のみ
ページが飛ばずに「このページは開けません」みたいなエラーが出ます。
ソースレベルでは、その他の日記登録などとほぼ同じなのですが・・・。
softbank携帯だけ、何か仕様が違うのでしょうか?ちなみにセッションを使っています。
0750nobodyさん2009/02/13(金) 11:18:06ID:???
↑に追記です。
飛び先のphpスクリプトにダイレクトに接続した場合、問題なく動作する事は確認済みです。
0751nobodyさん2009/02/13(金) 11:24:03ID:???
さらに追記です。うざくてすいません・・・
header Locationで飛ばさずに、aタグを使って間にワンクッション置く(クリックさせる)と正常に動作します。
どのみち、その先でまたheaderで飛ばすところで駄目なんですが・・・。
0752nobodyさん2009/02/13(金) 11:45:37ID:???
>>749-751
> softbankの実機のみページが飛ばずに「このページは開けません」みたいなエラーが出ます。

このときの、サーバーに残るアクセスログは?

んで、Locationで指定しているURLはドメイン込のフルパスで書いてるよね?
■ このスレッドは過去ログ倉庫に格納されています