【PHP】質問スレッドpart16【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/04/07 01:06ID:HTcWOpWf上級者用や雑談スレを立てたくなった場合は後から適宜立ててください。
■本家
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-5
0497nobodyさん
04/04/29 17:23ID:???すみません、Apache1じゃなくて2を入れなおして設定しなおしたらうまくいきました。
ありがとうございます。
クソ質問してごめんなさい、100回くらい吊ってきます…
0499nobodyさん
04/04/29 21:37ID:???0500nobodyさん
04/04/29 21:56ID:???文字列検索に使える関数と言えば
strposとかstrstrとか色々ありますよね。
で、ある文字列の中に任意の文字列が含まれているかどうか、ということだけを調べるのが目的の場合、
一番速い関数って何なんでしょうか?
0503500
04/04/29 22:09ID:???っていうか、マニュアルで、文字列が含まれてるか否か、という関数を探してたらみつからなかったんで、
どこにあるんだろう、と。
最初に見つかった位置を返す、とかばっかりで、そんな丁寧なことしてくれちゃってる間に、
速度が落ちてるんじゃないかと心配で。
もしかして、文字列が含まれてるか否か、だけを調べる関数ってないんでしょうか?
もしないんだったら、こういう場合は普通みなさんはどの関数を使ってらっしゃるんでしょうか。
一般的なお答えで結構です。
ちゃんと説明するとちょっと質問の方向がズレちゃってすみません。
0504nobodyさん
04/04/29 22:13ID:???被ったついでに
http://www.php.net/manual/ja/function.microtime.php
スクリプト中は何回か回して、またスクリプトも何度か動かして
平均とらなきゃ駄目だよ。
0505nobodyさん
04/04/29 22:17ID:???explodeで区切り文字に指定したい文字が二つ以上だったらどうすればいいんでしょうか。
explodeで出来た配列の一つ一つに再びexplodeをかけていって、
できあがった全ての配列を一つの配列に代入する、といった手順を踏めばできそうですが、
もっと簡単な方法があれば…。
よろしくおねがいします。
0506nobodyさん
04/04/29 22:17ID:???一気にfile()で読み込むのとではどっちが負荷・信頼性の面で良いのでしょうか?
0507nobodyさん
04/04/29 22:19ID:???文字列を探す時にアルゴリズムの"副産物"で
見つかった位置が得られるんだよ。<strpos
まあ普通でも使うから値も返してるのだけど。
0508nobodyさん
04/04/29 22:21ID:???一般的に後者。
マニュアルくらい読め
0512nobodyさん
04/04/29 23:33ID:???自前で"1a345abc9"という文字列から"ab"という文字列を
検索する「ベタな」アルゴリズム作ってみれば判る。
(マルチバイトは取り合えず考慮しないで)
0513nobodyさん
04/04/29 23:47ID:???if(str_exist()){ strpos()云々 } (str_exists : 文字が見つかったらtrueを返す超絶便利関数)
って感じで同じ文字列を二度も走査することになるからなぁ。
0514nobodyさん
04/04/30 10:51ID:acYJBbCx以下スクリプトの「この部分」って所が多重でログに残るんですよ。
$logFileNameが10行あれば、何故か10回書き込まれてしまう。
なんかマズイ書き方してます?
$line = file ($logFileName);
$fp = fopen ($logFileName, "wb");
flock ($fp, LOCK_EX);
fputs ($fp, $dat); // この部分
foreach ($line as $value){
fputs ($fp, $value);
}
flock ($fp, LOCK_UN);
fclose ($fp);
レン鯖環境
PHP 4.3.6
Apache 1.3.29
Redhat Linux 7.0
自宅鯖環境
PHP 4.3.1
Apache 1.3.24
Win98 SE
0515nobodyさん
04/04/30 11:20ID:wgal4sz4$_SERVER['HTTTP_REFERER']
を取得したら空文字がかえってきました。
どうすれば取得できますか?
0516515
04/04/30 11:23ID:???0517515
04/04/30 11:24ID:???質問は生きてます。
0519518
04/04/30 11:32ID:???0521nobodyさん
04/04/30 11:44ID:???リファラをあてにするな
適当な文字列を設定することも容易だし
リファラを渡さない実装や、ブロックする実装もある
取得出来なかった場合、諦めろ
0522nobodyさん
04/04/30 11:47ID:???0523515
04/04/30 11:50ID:???WinのIE6は取得不可能ってことなんでしょうか?
それが知りたいのですが。
よろしくお願いします。
0526nobodyさん
04/04/30 12:20ID:NAmcrNhQ現在のページに遷移する前にユーザーエージェントが参照していた ページのアドレス(もしあれば)。これはユーザーエージェントに よってャZットされます=B
全てのャ�[ザーエージャFントがこれをャZットし ているわけではなく、また、HTTP_REFERERを 変更する機能を持つものもああります。
要するに信頼するべきものでは ありません。 ←重要
0527nobodyさん
04/04/30 12:27ID:WYN4ZqJ6構文エラーがあったとき、dos窓がすぐに閉じてしまいます。
何とかならないのでしょうか?
0528526
04/04/30 12:27ID:???マニュアルのコピペなので勘弁してください
ageちゃってスマソorz
0529514
04/04/30 12:52ID:???自己解決しました。。。
この書き込み部分を関数化して読み込んでたんですけど、外側でforeachが動いてました。
お騒がせしてしまい申し訳ございませんでした。。。
0530nobodyさん
04/04/30 13:43ID:sYZVZspKEUC-JPのため、文字化けしないか心配です。
環境はWindows2000+Apache1.3.29+PHP4.2.4です。
この環境でPostgreSQLとやりとりした場合、文字化けは起こるのでしょうか?
また、起こるとしたら、どのような対処法が一般的なのでしょうか?
今、現在はMySQLと接続したりするアプリケーションでは、PHPのソースコードをShift_JISで
書いているんですが、EUC_JPで書けばPostgreSQLとの接続の際の文字化けは防げると思うんですが
Apacheはうまく機能してくれるんでしょうか?(EUC_JPでPHPのソースコードを書いた場合です)
これから、CygwinとPostgreSQLをインストールするので、その段階での注意点みたいのも
あったらよろしくお願いします。
他サイトで質問してもこれといった返事が返ってこなかったり、書籍、インターネットで調べても
Linuxでのやり方しか書いていないので、情報が0です。
マルチポストですが、よろしくお願いします。
0531nobodyさん
04/04/30 13:55ID:???んなこたぁねーだろ?
0532530
04/04/30 13:59ID:???WinのApacheを触ったことないということは、Unixばかりの人なんですか。すごいですね。
Unixを勉強したいと思うんですが、金がなくて。。
Javaをやっていたころ文字化けでむちゃくちゃ悩まされたので、今度は事前に困らないようにと思いまして。。
EUCでおかしくならないなら、それに越したことないですね。
ありがとうございました。
0533nobodyさん
04/04/30 14:03ID:???EUC-JPで書けば無問題のはずだが。
ま、PHPのソースをSJISで書いているみたいだけど、その様子だと
ちゃんとSJISに対応したPHPをインストールしているか疑問だな。
SET CLIENT_ENCODING でPHP(SJIS)<->PgSQL(EUC-JP)の
変換をPgSQL側でやってくれる。PHPはSJISのまま突っ込めばOK
0534nobodyさん
04/04/30 14:35ID:AdzajIxF$db=new authDBSample; //DBアクセスインスタンスコピー
$db->query("SELECT * FROM master where dat='".$_POST['year']."-".$_POST['month']."-".$_POST['day']."'");
$db->p("name");
上の文を実行するとエラーも値も何も出てこない。ちなみに
print($db->num_fields());
print($db->num_rows());
を実行するとフィールドが「5」、行が「1」と出力される。セレクトされてるレコードはあるようなんだけど値を出力する
$db->p("name");
がうまく表示されない。
MySQLを直接たたくと、ちゃんと1レコード出てきてました。フィールド名も合ってました。
どしてダロ。
0535530
04/04/30 14:37ID:???>ちゃんとSJISに対応したPHPをインストールしているか疑問だな。
入門本に書いてあるとおりやったんで、僕は実のところ全然分かりません。
今のところは一応作動しているので。。
SET CLIENT_ENCODINGをインターネットで調べたところ↓が見つかりました。
> pg_exec("SET CLIENT_ENCODING = 'SJIS'");
> というおまじないを入れると、PostgreSQL が出力データを SJISにしてくれます。
これは、どこへ書けばよいんでしょうか??php.iniにでも書くのか、ソースコードに書くのか。。
どうもすみません。PHPは本当によくわからないし、今度就職するところがPHP+PostgreSQLとかMySQLを
使用するみたいなんで、切羽詰まっております。よろしくおねがいします。
0536530
04/04/30 14:40ID:???についてですが、まだ、CygwinとPostgreSQLをインストールしていないので
なかなかそこまでいけないので、暇な方が回答していただければ幸いです。そこまで
急いでいないので。。
どうもみなさんありがとうございました。CygwinとPostgreSQLをインストールしてから、
自力でやってみようと思います。本当に助かりました。
0537nobodyさん
04/04/30 14:50ID:???pg_execってまた古そうなソースだな。
どこに書くか、それ見て判らんようだと....勉強汁。
で、どの入門書を見たか知らんけど、
echo "表";
が正しく動くかな。
0538515
04/04/30 15:00ID:???0539530
04/04/30 16:12ID:???正しく動きますが。。
普通にMySQLとのWEBアプリケーションとやらは組めます。
PostgreSQLもやる必要があるみたいなのでしつもんしました。
ちなみに入門書は↓をみました
http://www.cbook24.com/bm_detail.asp?sku=4798006696
>pg_execってまた古そうなソースだな。
>どこに書くか、それ見て判らんようだと....勉強汁。
どこに書けばよいんでしょうか??これが分からないと本当に勉強が先にすすまないので。。
書籍等は、本当にLinuxばかりでWindowsからPostgreSQL接続は0なんですよ。大きな書店を
はしごして調べたけど、ありませんでした。
本当に困っております。。
0540nobodyさん
04/04/30 16:24ID:???本当に組めるのならpg_exec (= pg_query)をどこに書くか判るはずなんだが。
どこに書くか教えてもらったところで、この先に進めるとは到底思えないのだが。
つーか、釣られているのか...
0541530
04/04/30 16:29ID:???どうもありがとうございます。分かりました。mysql_query()みたいな関数ですね。どうも。
じゃー、ソースコードに書けば良いんだ。
理解できました。関数か、それともphpの設定に使うのかちょっとわからなかったので。。
もう本当に解決しました。
釣りだったのかどうかしりませんが、理解できて本当に感謝しています。
今からPOSTGRESQLをインストールしてかって、PHPとPostgreSQLの本を見に行こうと思います。
本当にありがとうございました。
0542nobodyさん
04/04/30 16:31ID:???PHPはEUC or UTF-8、 PostgreSQLはcreatedb時にEUC_JP or UNICODEを指定。
php.iniで文字コード関係の設定せず、apacheはAddDefaultCharsetをnoneにしただけ。
cygwin 1.5.5-1
cygipc 2.02-1
postgresql 7.4-1(これら3つはcygwinのsetup.exeからインストールしたもの)
apache-2.0.49-win32
php-4.3.5-win32
phpの文字コード関係の設定は、オンラインマニュアルにうまくまとまってたよーな。
0543nobodyさん
04/04/30 16:31ID:???勉強する姿勢は大変結構だけど、この分だとここがあなたのためのスレになってしまう
(ま、進行遅い板だからそれでもいいんだけど)
たぶん即戦力としては期待されてないからさ
2chに頼るより就職してから先輩方にしごかれてください
0544533,537,540
04/04/30 16:49ID:???pg_set_client_encoding()
って書いたら怒られるかなw
0545530
04/04/30 16:50ID:???私の環境もほとんど似たようなものです。どうもありがとうございました。
実際にそれで動いているということで、大変安心しました。
本当にお騒がせしましてすみませんでした。
私は本当にPHP初心者なのですが、それでも理解できるように書いてくださって、
本当に感謝しています。
>>543
どうも、すみません。これ以降私の質問は、終わりにしたいと思います。大概は
本で解決できるのですが、これだけはどうしても自力で解決できなかったのですから。。
就職する前に最低限のPostgreSQL接続の基本くらいは知りたかったもんですから。。
しばらく、質問は控えたいとおもいます。どうもすみませんでした。
回答してくださったみなさん、どうもありがとうございました。
0546530
04/04/30 16:54ID:???(;-_- まじですか!?
それだけなんですか。。。
頼みますよ。必死でいろいろ調べたのに。。
書籍はLinuxを前提として書いてあるので、この文字コード変換については書かれていないんですよ。
インターネットも同様です。。
まー、いいです。一番手っ取りばやい解決方法はそれなんですね。どうもありがとうございました。
かなり感謝してるのと、疲れたということで、複雑な心境です
0547530
04/04/30 16:57ID:???これから、本屋へいくので、これ以上、からかわないでくださいね。
ではでは。
0548533,537,540老婆心
04/04/30 17:09ID:???一番手っ取り早い解決方法を教えてもらって、それで解決したって思っちゃダメだよ。
せめてSET CLIENT_ENCODING というSQL文を知った上でpg_set_client_encoding()を使うならまだいいけど、
SJISを用いるときのお呪い程度の知識じゃ、どうせこの先躓く。
MySQLとPgSQL両刀使いの会社に就職したんならなおさらだな。
0549nobodyさん
04/04/30 18:50ID:8pcmBsOy<?php $com = array(
'<a href="">テキスト</a>',
'<a href="">テキスト</a>',
'<a href="">テキスト</a>',
);
srand(time());
print $com[rand(0,count($com) - 1)];
?>
この様なリロードする度にリンクテキストが変わる
phpを書いみたのですが、二つ同じページに設置すると
毎回二つとも同じテキストが出てしまいます。
組み込んだテキストを完全ランダムに表示させるには
どうしたら良いでしょうか?
0551nobodyさん
04/04/30 21:37ID:???Wikiなどでよく見かける、ページ表示処理速度を表示させるには
どうしたらいいでしょうか?
microtimeを使うんでしょうかね・・
0553nobodyさん
04/04/30 21:43ID:???そこ見てたんですが、勉強不足なもんで
いまいち分かりませんでした。
0554nobodyさん
04/04/30 21:49ID:???最初の
<? $CPU_start=microtime(); ?>
で時刻をとっておいて、最後にまた時刻を取得して引き算。
list($tmp1,$tmp2)=split(" ",$CPU_start);
list($tmp3,$tmp4)=split(" ",microtime());
ここら辺の処理は違う方法があるきがするが。
0555nobodyさん
04/04/30 22:50ID:???array_randを使う。
4.2.0以降ならsrandも不要なので、seedの質に気を使う必要も無い。
>>554
Perlだと$^Tとかあるけど(1秒単位だからあまり意味無いかもしれないが)、
PHPには無いから普通は>>554の方法かな。
0556nobodyさん
04/05/01 01:23ID:???"C P U"
いかにも厨臭いな
0557nobodyさん
04/05/01 03:34ID:???で、質問といいますか相談というのは、
自分が普通に考えると、1000件を越えるまではfopenのモード 'r+' で単純に頭に行を足していって、
1000件を越えて以降は、file( )で1000行分を配列に読み込んで、
頭に新規アクセスをunshift、末尾をpopすればよいのではないかと考えました。
でも、よく考えると一件のアクセスを記録するために、毎回file( )で1000件分を配列化するのって、
大変無駄なような気がするんですが、どうなんでしょうか?
もっとスマートに書く方法がありますか?
1000件ごとにログを別ファイル化、などせずに良い方法がありましたら、
どうかお聞かせください。
というかPHP様にとっては1000行の配列化くらいなら大した手間ではないのかもしれませんが…。
アドバイスよろしくおねがいします。
0558nobodyさん
04/05/01 03:45ID:???ただし壊れにくさのためには早朝4時とかにログをローテートさせるべき。
0559nobodyさん
04/05/01 04:15ID:???行っていうのは人間が分かりやすい区分の仕方で、
PHP様にとっては\rなり\nなりの文字が含まれているだけにすぎない。
逆を言うと、ファイルを配列に取り込むにはファイル全部を舐めて
\rなり\nなりを検索して行ってるわけやね。
一方ファイル操作にはファイルポインタ(今ファイル中のどこを読んでるか、
書いてるかを示す位置情報)という概念があって、
ファイル中の特定の場所を操作するのに便利に使える。
この2つことから、別ファイルにファイルポインタ用の行の切れ目の場所を保存しておくと、
1行目・1000行目の取り出しが高速に行えることが分かると思う。
ところが、この別ファイルもまた1000行分あるわけで、そうなるとこれも高速化する必要がでてくる。
高速化のためにこれにもファイルポインタを活用しうわなにするんだやめr
0562nobodyさん
04/05/01 16:04ID:l1Yr02pcPHPlibって今はあんまり使われてないんだろうか?
セッション管理はしてくれるし、DBに依存しないコーディングができるから良いと思ったんだが。
0563nobodyさん
04/05/01 16:58ID:dBD1NpKI0564nobodyさん
04/05/01 17:27ID:???0565nobodyさん
04/05/01 17:33ID:dBD1NpKIやりかたがよくわかりません。。
やりたいことですがPHPでアップロードした複数の画像ファイルを
一括でダウンロードしたのです。ダウンロードは管理人のみです。
dir以下のダウンロードというのはできませんよね?
0566nobodyさん
04/05/01 17:37ID:???というのも思いつきました。これでよいかな。
PHP関係ないけど・・。
0567nobodyさん
04/05/01 17:49ID:???0568nobodyさん
04/05/01 18:22ID:???php-users MLで複数の案が出てたよ。
まっとうなやり方は無いのでどうしてもやりたいなら代替案で、って感じだったけど。
http://ns1.php.gr.jp/pipermail/php-users/2004-March/021535.html
0570nobodyさん
04/05/01 18:55ID:???0571nobodyさん
04/05/01 21:06ID:???新規のリンクが確立されるのではなく、代わりにすでに
オープンされた リンクのリンクIDが返されます。
オープンはこれでいいんだけど、これだとクローズするとき困る。
すでにオープンされてたら新規にオープンせずに既存のを使い
そのかわりクローズもしないで処理を抜ける とか出来ねーじゃん!
すでにオープンされているかどうか を調べる方法はないの?
0572nobodyさん
04/05/01 21:36ID:???ちゃんとドキュメント読んだか?
0573nobodyさん
04/05/01 22:25ID:h+ty9Fa60574nobodyさん
04/05/01 23:31ID:???PHP自体には、DBコネクションプーリングの機能はないよ。
他にプーリングサーバ設けて、それ使う。それでも
PHP-プーリングサーバ間のコネクションは持続できないけど。
0575nobodyさん
04/05/01 23:32ID:???取り合えずマニュアルの画像系の関数を調べたら?
サンプルも載ってるし。書き出しはUnysys特許の絡みで
サポートしてないバージョンもあるから、Imagemagick
使うのがいいだろね。まあバイナリー自力で操作する
手もあるけど。一般的なフォーマットの扱いだけなら
標準関数か外部ツールを使った方がいい。
0576nobodyさん
04/05/02 01:06ID:ChuRnvJnとりあえず、定型の部分(ヘッダー、フッター)とひと月経つと
次ページへ移動させるコンテンツは別ファイルにして、includeで
ページを構成させることにして、更新の負担軽減化を図れることが
わかり、一部実行しました。
PHP初心者が次に使えそうなテクニックってどんなのがありますか?
0578nobodyさん
04/05/03 03:31ID:11Jyjr9/phpのマニュアルにプリンタ関数はWindows 9.x, ME, NT4, 2000しか使えないと書いて有るのですが、
XPでphp_printer.dllを入れてとりあえずは動きますが、printer_draw_bmpという関数だけプリント
されないのです・・。
やっぱり駄目な物は駄目?
webで入力されたデータを印刷して、入力者に返したいのですが、ロゴなど入っていた方がカッコ良い
な・・なんて思っているのですが・・。
0579nobodyさん
04/05/03 11:14ID:???0581nobodyさん
04/05/03 15:31ID:???サーバの設定により、domxmlを使えないみたいなのですが、他の関数などを使って代用することは可能でしょうか。
もしくはdomxmlをphpで自作されている方はいらっしゃいませんか。
php_domxml.c php_domxml.h は何が書いてあるかさっぱりわかりません。
0582nobodyさん
04/05/03 15:47ID:???0583nobodyさん
04/05/03 16:41ID:rg12GSDJというのも、今スケジューラを作っていて、指定された時間になると自動でメールを発信するリマインダ機能をつけようと思っているんですが。
処理呼び出し用マシンを用意して、処理するPHPを自動更新で5分おきに呼び出すとか、そんな方法しか思いつかないんです。
(この表現で伝わりますか?)
もっとスマートな方法はありませんかね?
0585nobodyさん
04/05/03 17:11ID:???0586nobodyさん
04/05/03 17:27ID:???0587583
04/05/03 17:40ID:???ですから、cronとかも使えず…。
質問しておいてアレなんですが、やっぱりブラウザを起動しておいて自動更新で…に落ち着こうかなぁと思ってたり。
簡単だし。
スレ汚してすみません。
0590nobodyさん
04/05/03 21:54ID:???正直、Win版独自の機能については、
COMなんかもそうだけど、使ってる人あんまりいない。
[PHP-WIN] MLが比較的情報回ってる方かな。
0591nobodyさん
04/05/03 22:50ID:q5DnTGK5契約先のサービスサーバに接続しても、1/2の確率程度でしか結果を返してくれません。
私が悪いのか、サービスサーバが悪いのか分かりません。
$fp = fsockopen(...);
fputs($fp, "ヘッダとデータ");
fflush($fp);
while(!feof($fp)) {
$result .= fgets($fp);
}
fclose($fp);
一応、fflushの後にsleepとか入れてみたんですが、駄目です。
こういう経験がある方がいらっしゃれば、教えて下さい。
あいまいな質問で申し訳ないです。
0593nobodyさん
04/05/03 23:00ID:q5DnTGK5実際のスクリプトにはエラーハンドリングしてます。
feof($fp)が結果を返す前にtrueを返してしまいます。
0595nobodyさん
04/05/04 01:18ID:qkyRU8F3有難う御座います。
578です。
でも、MLって、英語ですよねぇ・・。
BMPで検索してそれらしき質問は見つけたのですが、誰も相手していなかったです。
$rst = printer_draw_bmp($objprt,"c:\\logo.bmp",400,400);
if($rst) {
print "成功";
} else {
print "失敗";
}
というのを書いて実行すると。
むなしく・・・「成功」・・・とでます。
という事は、やっぱり、XPではダメって事ですよね。
他のprinter_draw_textやprinter_draw_textは動くのになア。
ザンネン。
0596nobodyさん
04/05/04 04:57ID:???ウチのMe+PHP 4.3.4でも動きませんでした
might be only in CVS
だから仕方ないかも
(よく見たらプリンタ関数全部そうなんだけど)
■ このスレッドは過去ログ倉庫に格納されています