【PHP】質問スレッドpart23【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/10/05 17:36:38ID:???・新規質問の方は上げてください。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
0757にーchan
04/10/24 21:23:00ID:???知っている方いたら教えてください。
0758nobodyさん
04/10/24 22:10:23ID:???0759nobodyさん
04/10/24 22:51:25ID:???0761nobodyさん
04/10/25 03:49:18ID:???それでは実際にタイムアウト処理を含んだソースを書くとすればどんな風に書きます?
そもそも、socket_set_timeout()で指定した秒数を超えるとどういう動作をしているのでしょう?
自分は今まで何も考えず、socket_set_timeout()さえ指定しておけば、勝手にソケット接続を閉じて
くれるとばかり思っていたのですが、どうもそれが上手くいっていないのではないか?(予想)という
ケースに遭遇しました。
色々と調べていると↓のようなソースを発見しました。
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/pukiwikimod/pukiwiki/proxy.php
これを見るとsocket_get_status()でチェックをかけてますが、必要な処理なのでしょうか?
ご意見求む。
0762nobodyさん
04/10/25 09:28:58ID:???質問1について
詳細のデータは対象物が変わならい限り更新の必要がないものでしょ?
その同じレコードにアクセスされるたびに更新されるカウンタを同居
させるべきじゃないよ。
具体的には詳細ID+カウント値という構成の別テーブルを作るべし。
詳細という事実とそれを参照されたという別の事実を混同しないほうがいいし、
更新頻度の異るデータを同じ場所に詰めこまないほうがいい。
質問2、3について
参照、修正、登録、削除それぞれ別ファイルにしておけばBASIC認証で済む。
0763nobodyさん
04/10/25 11:26:06ID:pw7w/xoj自分の製品を売っても、無料で使えて、出来ればソースの改造もしちゃって良いというの。
0764nobodyさん
04/10/25 11:31:40ID:XEONTDY3jpGraphとか?
0765nobodyさん
04/10/25 11:41:28ID:pw7w/xojレスありがとうございます。
jpgraphって商用版を買う必要がありませんか?
0766軟式PHP
04/10/25 12:05:26ID:???0767カポコン
04/10/25 13:14:27ID:???0769nobodyさん
04/10/25 13:27:18ID:R1CVi9Qf$_SERVER['QUERY_STRING'];
って、数字しか認めてくれないのですか?
http://~~.php?0432 と http://~~.php?A432 を
echo "<{$_SERVER['QUERY_STRING']}>";
と表示させたら前者しか表示されませんでした。後者は真っ白。
数字だけじゃ困るときはどーすれば良いですか?
0770nobodyさん
04/10/25 13:28:59ID:Dv6fMtrA0772770
04/10/25 13:35:29ID:Dv6fMtrA$abc_data = 'hoge';
$def_data = 'piyo';
$name = array('abc','def');
for($i=0;$i<count($name);$i++){
print ${$name[$i]}_data;
}
で、エラーが出ました。どこがいけないのでしょうか?
0773nobodyさん
04/10/25 13:48:37ID:???0774770
04/10/25 13:48:39ID:???$def_data = 'piyo';
$hensuu_name = '_data';
$name = array('abc','def');
for($i=0;$i<count($name);$i++){
print ${$name[$i] . $hensuu_name};
}
で出来ましたです。
0775nobodyさん
04/10/25 14:04:56ID:???んなわけない。<? phpinfo(); ?> が書かれているPHPに phpinfo.php?QUERY... でアクセスしてみろよ。
ちゃんと出てるだろ?
0776nobodyさん
04/10/25 18:21:09ID:???以下のようなものを作ってみました。
内容はTELや郵便番号・住所の番地部分などの数字とハイフンを
綺麗にそろえようとしたものですが、もっと短く綺麗なプログラム?にしたいのです。
どの部分をもっといじれば短く綺麗な物になるのでしょうか?
俺ならこう書くなどのコツを伝授してください
また付け足したほうがいい機能とかもあったら教えてもらえませんか?
*$inputとprint部は後で消したりフォームからの入力に対応させます。
$input = "999− 9 9 9―99 9 9";
$before = array("−","ー","ー","−","―"," "," ");
$after = array("-","");
$input=mb_convert_kana($input,"a","EUC-JP");
for($i=0; $i<count($before); $i++){
if($i<count($before)-2){
$input = str_replace ($before[$i], $after[0], $input);
}
else
$input = str_replace ($before[$i], $after[1], $input);
}
print($input);
0777nobodyさん
04/10/25 18:53:56ID:???こんな感じかなぁ
$input = "999− 9 9 9―99 9 9−8ー8ー8−8―8";
$bar = array("−","ー","ー","−","―");
$bars = implode("|",$bar);
$input = mb_convert_kana($input,"a","EUC-JP");
$input = preg_replace("/$bars/","-",$input);
$input = preg_replace("/[^\d-]/","",$input);
echo "$input\n";
0778nobodyさん
04/10/25 20:02:36ID:???IFもFORもなしに出来るんですね!
教科書レベルの私には分からない
関数が2つほど出て来てるので
いまから必死こいて勉強したいと思います。
ありがとうございました。
0779nobodyさん
04/10/25 22:30:48ID:???$input = "999− 9 9 9―99 9 9";
$before = array("−","ー","ー","−","―");
$input=mb_convert_kana($input,"as","EUC-JP");
$input = str_replace ($before, '-', $input);
$input = str_replace (' ', '', $input);
print($input);
こんなんでもいいんじゃない?
0780741
04/10/25 22:59:58ID:???なるほど。質問1についてとても参考になりました。
アクセスしただけで、count(例)というフィールドの値を読み出して
1足して書き込む。これってある意味、編集であるわけじゃないですか。
そのカウントアップするphpに変なクエリ(漠然としかわかってないです)を
つけたURLを送ったりして変なことされちゃうという危険性はどうなんでしょうか?
別テーブルでやります。
自分で調べたところ、フィールド内の値の更新は、mysqlの場合
自動的にロックされると理解したんですが同時アクセス(更新)に対しての問題はいまいち理解不足。
質問2-3はおっしゃるようにしようかと思います。
自分のように、中途半端な知識のまま、覚えたてのことだけでなんとかして
業務に使わなくてはならないのは、悲惨なんだか恵まれてるんだか、
自分でもよくわからなくなってきますた。
ひと月くらいの間でphpとmysqlのことばかりでちょっと頭おかしくなりそうです。
0781nobodyさん
04/10/25 23:25:34ID:???テーブルに書き込む前段階で入力値チェックすればいい。
自分が想定した以外の値が来たらエラーを返すようにする。
アクセス→カウントUPだけなら変なクエリも糞もない気はするけどな〜。
むしろ、他の部分で気を付けるようにして欲しい。
0782741
04/10/26 00:03:37ID:???ご丁寧に有り難うございました。
幸い、漏れて困るような情報は扱わないので、その辺は気楽です。
このところ、一気に詰め込みすぎたせいか、なんだか、えらく作業の効率が悪いです。
ここひと月ほど、休みも自宅でどっぷりでしたから。たまには気分転換もしないと・・・
0783nobodyさん
04/10/26 03:20:50ID:???おお〜これなら今の私でもわかる!!
なるほど…asで先に全角を半角にしてしまう手があったんですね…
理解してしまうと何でこんな単純なことががが・・・
自分で書いたやつがとってもお恥ずかしい限りです(汗)
777さんの9〜10行目の"/ほにゃらら/"このスラッシュが何の役割を
しているのかが分かりませんでしたが、大変勉強になりました
779と777の御二方ありがとうございました。
0784nobodyさん
04/10/26 05:07:44ID:nD9jwmRQprint "<FRAME name=up src=$PHP_SELF?mode=entry>\n";
print "<FRAME name=bottom src=$PHP_SELF?mode=output1>\n";
print "</FRAMESET>\n";
現在、↓のプログラムのボタンを押すと、Frame上部の画面(upの画面)が、変わる仕組みになっています。
これを↓のプログラムのボタンを押すと、上下両方の画面とも(Frameのupとbottom)更新されるようにする
方法を教えてください。
print "<FORM name=form2 method=POST target=up action=$PHP_SELF?mode=entry>\n";
print "<INPUT TYPE=SUBMIT NAME=b_act VALUE=ボタン>\n";
print "</FORM>\n";
0788nobodyさん
04/10/26 20:08:06ID:???array_splice($lines, $key, 1)
だとうまくいきません。
どうしたらいいですか?
0790788
04/10/26 22:06:06ID:3sXEVKxIarray_values()でどうしたら特定の要素を削除できるんですか?
0791nobodyさん
04/10/26 22:28:11ID:???unset($lines[$key]);
ってことかい?
0794788
04/10/27 01:01:26ID:???array_spliceで配列$linesから$lines[$key]だけを削除したい
でした。
おそらく793のやり方でいけそうです。
791,793さん、ありがとうございました。
0795nobodyさん
04/10/27 01:40:01ID:cq+DW3Jz$line='p180';
とあり、preg_match()を使って、pと180に分けたいのですが、PHPの
マニュアルやら、手持ちの本やらを見てもさっぱりわかりません。
わかる方、教えて頂けると助かります。
0797nobodyさん
04/10/27 01:47:36ID:???それだけの条件じゃいまいちワカランがな。
先頭のアルファベットと後ろの数字を分けるなら、
preg_match('/^([A-Za-z]*)([0-9]*)/',$line,$reg);
print_r($reg);
0798795
04/10/27 01:52:25ID:???(;・∀・)モシカシテ・・・
おー!できましたー!!!
ありがとうございます。本当にありがとうございます。(つД`)
>>796-797に幸あらん。
0799nobodyさん
04/10/27 01:56:53ID:???PHPっつーか、正規表現だよん。
0800nobodyさん
04/10/27 12:00:43ID:???RedHat Linux + PHPのサーバーからWindows + SQL Serverにアクセスしたのですが、
MS SQL関数は使えないのでしょうか?
調べてみるとsybase関数を使うという記述があったようなのですが、
資料が乏しくて理解に困っております。
どなたかご教授頂けないでしょうか。
よろしくお願いします。
0801nobodyさん
04/10/27 12:54:42ID:???http://jp2.php.net/manual/ja/ref.mssql.php
>注意: MSSQL拡張モジュールは、Win32システムでのみ利用可能です。
参考
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&q=unixodbc+freetds
0802nobodyさん
04/10/27 14:34:57ID:???Turbo Linux + PHP + qmail で mail()関数を使いたいと思っています。
ところが“Fatal error: Call to undefined function: mail()”が発生します。
PHPのマニュアルを読むと、qmailの場合は
sendmail_pathにパスを設定すると書いてあります。
“Qmailユーザは、通常、 /var/qmail/bin/sendmailまたは /var/qmail/bin/qmail-injectに設定します。”
php.iniのsendmail_pathには/var/qmail/bin/qmail-injectが設定されていますし、
ファイル自体も存在しています。
qmailデーモンも立ち上がっています。
どんな問題が考えられるでしょうか?
0803nobodyさん
04/10/27 14:45:14ID:???エラーレベルを上げてもっとたくさん報告してもらうようにするとか。
/var/qmail/bin/sendmailを(シンボリックリンクとして)作ってみるとか。
定義済みの関数一覧を出力してみてmail()が存在するかどうか確認してみるとか。
それぞれの方法は自分で調べてくれ。
0804nobodyさん
04/10/27 15:04:11ID:???エラーレベル:
E_ALL にしてもFatal errorの表示のみ
シンボリックリンク:
/var/qmail/bin/sendmail は既に存在したので、
php.iniでそっちを指定しても状況変わらず
定義済み関数一覧:
main()は存在せず・・・。
という結果となっています。
0805nobodyさん
04/10/27 15:04:54ID:???qmailで送信できてるかテストしてみた?
echo to: [email protected] | /var/qmail/bin/qmail-inject
0806802
04/10/27 15:09:45ID:???あ、こんな方法があるんですね。
ありがとうございます。
その方法では送信成功しました。
mail() → Fatal error
mb_send_mail() → FALSE
imap_sendmail() → TRUE(1)
全て送信失敗です・・・。
0807802
04/10/27 15:13:22ID:???imap_sendmail() → imap_mail()
0808nobodyさん
04/10/27 15:27:49ID:???でgoogleでイメージ検索して、2段目の最初の画像を見てみろ。
それが答えだ。
0809nobodyさん
04/10/27 15:31:07ID:???1.telnetでlocalhostの25番Portに接続
2.接続できたらSMTPコマンドで送信テスト
これも問題ないようであれば原因はqmailじゃないと思うよ
0811nobodyさん
04/10/27 16:24:33ID:???スクリプトファイルのオーナーuidとhttpdの実行uidが違う場合に
激しく不便なんだけど。
0812nobodyさん
04/10/27 16:28:15ID:???0813nobodyさん
04/10/27 18:56:54ID:8mNdDRMEPCREで、正規表現側に日本語文字列を使うとき、みなさん、どうしていますか?
マッチさせるテキストが日本語の場合は問題ありませんが、
正規表現に文字クラスを使うと、日本語の文字が1バイト文字の2文字として解釈されて困っています。
UTF-8を試してみたのですが、改善されませんでした。
おそらく既出だとは思うのですが、過去ログはすでに倉庫行きで見れません。
よろしくお願いします。
0814nobodyさん
04/10/27 19:00:29ID:8mNdDRME>マッチさせるテキストが日本語の場合は問題ありませんが、
これは、マッチさせるテキストは問題を引き起こさないという意味で、
正規表現が日本語の場合は、テキスト側のコードが何であっても問題が起こりました。
よろしくお願いします。
0816802
04/10/27 19:50:02ID:???関数一覧にmail()関数がなくなるようなインストールの仕方って、
どんなのなんですかね・・・。
http://people.paperclip.com.pe/jaguar/writeups/mailerror.php
ここを見て、qmailの方が後にインストールされた場合は
そんなこともあるから、PHPを再ビルドしろ(合ってますかね?)
という旨書いてあったので
make clean
make
make install
したのですが状況は変わりませんでした。
mail関数は標準関数なのに・・・。
0818802
04/10/27 20:11:44ID:???./configure からやり直したらmail()関数が使えるようになりました。
qmail をインストールした後にconfigureしないと、
mail()関数は有効にならないようです。
お騒がせしました。
0819nobodyさん
04/10/27 20:24:16ID:???逝け
0820802
04/10/27 20:28:24ID:???コマンドライン起動のPHPです。
0821nobodyさん
04/10/27 21:53:39ID:mWarabBu0823nobodyさん
04/10/28 01:19:45ID:???Yahoo!がPHPとMySQL使ってる事例が結構出てきた。
普通に大規模サイトで使えるんだね。
0824nobodyさん
04/10/28 01:28:18ID:???でも入れてるデータって何なの?
更新のほとんど無いカテゴリの情報?それとも頻繁に更新があるヤフオク?
0825nobodyさん
04/10/28 02:20:44ID:???PEARやSmartyを使うと大量にエラーが発生してしまいます。
外部のライブラリに手を加えずに、エラーを抑制して、
自分の書いたものにだけE_STRICTを適用することはできるのでしょうか?
0826nobodyさん
04/10/28 02:55:06ID:???最初に使ったのはYa!FINANCEのサイト。
使うべきところと使うべきでないところをきちんと判断し、
使うべきところで如何に適正に使うかを述べている。
0828nobodyさん
04/10/28 03:56:29ID:vepR/sO0豆にやってたメンバがやたら増えてわけわかんなくなるは
名前に規則性がないから判別つかんわ・・・
全部
SELECT * FROM でやっていいでつか?
パフォーマンスおちるかなぁ
0829T
04/10/28 04:46:02ID:d4m97dkaバージョンはPHP4.2.2、MySQL3.23.55です。
mysql_query()で2つのテーブルAとBのいくつかのフィールドを同時に
更新したいのですが、いろいろ試してみても方法が見つらず困ってます。
まず、mysql_query()では一度に一つのクエリーしか実行できないですよね?
で、各テーブルを別個に更新するクエリーAとクエリーBをそれぞれ順番に
mysql_query()で実行したとして、クエリーAが成功した後、
万一クエリーBが失敗した場合に、クエリーAの更新をキャンセルすることは
できないでしょうか?
MySQLのバージョン4あたりからCommit./Rollbackとかが使えるように
なってるらしいんですがMySQLのバージョンアップは考えておらず...
最初のクエリーの実行を一時的に保留にして、両クエリー成功時のみ更新を
反映させるなんて方法はないものでしょうか?
苦しまぎれにUpdate構文で2つのテーブルを内部結合して一発で更新、
なんて方法も試してみましたが、これもエラーに。
この方法もやっぱりムリなんでしょうか?
こういうケース、皆さんはどう処理されているのでしょう?
ちょっとMySQL板寄りの質問かもしれませんが、PHPのコードでなんとか
できる部分があればどうぞお知恵をお貸しください。
よろしくお願いいたします。
0831nobodyさん
04/10/28 07:25:46ID:???http://pc5.2ch.net/test/read.cgi/db/1096838301/178
条件の下、別の配列に格納しようとします。
例えば、Fileから読み込み格納した配列が
(A,B,5,D,1,A,B,A,B,10,23,A,40,A,B,C)
と並んでるとします。
この中から
DATA(10,23,40)を別に取り出したい(数字10以降から表れるn=3個の数字)
時は、どう考えたら良いのでしょうか。
0834nobodyさん
04/10/28 18:31:34ID:???(A,B,5,D,1,A,B,A,B,10,23,A,40,A,B,C)
と並んでる配列の中から数字10以降から表れる3個の数字を
別に取り出せばいいんじゃないかな?
つか何を悩んでいるのかさっぱり判らん。
0835nobodyさん
04/10/28 18:58:57ID:???太郎
花子
太郎
次郎
三郎
太郎
・・・
のようになっているとして、「太郎」を含む行だけを消したいです。(消したところは詰める)
fopen("log.log","w+")で開いて、forを用いpreg_matchで該当するモノを「""」に置き換えて消しては
fwriteでlog.logに書き込むという方法を使っていますが、ログが何メガとでかくなっていると
なんとなくデータが吹っ飛びそうで怖いです。
安全に、速く消していける組み方ってどんなもんでしょうか?
0836835
04/10/28 19:03:17ID:???$list=file("log.log");
$logfile = fopen("log.log","w+");
flock($logfile,LOCK_EX);
for ($i=0;$i<count($list);$i++) {
if(preg_match("/太郎/",$list[$i])) {$list[$i]="";}
fwrite($logfile,$list[$i]);
}
fclose($logfile);
0837nobodyさん
04/10/28 19:17:48ID:???から
flock($logfile,LOCK_EX);
の間で書き込みがあったら壊れるな
0838nobodyさん
04/10/28 19:28:04ID:???テンポラリファイルでやれば途中で止まっても大丈夫。
$fpt = fopen('tmp', 'w');
$fp = fopen('log.log', 'r');
flock($fp, LOCK_EX);
while($buf = fgets($fp, 1024)){
if(!preg_match("/太郎/", $buf)) {
fwrite($fpt, $buf);
}
}
fclose($fp);
fclose($fpt);
copy('tmp', 'log.log');
0839nobodyさん
04/10/28 20:19:32ID:???$Test="_POST";
$$Testと指定して$_POSTにしformの中身を持ってきてるんですが
$$Testのなかみを無理やり、
$$Test="abc";
echo("$$Test");
としてもechoの結果Arrayとでて中身が表示されんです
"abc"を$$Testと関連付けするためにはどうしたらええんでしょうか?
0840nobodyさん
04/10/28 21:55:43ID:???mb_convert_encodingが使えませんorz
どこか設定ファイルを書き換えれば使えるんでしょうか。。
0841nobodyさん
04/10/28 22:18:32ID:???http://www.php.net/manual/ja/ref.mbstring.php
0842nobodyさん
04/10/28 22:19:23ID:???設定ファイルの中に書いてあるよ。
mbstring や mb_ で php.iniやphp.ini-distの中を探してみる。
さらにマニュアルのマルチバイト文字列関数のところを熟読すると、
先々でつまらないミスをしなくて済む。
0845nobodyさん
04/10/28 23:46:09ID:kVaGnhG6ちょっと自分ではどうしようもないので質問させて頂きます。
index.phpがあり、その中から、http://host.dom/print.cgiを呼び出し、且つ
その表示結果を変数に入れたいのですが、可能でしょうか?
アドバイスでも何でも結構ですので、頂ければうれしいです。
一応こういう風にすればできる。
$var = file_get_contents('http://host.dom/print.cgi');
$Arrayと出ていませんか?ちゃんと細かく出力結果は書くべきですよ。
それはさておき、これは(${$Test})として変換されたのではなく('$' . $Test)
として変換されたからこうなったのです。代入はうまくいきます。
最後の出力行をecho $$Test;又はecho "${$Test}";に変えてみてください。
チェックしてないけどこれもいけるかも。
$fn = fopen('log.log', 'r+');
if (flock($fn, LOCK_EX)) {
$fn2 = fopen('log.log', 'r+');
while ($buf = fgets($fn, 4096))
if (strpos($buf, '太郎') === false) fwrite($fn2, $buf);
}
ftruncate($fn2, ftell($fn2));
fclose($fn2); fclose($fn);
テンポラリファイルを固定してしまうならばテンポラリファイル
にもロックかけたほうがいいかも。whileループ中に多重起動した
らテンポラリファイルが消えるし追加もよくわからなくなる。
>>849
ftruncateはifブロックの中入れるべきだった…
ほかは大丈夫。な、はず。たぶん、
0851843
04/10/29 01:10:07ID:???>>848
cgi-binのperlスクリプト用datファイルはshift-jisで、ホームディレクトリ側のphpファイルはUTF-8なんで困ってました。
幸い鯖の方はmbに対応してたんですけど、やはりローカルでも同じコードで確認できないと。。
jcode.phpとかではどうもうまくいかなかった・・・。
0853845
04/10/29 07:13:25ID:???おはようございます。
お返事遅くなってしまって失礼致しました。
上記関数で、無事値を取ることが出来ました。どうもありがとうございました。
file_get_contents()なんてあるんですね。とても勉強になりました!
0854800
04/10/29 09:54:59ID:???言われた通りunixODBCとFreeTDSとlibiconvをインストールしました。
いざPHPでodbc_connectを使用してみようとすると、
Fatal error : Call undefines function: odbc_connect() .....
と言われてしまい動きません。
odbc関数を使用するにあたってPHP側の設定でしなければいけないことはなにがあるんでしょうか?
是非お願いします
0855nobodyさん
04/10/29 11:20:26ID:fJt1IS4+これ読んだうえでの質問か?
http://jp.php.net/manual/ja/ref.odbc.php
■ このスレッドは過去ログ倉庫に格納されています