私的良スレ書庫
不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitterでログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。
元スレくだすれPHP(超初心者用)5
php スレッド一覧へ / php とは? / 携帯版 / dat(gz)で取得 / トップメニューみんなの評価 : ○
レスフィルター : (試験中)
array(2) {
["apple"]=>
array(2) {
[0]=>
string(3) "red"
[1]=>
string(5) "green"
}
["banana"]=>
array(1) {
[0]=>
string(6) "yellow"
}
}
になったけど
["apple"]=>
array(2) {
[0]=>
string(3) "red"
[1]=>
string(5) "green"
}
["banana"]=>
array(1) {
[0]=>
string(6) "yellow"
}
}
になったけど
fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP,0); で普通に取得できたが?
後進のために原因を明らかにしといてくれ
後進のために原因を明らかにしといてくれ
>>704
もし、第2引数に0が入ってても第2カラムを取得できたんならバグだと思うよ
もし、第2引数に0が入ってても第2カラムを取得できたんならバグだと思うよ
お前は何をいっちょるんだ?
第2引数に0を入れるということは1番目のCOLUMNを用いて残りのカラムをGROUP化するってことだぞ
第2引数に0を入れるということは1番目のCOLUMNを用いて残りのカラムをGROUP化するってことだぞ
>>778
何も問題ないが
何も問題ないが
<?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をなくすとエラーは出ません
何がいけないんでしょうか
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
まんまやん というかだめなんですか?
>次の二つの例のように、ある条件下でのみ関数が定義される場合には、その関数定義は関数がコールされる前に行われていなければなりません。
に当てはまるということでしょうか
とりあえずそういうものだということで前方で定義するようにします
まんまやん というかだめなんですか?
>次の二つの例のように、ある条件下でのみ関数が定義される場合には、その関数定義は関数がコールされる前に行われていなければなりません。
に当てはまるということでしょうか
とりあえずそういうものだということで前方で定義するようにします
>>710
いったいどうしたらそういう書き方ができるのか知りたいわ
いったいどうしたらそういう書き方ができるのか知りたいわ
Perlから入った奴なんかはそういう書き方をする事があるな。
Perlは書き方によっては、関数の宣言や定義より先に呼び出しが来てもちゃんと動く。
Perlは書き方によっては、関数の宣言や定義より先に呼び出しが来てもちゃんと動く。
PHPだって、パース対象がグローバルなら、普通にfunctionの後置定義は有効だよ。
ifやwhileやtryやfunctionの中などの節の中は後置できないだけ。
>>710なんてそんなの百も承知で釣り質問してるに決まってるだろ。
釣られてへぼい回答してんじゃねぇぞ
ifやwhileやtryやfunctionの中などの節の中は後置できないだけ。
>>710なんてそんなの百も承知で釣り質問してるに決まってるだろ。
釣られてへぼい回答してんじゃねぇぞ
PHPとMySQLで学習用のWEBシステムを作っているのですが
' % 等のDBにとっては迷惑な文字列が入力された場合に、それとHTML上の特殊文字に変換する
にはどうすれば良いですか?
簡単な掲示板を作ったのですが' %が入力された場合にエラーが発生し困っています。
' % 等のDBにとっては迷惑な文字列が入力された場合に、それとHTML上の特殊文字に変換する
にはどうすれば良いですか?
簡単な掲示板を作ったのですが' %が入力された場合にエラーが発生し困っています。
データーベースにデーターをつっこむ直前に
データーベース専用のエスケープ処理をするのが普通
データーベース専用のエスケープ処理をするのが普通
>717
使える箇所ならプリペアドステートメント。これが一番安全。
http://jp2.php.net/manual/ja/mysqli.prepare.php
http://jp2.php.net/manual/ja/pdo.prepare.php
使えない箇所ならmysql_real_escape_stringなど。
どの文字が危険かはDBによって違うので、MySQLにはMySQLの、OracleにはOracleの、SQLiteにはSQLiteの専用の関数がある。
使える箇所ならプリペアドステートメント。これが一番安全。
http://jp2.php.net/manual/ja/mysqli.prepare.php
http://jp2.php.net/manual/ja/pdo.prepare.php
使えない箇所ならmysql_real_escape_stringなど。
どの文字が危険かはDBによって違うので、MySQLにはMySQLの、OracleにはOracleの、SQLiteにはSQLiteの専用の関数がある。
htmlの<base>のようにユーザのトップディレクトリを指定したいんですが、
ユーザのトップディレクトリを調べる方法はありますか?
ユーザのトップディレクトリを調べる方法はありますか?
>>725
ああすみません。
開発環境はPHP5.2.6でOSXなんですがWebサーバはまだ借りてないのでどうなるかはわかりません。
PHP5でApachサーバのところを借りようとは思ってます。
なので開発環境との違いや引っ越し時のことを考えて汎用的な関数がないかと質問しました。
一応マニュアルのファイルシステム関数は目を通したんですが…
ああすみません。
開発環境はPHP5.2.6でOSXなんですがWebサーバはまだ借りてないのでどうなるかはわかりません。
PHP5でApachサーバのところを借りようとは思ってます。
なので開発環境との違いや引っ越し時のことを考えて汎用的な関数がないかと質問しました。
一応マニュアルのファイルシステム関数は目を通したんですが…
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,"成功です。");
たとえばエラーチェック時に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,"成功です。");
関数はあくまで何かを返すだけにして、制御を握っているのは「メインのルーチン」ひとつにした方がいい。
あちこちの関数で好き勝手に処理を中断したり画面出力してたりすると、そのうち管理しきれなくなる。
同じ理由で、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()はスクリプトの末尾のみ、出力はこの文のみになる。
あちこちの関数で好き勝手に処理を中断したり画面出力してたりすると、そのうち管理しきれなくなる。
同じ理由で、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()はスクリプトの末尾のみ、出力はこの文のみになる。
つうか、正しいjson出力とエラー出力を別の関数にするかな。
boolを渡すより、return_error_json()の方が分かりやすい。
boolを渡すより、return_error_json()の方が分かりやすい。
>>726
ああもしかして、http://~/~user/ の部分の実ディレクトリが知りたいってこと?
ああもしかして、http://~/~user/ の部分の実ディレクトリが知りたいってこと?
実ディレクトリでいいのかな?ローカルでいえば
/Applications/MAMP/htdocs/
となります。
実行ファイルがトップにあるわけではないので相対パスでのファイル指定より
基点からの絶対パスのほうがわかりやすいかなと。
/Applications/MAMP/htdocs/
となります。
実行ファイルがトップにあるわけではないので相対パスでのファイル指定より
基点からの絶対パスのほうがわかりやすいかなと。
>>732
アンカーわすれてたので念のため
アンカーわすれてたので念のため
>>733
$_SERVER['DOCUMENT_ROOT']
$_SERVER['DOCUMENT_ROOT']
連投ですみません。
色々調べたら入力値チェックで期待しない値は異常なエラーとして例外処理してもよい、
みたいに書いてあったので例外処理することにしました。
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文を関数外に出した方がいいのかもしれませんが
色々調べたら入力値チェックで期待しない値は異常なエラーとして例外処理してもよい、
みたいに書いてあったので例外処理することにしました。
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文を関数外に出した方がいいのかもしれませんが
毎回throw new Exception($msg);と書くのがめんどくさいので
isError1()とisError2()側でthrowしろよ(まぁ関数名おかしくなるから変えて)
try {
isError1();
isError2();
return;
} catch (isError1Excetion $e) {
} catch (isError2Exception $e2) {
}
try {
isError1();
isError2();
return;
} catch (isError1Excetion $e) {
} catch (isError2Exception $e2) {
}
>739
if else地獄?>729のコードにはelseが一行も出てないだろ。これは偶然そうしたんじゃなくて、意識してそうデザインしたんだ。
適切な規模で関数を切って、returnでエラーを通知可能にすればelseは削れるし、多くの場合throwは不要になる。
すぐthrowを使いたがる奴は、GOTO時代と脳の構造が一緒の、OOPどころか関数指向にすらなれない原始人。
ぱっと思いつく欠点挙げてやろうか。throwだと妥当性検証エラーの結果を最初のひとつしか出力に反映できない。
他にも、どこまで処理が継続するのか、どこからの処理はすっ飛ばされうるのかを判定しにくいのも例外の欠点。
ロックファイルを作って、ファイルに書き出して、さあ安心と思ったら変なところから例外が飛んできて、ロックファイル削除せずに終了、とかな。
例外は、複数の呼び出し階層をぶっ飛ばして上位層にエラーをダイレクトに通知したい場合に使うものであって、GOTO代わりに使うものじゃない。
>729のコードの完成版http://gist.github.com/62642
isError1とisError2の中身を替えれば、チェックする内容はそのまま置き換わる。
両者をまとめて関数化してしまえば追加も可能。generate_jsonはノータッチでいける。
入力値検証らしい構造に書き直した版http://gist.github.com/62643
入力値チェックの内容が変わる場合、validate関数を差し替える。処理内容が複雑ならisError1みたいな関数を書いてvalidateから呼んでもいい。
if else地獄?>729のコードにはelseが一行も出てないだろ。これは偶然そうしたんじゃなくて、意識してそうデザインしたんだ。
適切な規模で関数を切って、returnでエラーを通知可能にすればelseは削れるし、多くの場合throwは不要になる。
すぐthrowを使いたがる奴は、GOTO時代と脳の構造が一緒の、OOPどころか関数指向にすらなれない原始人。
ぱっと思いつく欠点挙げてやろうか。throwだと妥当性検証エラーの結果を最初のひとつしか出力に反映できない。
他にも、どこまで処理が継続するのか、どこからの処理はすっ飛ばされうるのかを判定しにくいのも例外の欠点。
ロックファイルを作って、ファイルに書き出して、さあ安心と思ったら変なところから例外が飛んできて、ロックファイル削除せずに終了、とかな。
例外は、複数の呼び出し階層をぶっ飛ばして上位層にエラーをダイレクトに通知したい場合に使うものであって、GOTO代わりに使うものじゃない。
>729のコードの完成版http://gist.github.com/62642
isError1とisError2の中身を替えれば、チェックする内容はそのまま置き換わる。
両者をまとめて関数化してしまえば追加も可能。generate_jsonはノータッチでいける。
入力値検証らしい構造に書き直した版http://gist.github.com/62643
入力値チェックの内容が変わる場合、validate関数を差し替える。処理内容が複雑ならisError1みたいな関数を書いてvalidateから呼んでもいい。
ヒートさせてしまって&作例してもらって申し訳ない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。
クライアント側でもチェックしてるのでそれをわざわざ変更して送ってくるのは上記にあてはまるかと。
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。
クライアント側でもチェックしてるのでそれをわざわざ変更して送ってくるのは上記にあてはまるかと。
初心者相手なんで一応言っておくと、後者のコードは検証ルールが変わっただけなら書き換えないといけない関数はひとつ(validate)。
グローバル空間の処理や他の関数は一切触れなくて平気。
グローバル空間の処理を書き換える方が、関数を書き換えるより簡単だって言い張るならもう何も言わん。ダイクストラ以前の時代に帰れ。
「メインルーチンがほぼ丸ごと関数化してる」のは、確かに設計としては甘い。
本来は、「100%すべてを関数化すべき」だしな。
グローバル空間の処理や他の関数は一切触れなくて平気。
グローバル空間の処理を書き換える方が、関数を書き換えるより簡単だって言い張るならもう何も言わん。ダイクストラ以前の時代に帰れ。
「メインルーチンがほぼ丸ごと関数化してる」のは、確かに設計としては甘い。
本来は、「100%すべてを関数化すべき」だしな。
あー、でもとりあえず作例他ありがとです。
参考にして勉強させていただきます。
参考にして勉強させていただきます。
質問です。
現在、PHP4を使って携帯サイトを作っています。
新規登録してログインして日記みたいなのを登録するシステムなんですが、
ログインした後の日記登録の部分は問題なく動作します。
ところが新規登録のところで動作がおかしい部分があるのです。
動作確認はdocomo,au,softbankの実機とPC上のエミュで行っています。
現象はsoftbankの実機のみで起こるのですが、スクリプトでは
header("Location:xxxxxx.php?id=xxxxx")でページを飛ばすところで問題が起きます。
docomo,au実機、PC上の3キャリアのエミュでは問題なく動作、ところがsoftbankの実機のみ
ページが飛ばずに「このページは開けません」みたいなエラーが出ます。
ソースレベルでは、その他の日記登録などとほぼ同じなのですが・・・。
softbank携帯だけ、何か仕様が違うのでしょうか?ちなみにセッションを使っています。
現在、PHP4を使って携帯サイトを作っています。
新規登録してログインして日記みたいなのを登録するシステムなんですが、
ログインした後の日記登録の部分は問題なく動作します。
ところが新規登録のところで動作がおかしい部分があるのです。
動作確認はdocomo,au,softbankの実機とPC上のエミュで行っています。
現象はsoftbankの実機のみで起こるのですが、スクリプトでは
header("Location:xxxxxx.php?id=xxxxx")でページを飛ばすところで問題が起きます。
docomo,au実機、PC上の3キャリアのエミュでは問題なく動作、ところがsoftbankの実機のみ
ページが飛ばずに「このページは開けません」みたいなエラーが出ます。
ソースレベルでは、その他の日記登録などとほぼ同じなのですが・・・。
softbank携帯だけ、何か仕様が違うのでしょうか?ちなみにセッションを使っています。
↑に追記です。
飛び先のphpスクリプトにダイレクトに接続した場合、問題なく動作する事は確認済みです。
飛び先のphpスクリプトにダイレクトに接続した場合、問題なく動作する事は確認済みです。
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / php スレッド一覧へ
みんなの評価 : ○類似してるかもしれないスレッド
- くだすれPHP(超初心者用)4 (1001) - [97%] - 2008/11/21 17:19 ○
- くだすれPHP(超初心者用)6 (958) - [97%] - 2009/8/19 4:11 ○
- くだすれPHP(超初心者用)3 (1001) - [97%] - 2008/6/8 6:35 ☆
- さっさとPHP5.0.6出せよ糞Zend (80) - [31%] - 2019/5/9 7:45
トップメニューへ / →のくす牧場書庫について