09/02/08 19:09:17
<?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をなくすとエラーは出ません
何がいけないんでしょうか
711:nobodyさん
09/02/08 19:26:17
定義が後でtry~catchの中だからでは?
712:nobodyさん
09/02/08 20:00:14
>>711
まんまやん というかだめなんですか?
>次の二つの例のように、ある条件下でのみ関数が定義される場合には、その関数定義は関数がコールされる前に行われていなければなりません。
に当てはまるということでしょうか
とりあえずそういうものだということで前方で定義するようにします
713:nobodyさん
09/02/08 20:00:15
>>710
いったいどうしたらそういう書き方ができるのか知りたいわ
714:nobodyさん
09/02/08 20:35:03
Perlから入った奴なんかはそういう書き方をする事があるな。
Perlは書き方によっては、関数の宣言や定義より先に呼び出しが来てもちゃんと動く。
715:nobodyさん
09/02/08 21:05:08
PHPだって、パース対象がグローバルなら、普通にfunctionの後置定義は有効だよ。
ifやwhileやtryやfunctionの中などの節の中は後置できないだけ。
>>710なんてそんなの百も承知で釣り質問してるに決まってるだろ。
釣られてへぼい回答してんじゃねぇぞ
716:nobodyさん
09/02/08 21:07:39
ツン?
717:nobodyさん
09/02/09 00:04:48
PHPとMySQLで学習用のWEBシステムを作っているのですが
' % 等のDBにとっては迷惑な文字列が入力された場合に、それとHTML上の特殊文字に変換する
にはどうすれば良いですか?
簡単な掲示板を作ったのですが' %が入力された場合にエラーが発生し困っています。
718:nobodyさん
09/02/09 00:12:47
基礎中の基礎すぐる
719:nobodyさん
09/02/09 08:41:31
>>717
mysql_real_escape_string
addslash
720:nobodyさん
09/02/09 08:53:51
addslash ? syntax error
721:nobodyさん
09/02/09 09:16:28
データーベースにデーターをつっこむ直前に
データーベース専用のエスケープ処理をするのが普通
722:nobodyさん
09/02/09 09:20:54
データー(笑)
723:nobodyさん
09/02/09 21:42:26
>717
使える箇所ならプリペアドステートメント。これが一番安全。
URLリンク(jp2.php.net)
URLリンク(jp2.php.net)
使えない箇所ならmysql_real_escape_stringなど。
どの文字が危険かはDBによって違うので、MySQLにはMySQLの、OracleにはOracleの、SQLiteにはSQLiteの専用の関数がある。
724:nobodyさん
09/02/11 12:21:22
htmlの<base>のようにユーザのトップディレクトリを指定したいんですが、
ユーザのトップディレクトリを調べる方法はありますか?
725:nobodyさん
09/02/11 13:56:50
環境は?OSとか
726:nobodyさん
09/02/11 14:12:44
>>725
ああすみません。
開発環境はPHP5.2.6でOSXなんですがWebサーバはまだ借りてないのでどうなるかはわかりません。
PHP5でApachサーバのところを借りようとは思ってます。
なので開発環境との違いや引っ越し時のことを考えて汎用的な関数がないかと質問しました。
一応マニュアルのファイルシステム関数は目を通したんですが…
727:nobodyさん
09/02/11 14:24:23
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,"成功です。");
728:nobodyさん
09/02/11 14:33:34
別にいいんでは?
729:nobodyさん
09/02/11 15:13:35
関数はあくまで何かを返すだけにして、制御を握っているのは「メインのルーチン」ひとつにした方がいい。
あちこちの関数で好き勝手に処理を中断したり画面出力してたりすると、そのうち管理しきれなくなる。
同じ理由で、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()はスクリプトの末尾のみ、出力はこの文のみになる。
730:nobodyさん
09/02/11 15:20:37
つうか、正しいjson出力とエラー出力を別の関数にするかな。
boolを渡すより、return_error_json()の方が分かりやすい。
731:nobodyさん
09/02/11 15:23:03
>>719
ヒントをサンクス。
>>723
詳しいありがとうございます。
参考にさせて頂きます。
732:nobodyさん
09/02/11 17:07:46
>>726
ああもしかして、http://~/~user/ の部分の実ディレクトリが知りたいってこと?
733:nobodyさん
09/02/11 17:30:07
実ディレクトリでいいのかな?ローカルでいえば
/Applications/MAMP/htdocs/
となります。
実行ファイルがトップにあるわけではないので相対パスでのファイル指定より
基点からの絶対パスのほうがわかりやすいかなと。
734:724,733
09/02/11 17:31:27
>>732
アンカーわすれてたので念のため
735:nobodyさん
09/02/11 17:45:24
>>733
dirname(__FILE__) とか getcwd() とか
そういうこと?
736:nobodyさん
09/02/11 17:47:36
>>733
$_SERVER['DOCUMENT_ROOT']
737:nobodyさん
09/02/11 18:00:00
ユーザー関係ないじゃんw
738:724,733
09/02/11 19:15:46
>>735,736
$_SERVER['DOCUMENT_ROOT']で希望のパスを得ることができました。
ありがとうございました。