【PHP】質問スレッドpart22【php】
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
04/09/16 18:17:37ID:/HV017tY・新規質問の方は上げてください。age進行でお願いします。
・質問する際には環境も明記。
・正しい日本語で分かりやすく。
・レスがつかないからって逆切れする厨お断り。
・解決しなくてもこたえてもらったら礼を。
■本家
http://www.php.net/
■日本 PHP ユーザ会
http://www.php.gr.jp/
■PHP マニュアル
http://www.php.net/manual/ja/
■PEAR マニュアル
http://pear.php.net/manual/ja/
過去スレ, 関連スレ等>>2-4
0821nobodyさん
04/10/02 13:32:37ID:XE0I1+gL認証後に表示されるデータなどを取得したいのですが
どうすればよいのでしょうか?
当然、ユーザー名やパスワードは自分のものを使ってです。
0822nobodyさん
04/10/02 13:46:39ID:???どうすればいいって・・・とりあえず自分でやってみれ。
HTMLを読んでAction属性で指定されたドキュメントに必要な値をPOSTすればいい。
書式は認証機構による。初心者はブラウザのHTTPリクエストとレスポンスを
横取ってながめてみるといい、というあたりが一般常識かな。
0823nobodyさん
04/10/02 13:55:44ID:???認証がBASIC認証だったら、それに対応したHTTPクライアントライブラリを利用する。
認証フォームを使ってPOSTで送ってるタイプの認証も同様にPOST送信が可能なライブラリを利用。
どちらもPEARにある。また他にも公開されてるライブラリがある。
自分でSOCKET通信しても良いと思うけど、既に有用なライブラリがあるんだから
それ使うのが良いでしょうな。
他には外部の対応しているプログラム(例えばwget)を利用する手もある。
0824nobodyさん
04/10/02 14:05:29ID:???http://sourceforge.net/projects/snoopy/
あと、最初は全部自分で書いてみた方がいいね。コーディング量もたいしたこと無い。
エラー処理が必要な個所や、とくにHTTP/1.1の決まりごとはざっと知っておく必要がある。
Socket関数は無理だろうから、fsockopenかstream_socket_clientを使って。
0825nobodyさん
04/10/02 14:22:25ID:???まずはfsockopenのサンプル使ってPOSTを成功させてみるところからじゃないの
0826nobodyさん
04/10/02 14:22:55ID:???<?php
$a = "abc";
if (ereg($a, abcdef)) {
echo "1";
}
?>
B
<?php
if (ereg("abc", abcdef)) {
echo "1";
}
?>
AとBは、目に見える結果としては同じになると思うのですが
実行速度やメモリ使用量などの観点から見ると
どちらのほうがメリットが大きいのでしょうか?
それともまったく変わらないのでしょうか?ご教授ください。
0827nobodyさん
04/10/02 14:40:00ID:???A, Bともにダブルクウォートを使用しているためパースされるロスがある
Bは変数に代入してい分早くメモリ消費も少ない
以上はマニュアルと常識的な思考ができれば自明。
A, Bの差異はエラーを除いて誤差の範囲であり、実際上無意味なので気にするのはナンセンス。
初心者ほど速度や負荷ネタで盛り上がるが、答える方は無意味な質問に答えされられるため
大変うざったく死んでほしいといつも願っている。
0828nobodyさん
04/10/02 14:44:19ID:???早い糞コードより読みやすく移植性の高いコードを書けよ。
毎度毎度毎度同じ回答で申し訳ないとは思うがね。
0831nobodyさん
04/10/02 14:51:28ID:???別ライブラリつかってるままなんだっけ?
0833nobodyさん
04/10/02 15:03:18ID:???そのままじゃない
どっちもeregだから関係ないけど
ここの質問見てるとereg使ってる人が妙に多いけど、なんの影響だろうね
0836nobodyさん
04/10/02 15:22:02ID:???メモリの使用なんてPHPをソースハック出来るレベルになって初めて分かることだろ。
理由わからずにどっちが速いなんて丸暗記してどうすんの。
正攻法で学べよと思う。
速度にしたってmicrotime()でベンチとればいいだけだし、""のパースとかでかい変数は
参照渡しにするとかDBの正規化とかっていうのはいちいち聞かれてたらたまらんつーの。
基礎の組み合わせなんだから、ベンチやって人のソースを読んでマニュアル読んで少しずつ
分かっていけばいいのにさあ。
やってみて巨大なボトルネックが出来て質問されたなら答える方も挑戦してみようと思うじゃない。
マニュアルに書いて有るようなレベルで速度がどうとか聞かれてもうざいだけだわ。
つーかなんだこの分量バカだろ俺はほんとに
0838nobodyさん
04/10/02 15:27:00ID:???普通の初心者はそういうこと聞かないマナーは心得てるよ
PHPはたまたま池沼がおおいだけだ
あまり気にするな
http://pc5.2ch.net/test/read.cgi/php/1077753522/271-n
気にしちゃだめだぞ
0839nobodyさん
04/10/02 15:46:24ID:f1jlg8jO$changed = preg_replace( "/([\"\\\])/", "\\ \\1", $str );
こうすると「\ "」「\ \」となるんですが、置換文字列のスペースを詰めて
$changed = preg_replace( "/([\"\\\])/", "\\\\1", $str );
とするとうまく行きません。
どうしたら良いでしょうか?
0840839
04/10/02 15:50:41ID:f1jlg8jO$changed = preg_replace( array("/\"/", "/\\\/"), array('\"', '\\'), $str );
こんな感じにすれば動作はすると思うんですが、見た目がややこしいのでもっと簡潔に書きたいんです。
どなたかよろしくご教授お願いします。
0842nobodyさん
04/10/02 15:53:09ID:???0843nobodyさん
04/10/02 15:58:44ID:???'/(["\\\])/' か "/([\"\\\])/" どっちかだな。
細かいことは正規表現スレのリンク読めば分かるかな。
# そもそも正規表現の仕事じゃないような気がしないでもないが。
0844nobodyさん
04/10/02 16:26:08ID:UuykfYQHまだ安定性にも不安があるしバージョンアップの間隔も短いので、
やっぱりPHP4で作る方が安心ですよねぇ。
PHP4のクラスは、インスタンスごとにメソッドまで作る(共有しない)らしいので
インスタンスをたくさん作るプログラムはPHP5の方がよさそうですが…
0845839
04/10/02 16:30:35ID:f1jlg8jOありがとうございます。
ヽ(´▽`)ノ
# それにしても \\\\\1まではやってみたんですが、\6個だったとは...ムズカシイ orz
0846nobodyさん
04/10/02 16:30:42ID:???今はちょっと反省している
0847nobodyさん
04/10/02 16:42:00ID:???$1で参照するなら \\\\$1 の4個。
後者推奨とマニュアルにはある。
0848nobodyさん
04/10/02 16:45:51ID:???文字化けしてるときはどしたらいいの?
ねぇねぇ
0851nobodyさん
04/10/02 17:42:51ID:???ファイルへの書き込みで、
ファイルの先頭へ書き込みたいんですが、
うまいやり方がわかりません。
w モードで開いて、新しく全部書き込む方法は
行数が増えた時に負荷も大きくなりそうで心配です。
行数が増えても負荷を小さくして書き込むことはできないでしょうか?
お願いします。
0852nobodyさん
04/10/02 17:52:33ID:???'a' 書きこみのみでオープンします。ファイルポインタをファイルの 終端に置きます。ファイルが存在しない場合には、作成を試みます。
これの意味分かるか?
0853852
04/10/02 17:53:52ID:???いや、スマン。
読み間違い。
'x' 書き込みのみでオープンします。ファイルポインタをファイルの先頭に置きます。
こっち。
0854nobodyさん
04/10/02 17:57:26ID:???知らなかったよ
どうもありがとう
バカ!
0855nobodyさん
04/10/02 17:58:49ID:???どこにファイルポインタを置こうが今回の件に関しては関係無いのではなくって?
0856854
04/10/02 18:13:02ID:???r+で開いて書き込んでみたんですが、
Windowsでいういわゆる Insertキーを押してある状態みたいに
なってて、
文字が上書きして入力されてしまいます。
書き込んだ文字分だけシフトさせることはできないんでしょうか?
0858854
04/10/02 18:23:01ID:???0859nobodyさん
04/10/02 18:33:16ID:???自分で組むしかないでしょう
重いかどうかは、実装してからベンチ
0860854
04/10/02 18:35:16ID:???やっぱり書き直すしかないのかなあ(;_;
0861nobodyさん
04/10/02 18:40:38ID:???$add = "先頭に付け足すデータ";
$contents = file_get_contents($filename);
file_put_contents($filename, $add . $contents);
0862861
04/10/02 18:44:03ID:???・でかいファイルはどうなるかしらん
・ドキュメント読んだだけなんで動くかどうかはわからん
・ってゆーか、マニュアルくらい嫁
ttp://php.s3.to/man/ref.filesystem.html
>file_get_contents -- ファイルの内容を全て文字列に読み込む
>file_put_contents -- 文字列をファイルに書き込む
0863861
04/10/02 18:48:03ID:???あ、そーゆーことか、すまん
書き直すしかないだろう
0864nobodyさん
04/10/02 18:52:28ID:???そういうことは「出来ない」と諦める手もあるよ。
諦めるレベルに差はあれど、誰しも技術的、経済的な理由等々で諦めてるもんだ。
0865nobodyさん
04/10/02 19:04:37ID:vlVC7o1I宜しくお願いします。
0866821
04/10/02 19:05:47ID:XE0I1+gLありがとうございます。
とりあえずアドレスにパラメータつけてrequireとかで読み込ませたんですが
”現在お使いのブラウザの設定ではログインできません。
(クッキーを無効にする設定になっています)”
とか表示されてうまく入れませんでした。
PHPの方でクッキーを読ませたりして認証通すことはできるのでしょうか?
0867nobodyさん
04/10/02 19:06:25ID:???別にちっちゃいファイルなら、簡単にできるけど。
追加する部分を新規ファイルに書く、いままでの部分をその新規ファイルにアペンド
ファイルネームを変更。みたいに。
でもね、これ、極めて馬鹿らしい方法だよ。
例えば、ファイルのありとあらゆる場所に追加するようなのが必要なら、データベース使うとか
双方向リストを持たせた多数のファイルをつくるとか。
追加するのが先頭だけってんなら、逆順に書いて、ファイルの最後尾に追加していくとか。
なんにしても、アルゴリズムが悪すぎると思うよ。
0868nobodyさん
04/10/02 19:08:13ID:???っか、質問意図不明杉
0869nobodyさん
04/10/02 19:33:08ID:???AddType application/x-httpd-php .php .html
これで、.htmlファイルもphpくぐってから出力される
という意味でよいんだな?
0870nobodyさん
04/10/02 19:51:12ID:???文脈からテキストファイルのようだけど、
書き込み時の負荷だけ下げたいのであれば、ファイル内の文章を逆にして
読むときに逆から読むようにすれば良いのでは?
例)
"World"と書かれたファイルの先頭に"Hello "を挿入したいとする。
元ファイルの内容を"dlroW"にし、末尾に" olleH"を追記する。
読み込み時に逆から読めば"Hello World"と書かれたファイルが出来上がってるという寸法。
0871822
04/10/02 20:06:12ID:???なんか明後日の方向めざしてるね。
他のレスにかいてあるけど、fsockopenのサンプル見た?
HTTPでブラウザが鯖にどうやってリクエストしてるか分かった?
初心者にすすめるべきサイトではないかもしらんが、
http://X68000.q-e-d.net/~68userのHTTPクライアントの項を
眺めて感じをつかんでみたら。これからやらないといかんことは同じだから。
Cookie情報はつまるところHttpヘッダフィールドのテキストなんで、
リクエスト時にいっしょに送信するだけ。ただCookieのOn/Offをどうやって
判定してるかはサイトによるので自分で調べてね。
0872nobodyさん
04/10/02 20:18:44ID:???それを効率よく実装されたものがデータベースとして幅広く使われてるんだけど。
データベース使うほどでもないけど、簡単でより効率のよい実装方法さがしているのであれば、
データファイルをインデックスと実際のデータ部分にわけて、
インデックスは勿論実データへのアドレス参照(tellなどで得られる)と確保したデータ領域の長さを持つ。
データ部分は、パディングをもたせて少し冗長な構成にする。
データを更新する時はseekでそのデータの先頭にポインタをセットし、上書きする。
データがパディングを含めた予め確保した領域の長さを上回るようであれば、
新しいデータ領域をファイル末尾に確保し、インデックスを更新する。
インデックスは更新する必要があるので固定長で。
説明に不備あるかもしれないけど、大筋はこんな感じで。
インデックスと固定長データを使った方法を提案してみる。
利点は用途によってはもっと最適化出来る事。欠点は拡張が難しいこと。
でも、開発/保守コスト考えると素直にDB導入したほうがいいよ。
0873nobodyさん
04/10/02 20:19:37ID:???GETじゃパラメータ渡らんだろ。そもそもrequireは問題外だし。
鯖にコネクトしてHTTPに則ってPOSTしてみな。
HTTPは解説サイトを見つつ、分からないことがあれば定番のこれで確認。
http://www.mars.dti.ne.jp/~torao/rfc/rfc2068-ja.html
Cookieは認証ページを読んだときに送られてきとるんで、これの値を送り返さないとCookieが
使用できないとみなされログインできないんだろう。
CookieもこまかいことはRFCかネスケの仕様書に書いてある。
0874nobodyさん
04/10/02 20:21:37ID:???0875nobodyさん
04/10/02 20:21:41ID:???0876854
04/10/02 20:28:03ID:???こんな詳しく、どうもありがとう!<(._.)>
いやー、難しそうですね。
DB使うほど大げさな物でもないので、
多少の負荷はかえりみずとも
簡単な方法でいこうと思います。
ほんとにどうもありがとう(*´ω`*)
0877nobodyさん
04/10/02 20:33:26ID:???ム板じゃ「問題ありのサイト」なんてリンクされてるが、
最初の一歩としてはお手軽でいいかなとも思う
821のやりたいことならphpマニュアルでことたりるのだろうが
0878nobodyさん
04/10/02 21:09:47ID:???Mozilla + Live HTTP Headerプラグインがお手軽でお勧め。
(Firefox1.0PRにもいつの間にか対応してたし)
0879nobodyさん
04/10/02 21:11:36ID:/4BoaAqc□ファイル名1
□ファイル名2
…
[削除]
こんな具合にファイル名の横にチェックボックスにチェック
を入れて削除ボタンを押すと消える、という仕組みです。
この場合、formから送った情報を$_POSTで受け取るんですが
チェックが複数だった場合はどうすれば受け取れるでしょうか…?
0880nobodyさん
04/10/02 21:16:48ID:???name="del_f[]" とすると、$_POST['del_f'] が配列になる。
0881Imo ◆.jC7ANgFY.
04/10/02 21:40:13ID:???whoisをPHPで実現するサンプルです。
$fp = fsockopen('whois.nic.ad.jp', 43);
fwrite($fp, "php.gr.jp\r\n"); $data = '';
while(!feof($fp) and $dat = fread($fp, 4096))
$data .= $dat; fclose($fp);
echo mb_convert_encoding($data, 'SJIS', 'JIS');
0882nobodyさん
04/10/02 21:47:18ID:CVirW+JCWoodyですので、PHP4.1.2でした。
この度、「まるごとPHP!」を買って、WoodyにLAMPを導入
する記事を参考に、softagencyからPHP4.3.8をインストール
しました。
しかし、'--without-pgsql'でビルドされているみたい(?)で、
PostgreSQLに接続できなくなりました。
ですが、WoodyのPHP4.1.2も'--without-pgsql'は同じ?
みたいなので、ひょっとして、このPHP4.3.8もなんとか
PostgreSQLに接続する方法がありませんか?
0883Imo ◆.jC7ANgFY.
04/10/02 21:49:39ID:???httpでのソケットのサンプルです。
# エラーチェックは実装してません
echo http_get('2ch.net', '/');
function http_get($host, $path) {
$fp = fsockopen($host, 80);
fwrite($fp, "GET $path HTTP/1.0\r\n" .
"User-Agent: PHP\r\nReferer: http://$host/\r\n" .
"Host: $host\r\nConnection: close\r\n\r\n");
while(!feof($fp) and $dat = fread($fp, 4096))
$data .= $dat; fclose($fp);
return $data;
}
0884nobodyさん
04/10/02 21:50:24ID:???自分の日記に書いてください
はぃ、以後そうします。(いつになるかわからないけど
# もう3つぐらい貼り付けようと思っていた
0886nobodyさん
04/10/02 22:03:00ID:???普通にコンパイルしなおせばいいんでない?
extensionにpgsqlのモジュールもあると思うけど、それを毎回読み込む方向でいけば
再コンパイルせずに使えるかも。
0887nobodyさん
04/10/02 23:13:31ID:???http://pc5.2ch.net/test/read.cgi/php/1068190843/l50
0888nobodyさん
04/10/02 23:37:00ID:???0889nobodyさん
04/10/02 23:53:03ID:CVirW+JC自分でビルドする腕はありません。(汗
Woodyの純正のPHP4にはPHP4-pgsqlというパッケージが
ありました。でも、>882に書いたPHP4.3.8をインストール
するときにREMOVEされてしまいました。
なんか、モジュールがあったんだと思いますが・・・
そのモジュールだけ、作る事って出来ないんでしょうか?
もしくは、どこかから持ってくるとか?
0890nobodyさん
04/10/03 00:27:46ID:???dl()するかphp.iniでロードするように指定できたと思うんだけどな。
他のパッケージも検索すればあるとは思うよ。MySQL以外のDB使ってる人も多いだろうし。
0891nobodyさん
04/10/03 00:46:43ID:???野良パッケージにまわされるほどマイナーなのか・・・
0892nobodyさん
04/10/03 00:59:30ID:dJZy1DJisocket_set_timeoutは
「有効なファイルポインタが確保されてからのtimeout時間」
という認識でよいですか?
それでソケット接続までの時間がかかる場合に全体でtimeoutを
設定してエラー処理するにはシグナルほにゃらら(理解していない)で
処理するしか方法はないんでしょうか?
今fsockopenやsocket_set_timeoutを設定して運用してるんですが
接続先のサーバが込み合ってる場合、効果ないようです。
0893nobodyさん
04/10/03 01:58:38ID:n1LZAPOpwoodyのが古杉
sargeのPHP4.3.8は依存関係の問題でwoodyには
入れられませんでした。
本で紹介されてたのはwoody用にビルドされた物で
よさげでしたが・・・pgsqlが無いのが残念
0894nobodyさん
04/10/03 03:08:58ID:???0895nobodyさん
04/10/03 03:20:55ID:???0896nobodyさん
04/10/03 03:39:23ID:???0897nobodyさん
04/10/03 04:16:49ID:???タウンズがメガドライブな
0898893
04/10/03 08:47:32ID:n1LZAPOpwoodyの問題なのかなぁ。
そして結局、たらい回しになりそうな希ガス
0900nobodyさん
04/10/03 15:08:05ID:???Indexページで現在参加できる部屋にリンクし、ユーザーは好きな部屋に入り、
各部屋内ではスクリプトとユーザーの投稿によってゲームが進行するようにする予定です。
Indexページで、存在する部屋のリストと、各部屋が参加募集何人しているかを横に表示したいのですが、
IndexページもCGIで出力する予定でしたが、このページはもっともアクセス数が多くなると思うのでできるだけ負荷減らしたい。
そこでページが要求されるたびにCGIで出力するのではなくて、ページが更新されるたびにCGIでhtmlファイルを鯖内に作成し、
これをユーザーに見せるようにすれば負荷が軽くなるかな?と思ったのですがどうなのでしょうか
使用言語はPHPとMySQLです。
0901nobodyさん
04/10/03 15:31:19ID:???0902nobodyさん
04/10/03 15:48:41ID:???確かに、相手のサーバに接続できない場合、socket_set_timeout() で設定した
タイムアウト時間が過ぎても無反応になる。
同じ問題で困った時には、socket_set_blocking() で non-blocking モードにして、
自分でタイムアウト処理を書いて回避した。
0905nobodyさん
04/10/03 18:27:51ID:2j245/56バグが自分では解決できませんでした
$passはフォームからPOSTで受け取っています
〜login.php〜
session_start();
$fp = fopen("./pass.txt","r");
$fps = fgets($fp, 32);fclose($fp);
if($_POST['pass'] == $fps){
$_SESSION['login'] = 1;
header("Location: http://********/***.php");
}else{print("パスワードが違います");}
〜移動先〜
session_start();
if(isset($_SESSION['login'])){
}else{header("Location: http://********/login.php");}
バグは、パスワードが合っていてもlogin.phpに飛ばされて
一度パスワードを間違えてから正しいものを入れるとやっと認証されます
ご指摘の程、よろしくお願いします
0906nobodyさん
04/10/03 18:47:39ID:???要するに header("Location: 〜")した時にsessionが引き継がれないってことかな?
それは正しい動作です。
どうしてもsessionを引き継ぎたい場合は Locationの時に明示的にSIDをつけましょう。
0907nobodyさん
04/10/03 18:48:39ID:???一桁までは 0x0〜0xF をキーにした連想配列でやってたのですが
2桁はさすがにちょっと・・・
if (substr($str, 0, 2) == '0x') {
echo HexDec(substr($str, 2));
}
0909nobodyさん
04/10/03 19:00:06ID:???Locationは302 foundだからSession Cookieセットされるし、
飛び先でブラウザはSessID送信するけど。
0910nobodyさん
04/10/03 19:20:44ID:cGVfVdlB前者の方が高速です。
0912nobodyさん
04/10/03 19:22:11ID:cGVfVdlBリロードしてびっくりしました。
ほんとだ、、ヘルプちゃんと見てなかったですね。
それなら何も使わずそのままいけますね。
ありがとうございます。
0917nobodyさん
04/10/04 00:25:36ID:???サーバサイドスクリプト自体が初めてです、というか
Webプログラミング自体が初心者です。
JavaScriptなら趣味で少々という程度。
PHP+mySQLの組み合わせだそうです。
0918nobodyさん
04/10/04 00:28:58ID:???0919nobodyさん
04/10/04 00:29:37ID:???長文をiモード用に出力する時に、10kbまでとかに抑えたいのですが。。。
一文字一文字を、文字コードから英数字→1byte、日本語→2byteとかやるのは、
我ながら「ちょっと違うな。。。」という気がするので。
0920nobodyさん
04/10/04 00:34:18ID:???PHP: Strings(文字列関数) - Manual
http://jp2.php.net/manual/ja/ref.strings.php
レス数が900を超えています。1000を超えると表示できなくなるよ。