【PHP】下らねぇ質問はここに書き込みやがれpart18
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/03/15(水) 19:18:21ID:yiOrS10Nここなら本スレで回答のないお前の下らない質問に回答があるかも知れません。
まず読め【PHP マニュアル】
http://www.php.net/manual/ja/
本スレ【PHP】質問スレッドpart33【php】
http://pc8.2ch.net/test/read.cgi/php/1140027592/
前スレ【PHP】下らねぇ質問はここに書き込みやがれpart17
http://pc8.2ch.net/test/read.cgi/php/1140786348/
過去スレは>>2-3あたり
0708nobodyさん
2006/03/32(土) 16:41:00ID:???0709nobodyさん
2006/03/32(土) 16:51:36ID:???0710nobodyさん
2006/03/32(土) 18:11:42ID:???0712nobodyさん
2006/03/32(土) 23:43:46ID:???最新の書き込み以外全部消えちまった。
ファイルロックもちゃんとしてたつもりなんだけど、
できてなかったって子とかな?それか他に考えられる原因ってある?
wで開いてたんだけど。
下らん質問でゴメン。
0714nobodyさん
2006/03/32(土) 23:59:55ID:???0715712
2006/04/02(日) 00:07:25ID:???flock($fp,2);
foreach($lis as $li) fputs($fp, $li);
flock($fp,LOCK_UN);
fclose($fp);
読み込みはfile()使って二次元配列に入れて
ページ処理入れつつfor文で繰り返し表示してます。
>>714
実は今までDBでしかやったことなくて今回ファイルで初めて作ってみました。
DBでもちゃんとしないと壊れちゃうことあるんじゃないの?
0716nobodyさん
2006/04/02(日) 00:23:15ID:???wで開いたってことは、それまでの書き込み+新規書き込みの両方を
まとめてファイルにwriteしてたんだろ?
それで最新以外は消えちゃった、って言うんなら書き込みじゃなく
元ファイルの読み込みに失敗してるんだよ。
0717712
2006/04/02(日) 00:27:44ID:???>wで開いたってことは、それまでの書き込み+新規書き込みの両方を
>まとめてファイルにwriteしてたんだろ?
そうです。説明不足でスミマセン。
なるほど。その線で調べてみます。
でも何度テストしてみても再現できないんだよなぁ・・・。
ありがとう。
0718nobodyさん
2006/04/02(日) 00:35:08ID:???$fp2ってどっから出てきたんだ。しかも第二引数なしのflockって…???
とりあえず、読み込みと書き込みの部分をfopenのとこから全部見せなきゃ
これで原因分かるやつは神がかってると思うぞ
DBでは普通に作れば壊れないが、下手な作り方すれば壊れるものが作れるかもな。
0719712
2006/04/02(日) 00:40:55ID:???$fp2じゃなくって$fp,2だよ。コンマ入ってる。
2はLOCK_EXと同意。
今ログもう一度確認したら最終書き込みの人の
$_SERVER["REMOTE_ADDR"]で取得したはずのIPアドレスがない・・・。
何か関係あるんでしょうか。
0720nobodyさん
2006/04/02(日) 01:47:28ID:???0721nobodyさん
2006/04/02(日) 01:54:05ID:???0722nobodyさん
2006/04/02(日) 01:55:06ID:???0723nobodyさん
2006/04/02(日) 02:34:52ID:???表からは数百件程度の商品を検索とソート。
裏側からは画像とデータ登録の管理画面(登録、削除、修正、一覧)って構成なんだけど。
仕事ではないんで勉強をかねてやってみるんだけど、自分の技術じゃそこまで手に負えない。
お金をもらってその対策までするなら、最初からなんかあっても困らない作りにしておくのも悪くないかなとおもって。
もし入力値に対しての対策をするとしたら$_POSTと$_GETでのありえる(許せる)値をスクリプトの頭でチェックしてNGならエラーにしちゃうって処理でOK?
0724nobodyさん
2006/04/02(日) 02:40:33ID:???0727nobodyさん
2006/04/02(日) 13:03:49ID:???バナナ
りんご
みかん
が入っていたとして、これを$fruit[]に代入していきたいのですが、
どのようにすればいいのでしょうか?fopenでtest.txtを開いても
一行ずつ配列にいれる方法がわかりません。。
0728nobodyさん
2006/04/02(日) 13:39:10ID:???0730nobodyさん
2006/04/02(日) 14:24:51ID:???echo $a*$a;
みたいな事をすると
1.52415787807E+052などと省略(?)されて困っています
とりあえずphp.iniのそれっぽい値(precision = 12)を変更してみたのですが
17桁目辺りから00000000000000000000となってしまい、正しい値が得られません
へるぷみー
0731nobodyさん
2006/04/02(日) 14:48:41ID:???整数の扱える範囲(たいていのプラットフォームでは32ビット)を超えたものは浮動小数点数として扱われる。
そんな馬鹿でかい整数で演算する必要があるなら多倍長整数演算をサポートするライブラリ(bcmathやpearのMath_Integer)を使う。
0733nobodyさん
2006/04/02(日) 15:47:17ID:???0734nobodyさん
2006/04/02(日) 17:19:56ID:???0736nobodyさん
2006/04/02(日) 18:47:09ID:???$sql .= "VALUES ($rec['num'], '$rec['name']')";
の'$rec['name']'(文字列)をどのように書けばいいでしょうか。
上記だと通らないし、'{$rec['name']}'だと'が引っかかります。
'{$rec[name]}'もparse errorです。
DBはFirebirdで文字列は'でくくる固定のようです。
0737nobodyさん
2006/04/02(日) 18:52:59ID:???'$rec[name]'
または
'{$rec['name']}'
何でわざわざ都合の悪い組み合わせでだけ試そうとするのかその神経が理解できない。
0738nobodyさん
2006/04/02(日) 18:55:10ID:???じゃ、ダメなんか
っていうかSQLがおかしいんじゃね、それ
firebird触ったことないから分からんけど
DBエラーならエラーを全部張ってみそ
とにかくエラーが出てるんならエラーを張ってみては
0739nobodyさん
2006/04/02(日) 18:58:54ID:???0741738
2006/04/02(日) 18:59:59ID:???しかもSQL文は大丈夫か
postgreばっかなんで方言が身についてた
0743723
2006/04/02(日) 19:04:30ID:???$_GET['orderby']
って変数を使ったりします。
こんな感じで一つ一つに対してチェックをしなくちゃならんのですよね?
$_GET
$_POST
をまとめてチェックとか出来たらいいのに。
ところで、小さなサイトでつついたところで面白いものが出て来そうもないところに対して、実際に、sqlインジェクションをするために$_GETや$_POSTで変な値を入れるってよくあることなんでしょうか?
0745723
2006/04/02(日) 19:09:21ID:???なるほど、$_REQUESTに対して、最悪入っていてはまずい文字列が入っていたらクエリ実行せずにたたき落とすって感じ?
case文のdefaultに飛ばすとか。
0747nobodyさん
2006/04/02(日) 19:37:05ID:???変なところでバグが出たりする(してはならないクエリも処理しちゃったり)
かと言って必要な場所で毎回必要な処理をするのも、
万一忘れたら話にならんし・・・難しいね
0748723
2006/04/02(日) 19:42:09ID:???まずい値をスクリプトの側で補正したり、値に対して個別のエラーメッセージを出したりしようとしなければそんなに大変じゃない気がして来た。
よく考えたら、そんなイタズラをする相手に対してそんな丁寧なインターフェイスを用意する必要なんてないもんな。
ループでまわして、問題があれば$errflag++して、ループがおわったところで$errflag>0だったらcaseのdefaultに飛ばす。
って感じでいいのかな。
この辺の入力値をまとめた配列に対してまとめて処理するってあたりは、ネットでさがしてもあんまり情報ない希ガス。どういうわけか。
一概にこうすればいい、って書きにくいものなのかもしれないけど。
0749723
2006/04/02(日) 19:46:16ID:???>>748を書いてる間にレスがあったみたいですね。
たしかにそうですね。
それぞれの変数について、sqlに突っ込む直前にっていうのが正しいのかもしれないけど、自分のようなスパゲッティソース書く奴にはとても手に負えないことになってしまいそうです。
やっぱり無理そうな気がして来たorz
0750nobodyさん
2006/04/02(日) 19:47:14ID:dnNED4Rvボタンを押した後、画面に文字を表示させ、1秒待った後に該当のURLを表示する
という処理をしたいのですが、ボタンを押したあとのfunction内で
echo '<html><head>';
echo '<META HTTP-EQUIV="refresh\" content="1;URL=指定のアドレス">';
echo '</head><body>処理中です。</body></html>';
のようにすれば簡単に実現できます。
しかしこの場合、FireFoxなどのブラウザではRefererが取得できません。
header ("Location:指定のURL");
を用いればRefererを取得できるのですが今度は文字を表示できません。
具体的には次のようにしていますが文字が表示されません。
echo '<html><head>';
echo '</head><body>処理中です。</body></html>';
header ("Location:指定のURL",microtime(1000));
何か良い方法はないでしょうか?
0751nobodyさん
2006/04/02(日) 20:09:50ID:???0752750
2006/04/02(日) 20:20:21ID:???echo '<html><head>';
echo '</head><body>処理中です。</body></html>';
sleep(1);
header ("Location:指定のURL");
で試してみましたが文字は表示されないようです。
(1秒待ってリダイレクトされます)
0756nobodyさん
2006/04/02(日) 21:28:12ID:???>echo '<META HTTP-EQUIV="refresh\" content="1;URL=指定のアドレス">';
ここで指定したアドレス にリファラ情報を含ませて受け取り側で処理する。
厳密な意味でのリファラを出す出さないは、クライアント次第なので
別のサイト間では"リファラ"がないことを当たり前として作るもの。
0757nobodyさん
2006/04/02(日) 21:31:26ID:???METAのRefreshかJavaScriptのSetTimeout+locarion.hrefでジャンプが楽。
クッキーとかを使いたくないのであればRefresh他の飛び先にパラメータで
Referer文字列を渡してしまう。
基本的に画面遷移を従った状態で前のページのRefererを保持させるのは
ブラウザ依存になってしまうので無理と考え、何らかの形でデータ記録する
方法を検討しないとダメと考えるべき。
0758nobodyさん
2006/04/02(日) 21:31:49ID:???|echo '<html><head>';
|echo '</head><body>処理中です。</body></html>';
|header ("Location:指定のURL",microtime(1000));
こいうのは、試してみるまでもなく駄目だって気づこうぜ。
# HTTPのレスポンスを調べて理解
0759nobodyさん
2006/04/02(日) 22:03:08ID:???> しかしこの場合、FireFoxなどのブラウザではRefererが取得できません。
適当なこと言わないで下さい。
FirefoxはデフォルトでReferarをちゃんと送信します。
(IEと同じく設定の書き換えで無効にできますが。)
むしろ、IEはバグで他のサイトのReferarを送信したり正しく送信されなかったりすることがあるようです。
特にIE5.5はReferar関係にバグありまくりです。
0760nobodyさん
2006/04/02(日) 22:07:17ID:???Refreshでページ遷移するとRefresh元のページがREFERERとして
渡されてきてしまう、って話だろ?ごく普通の動きだと思われるが。
読解力ないやつだな。
0761nobodyさん
2006/04/02(日) 22:08:19ID:???http://mydomain.com/hogehoge.php?page=login というURLがあって、ログイン完了後に、ログイン名に表示したURL
http://mydomain.com/mypage.php?id=foo&mem=on にリダイレクトしたい場合とかで、
http://mydomain.com/hogehoge.php?page=login&redirect=http://mydomain.com/mypage.php?id=foo&mem=on とやってしまうと、
$_GET['redirect']に収納されるのは、「http://mydomain.com/mypage.php?id=foo」までとなってしまうし。
?や&を独自の方式でエスケープ処理をしてあとで復号するのがいいかと思います。
もしくは、Cookieなどに保存するかPOSTを使う。
0762759
2006/04/02(日) 22:11:08ID:???> Refresh元のページがREFERERとして渡されてきてしまう
それがRFC通りの正しい Refererの実装なわけですが。
「しかしこの場合、FireFoxなどのブラウザではRefererが取得できません。」と書かれているよね。
想定外のReferarが渡される、って表現ならわかるけど、取得できないってことは一切送信されてないってことだ。
正確でない表現をすると回答者を混乱させるだけ。
0765750
2006/04/02(日) 22:28:48ID:???.htaccessを使用して同じドメイン内でしか移動できない(直リンできない)設定をしています。
このため、どこかにRefererを格納しておくというような手段は使えないように思います。
FireFoxで
<META HTTP-EQUIV="refresh\" content="1;URL=指定のアドレス">
でもRefererを吐き出すようにできるプラグインか設定(はなかったはず)があればいいのですが
判明しているのは
header ("Location:指定のURL");
ではRefererを吐き出せる(ページ内のリンク先に正常に飛べる)ということだけです。
>>759
<META HTTP-EQUIV="refresh\" content="1;URL=指定のアドレス">
を使用した場合、残念ながらFireFoxではRefererを吐き出しません。
ttp://www.teria.com/~koseki/memo/referrer/
で実際に確認できますよ。
0766nobodyさん
2006/04/02(日) 22:46:46ID:???> このため、どこかにRefererを格納しておくというような手段は使えないように思います。
意味不明。クッキーやセッションやパラメータ使ってのデータ保持くらい普通にできるだろ。
> を使用した場合、残念ながらFireFoxではRefererを吐き出しません。
それがブラウザの正しい仕様じゃないの?
0767750
2006/04/02(日) 22:58:47ID:???それはリファラを利用したアクセス制限は一般的ではないということでしょうか?
>>クッキーやセッションやパラメータ使ってのデータ保持くらい普通にできるだろ。
データ保持は可能ですが、これをブラウザ(または環境変数)にセットするということですか?
.htaccessで指定したものの実行順序はよくわかりませんがブラウザでアクセスした際に
アクセス元のブラウザの環境変数(リファラ)を参照して制限しているのではないのですか。
それだと保持したデータを渡すのはどのタイミングになるのでしょうか。
0768nobodyさん
2006/04/02(日) 23:07:46ID:???REFERERを返さない設定のブラウザまたはセキュリティソフト多すぎ。
0769nobodyさん
2006/04/02(日) 23:13:50ID:???そういう用途なら普通にCookieに許可符を持たせればいいんでないの。
Cookieが駄目ならURLに付加してもいい。
誰かも言ってたけど、セッションでやるっつうこと。
0770nobodyさん
2006/04/02(日) 23:14:53ID:???アクセス制限だけが目的ならRefresh前のページで弾かれてるだろうから
Refresh後にはREFERERが取得できなくても問題ないんじゃないか?
REFERERが取得できないブラウザを全部弾いてるんだと弾きすぎだろうし。
0771nobodyさん
2006/04/02(日) 23:51:44ID:???0772nobodyさん
2006/04/02(日) 23:58:10ID:???0773nobodyさん
2006/04/03(月) 00:10:52ID:???0775nobodyさん
2006/04/03(月) 00:17:00ID:???他のブラウザも含みたいんなら知らんけど
0777nobodyさん
2006/04/03(月) 01:33:07ID:???"1","あああ"
だとします。読み込みは>>729を参考にしたらできたのですが、
このうち「あああ」の方だけを取り出すのはどうしたらいいのでしょうか?
fputsの反対?
0778nobodyさん
2006/04/03(月) 01:44:54ID:???fgetcsv()
ただ、日本語データを含む場合はこける可能性が高いのであまりお勧めしない。
真面目にやると複雑な正規表現を使うか複雑な文字列編集が必要になるので結構面倒。
というか君、ひょっとしてマニュアルの類を全然読んでないの?
0779nobodyさん
2006/04/03(月) 01:46:39ID:???限界がある事は知っておいた方がいいよ。
0780nobodyさん
2006/04/03(月) 02:20:21ID:???$fp = fopen($logpath, "a");
flock($fp, LOCK_EX);
fputs ($fp, "$hoge2<>$hoge1\r\n");
flock($fp, LOCK_UN);
fclose ($fp);
このようにファイルに文字列を書き込む際、何らかのエラーが出て書き込めなく
なる場合が出てくると思います。その際、
if (エラーがでたとき) {
print("エラーがでたので書き込めませんでした");
} else {
print("書き込めました");
}
という風にしたいのですが、どのようにエラーを拾えば良いでしょうか。
0781nobodyさん
2006/04/03(月) 02:58:48ID:???これでエラーを拾えるのか。ありがとうございました。
0782nobodyさん
2006/04/03(月) 02:59:11ID:???$err = 1;
if($fp = fopen($logpath, "a")) {
$err = 0;
flock($fp, LOCK_EX);
if(fputs ($fp, "$hoge2<>$hoge1\r\n") === FALSE) {
$err = 1;
}
flock($fp, LOCK_UN);
fclose ($fp);
}
if($err) {
print("エラーがでたので書き込めませんでした");
} else {
print("書き込めました");
}
とかでいいんじゃないの。迷うようなもの?
0783nobodyさん
2006/04/03(月) 09:17:10ID:???drupla等の会員登録が必要なサイトで一度ログインすると、一度ブラウザを閉じてもサイド訪問するとログインした状態が保たれます。
これはどのような仕組みを使っているのでしょうか。
cookieを見るとセッションIDは使用しているようですが、セッションIDでは一度ブラウザを閉じると情報は保持されないですよね・・
0785783
2006/04/03(月) 09:25:21ID:omuaP2sqおへんじありがとうございます
セッション情報は/tmpに格納されているものだと考えていますが。
保存先をDBに変える方法があるのでしょうか、それとも/tmpから情報を読み取りDBに放り込むのでしょうか。
0786783
2006/04/03(月) 09:33:47ID:omuaP2sqsession_pgsql
というものもあるみたいですね、一般的には皆さんどうやってるんでしょうか
0787783
2006/04/03(月) 09:36:36ID:???session_encode
でDBに格納するのかな・・
0788783
2006/04/03(月) 09:51:40ID:omuaP2sq分かりました、セッションidをクッキーに保存しておき、そのセッションidが入ったクッキーを持っているユーザがアクセスしたら、クッキーからユーザを特定してログインさせるって事ですね。
無駄に連続書きこしてすいません・・
omu
0789nobodyさん
2006/04/03(月) 11:41:02ID:OZZpUwYyget_current_user がソレかと思いきや、これはスクリプトの所有者のようです。
そうではなく、実行しているユーザーが取得したいです。
getenv('USER') を試したのですが、これは場合によってはうまく取得できません。
0790nobodyさん
2006/04/03(月) 14:32:48ID:???posix_getuid()はだめ?名前の通りposix関数だから、winな環境だとどう動くか知らんけど。
0791nobodyさん
2006/04/03(月) 14:38:51ID:???動的にテキストのjpg画像データを吐き出して遊んでいるのですが、
フォントがttfしか使えないようです。
どうにかしてOpenTypeFontを使用することはできませんでしょうか。
0792nobodyさん
2006/04/03(月) 17:48:08ID:???0793nobodyさん
2006/04/03(月) 21:10:35ID:???以下のようなものを作りました
$data_array = array(array(2,3,4,5),array(1,4,6,4),array(3,5,2,6);
$sort = 3;
//こっから
$n=count($data_array);
for($i=0;$i<$n;$i++){
$temp[$i] = $data_array[$i][$sort];
}
asort($temp);
$key = array_keys($temp);
//ここまで
for($i=0;$i<$n;$i++){
echo $data_array[$key[$i]][0];
}
が、もっと簡単に上記と同じような事ができる関数は無いでしょうか?
0794nobodyさん
2006/04/03(月) 21:20:11ID:???こういうこと?
$data_array = array(array(2,3,4,5),array(1,4,6,4),array(3,5,2,6));
$sort = 3;
usort($data_array, create_function('$a,$b', 'return $a[$GLOBALS["sort"]] - $b[$GLOBALS["sort"]];'));
foreach($data_array as $d) {
echo $d[0];
}
0795nobodyさん
2006/04/03(月) 21:54:56ID:???専用の関数のようなものがあって
それを通せばいいというわけには行かなさそうですね
でも私の作成したものよりすっきりしてるの
793さんの物を使用したいと思います
ありがとうございます
0796nobodyさん
2006/04/03(月) 22:19:19ID:???該当の関数もあるにはある。
$data_array = array(array(2,3,4,5),array(1,4,6,4),array(3,5,2,6));
$sort = 3;
foreach($data_array as $d) $s[] = $d[$sort];
array_multisort($s, SORT_ASC, SORT_NUMERIC, $data_array);
foreach($data_array as $d) {
echo $d[0];
}
0797nobodyさん
2006/04/03(月) 22:19:59ID:8XacjkZyを受け渡すにはどのように記述すればよいのでしょうか?
0799nobodyさん
2006/04/03(月) 22:29:54ID:???0800797
2006/04/03(月) 22:33:16ID:???ありがとうございましたTT
0801nobodyさん
2006/04/03(月) 22:34:32ID:???こう書いて詰まっていたと予想するがどうか?
0802789
2006/04/03(月) 22:45:00ID:???そんなのがあるんですね。ユーザIDはちゃんと取れてるような気がします。
posix_getpwuid と組み合わせていい感じな気がします。
ありがとうございます。
>>792
最後の手段として、その手は考えていました。
でもなんとかなりそうでよかったです。
0803797
2006/04/03(月) 22:45:47ID:???{$newdata .= "," . $_POST["data$i"];}
print $newdata;
とCSVファイル作りたかったんですが、何故か$newdataが空で・・^^;
原因が$_POSTにあるのかと思った次第です^^;
まだ原因わかってません・・・orz
0804nobodyさん
2006/04/03(月) 22:48:44ID:???0805nobodyさん
2006/04/03(月) 22:51:11ID:irtGsMB0ビット演算で起こったエラーを調べるスクリプトを作っています。
$errには起こったエラーに応じて、1,2,4,8 のいずれかを組み合わた和が代入されています。
以下のコードでどのエラーが起こったか分かるのですが、これですと無駄が多いような気がします。
if($err&1) echo err1;
if($err&2) echo err2;
if($err&4) echo err4;
if($err&8) echo err8;
switchで簡略化できないかと思ったのですが、switchでは
if($err==1)と同じ動作はできますが、(switch($err){case 1:})
if($err&1)のように、"=="以外の演算子では処理できませんよね?
とにかくもっと簡略化したいのです。代替案でも構いませんので、どなたか御指南下さい。
また、説明が分かり難ければその旨をお伝え下さい。
宜しくお願いいたします。
0806797
2006/04/03(月) 22:54:15ID:???深く反省しております 。・゚・(ノД`)・゚・。
0807nobodyさん
2006/04/03(月) 23:04:32ID:???そもそも、1、2、4、8の和が入ってる=複数のエラーメッセージを出す必要がある、んだから
switchじゃ代替になってないじゃん。
foreach(array(1,2,4,8) as $b) if($err & $b) echo $err[$b];
辺りじゃない?
■ このスレッドは過去ログ倉庫に格納されています