【PHP】質問スレッド Part15
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/03/07 02:03ID:???上級者用や雑談スレを立てたくなった場合は後から適宜立ててください。
■本家
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
0233nobodyさん
04/03/11 00:52ID:???動作確認したのがphpmyadminなので、SQL文ミスの恐れはないと思います。
先ほどisapiに変えてみたところビープが消えました。
が、isapiだと、これはこれでライブラリロード中のまま止まったりするし…。
サーバー側でメモリのエラーが出る→システムビープが鳴る
こんな予想立てて、ちょっくらanwebのサクーシャに問うてみます。
0234nobodyさん
04/03/11 02:25ID:???$charには、a-Z、0-9の文字が入ってます。$char[0]>a,$char[1]>b・・・・
これってちゃんと8個のランダムな文字列になってますよね?
srand();はしてないですけど。
ローカル(Windows)で動作試したんですが、10回ほどで同じものが出てきた時もありました。
62通りの8乗分の1なのに、たった10回で・・・
偶然、でいいんでしょうか?
何か気になります
0237nobodyさん
04/03/11 10:16ID:???BBSの部分を関数化し、
引数にDATファイル渡すようにしれ。
同じDATや違うDAT使うのも、切り替えしやすくなるぞ。
機能だけ関数化し、設定は外出し汁。
0239nobodyさん
04/03/11 11:06ID:???質問の仕方ってものがあるだろ、態度悪い奴に甘えさせるなよ。
まぁ、覚えたての知識を披露したいような厨に何言っても無駄だけど
0241nobodyさん
04/03/11 11:42ID:???0242nobodyさん
04/03/11 12:44ID:???0245nobodyさん
04/03/11 13:28ID:???同じかぜーのなかーうぃのーうぃのーおhh
きーきーきーらきあすきーすきー
と決めーきをはこぶーよとゅとゅとれーん
0246nobodyさん
04/03/11 13:53ID:???0248nobodyさん
04/03/11 15:24ID:???<?php
if($_REQUEST['mode']=='a'){
処理A
}
elseif($_REQUEST['mode']=='b'){
処理B
}
?>
と、延々と続いています。
一つの処理に付き、50行くらいなので、ソースがとても見れたもんじゃありません。
そこで、
処理Aを書いているもの・・a.inc
処理Bを書いているもの・・b.inc
として
if($_REQUEST['mode']=='a'){
require('a.inc');
}
elseif($_REQUEST['mode']=='b'){
require('a.inc');
}
とすれば、メインのソースは綺麗で、しかもそのままファイルの挿入を行うので、局所とか考えなくていいので楽ですが、素人丸出しです。。
みなさんはこういう場合どういう風にするのでしょうか?
0249nobodyさん
04/03/11 15:31ID:???0250nobodyさん
04/03/11 15:42ID:???switch($_REQUEST['mode']){
case "a":
require('a.inc');
break;
case "b":
require('b.inc');
break;
default:
break;
}
0251nobodyさん
04/03/11 16:33ID:???mb_send_mailを使っても受け取ったメールは文字化けします。
なぜでしょうか?
0252nobodyさん
04/03/11 16:36ID:???山田さんのやつみたいなのは?
ttp://www.dotaster.com/~s-yamada/php/
続きが読みたいんだけどもう更新されないのかな。。。
0253nobodyさん
04/03/11 16:38ID:???require じゃなくて include かなぁ?
あと、elseif が増えるようだったら、
switch〜case にしたり、
さらにツリー構造を作って、
includeの中でinclude。
0254248
04/03/11 16:48ID:???ファイルの挿入って、別に素人しかしないわけじゃないんですね。
ファイルに関数を詰め込んで、requireして関数を呼び出すのが上手な人のやり方だと思ったんですけどそうでもないみたいですね。
ところで、requireするファイルの先頭に<?phpつけないとphpの処理をしてくれないのって仕様ですか?
0255nobodyさん
04/03/11 16:55ID:bi3wfCFY見づらくないか
require/includeの為に分岐するコーディングは
普段しないが、敢えてするならこんな感じにする。
$mode_lists = array('a', 'b', 'c', ...);
if (in_array($_REQUEST['mode'], $mode_lists) {
require $_REQUEST['mode'] . '.inc';
} else {
error_reporting("WARNING: Choose unrecoganized mode");
exit(1);
}
~
0257nobodyさん
04/03/11 18:03ID:???config.inc・・・変数の定義
main.phpでfunction.incのtest()を呼び出すとすると
main.php内にconfig.incを挿入して
test($st1r,$str2);
とするか
function.incにconfig.incを挿入して、
function test($a,$b){
global $str1,$str2;
処理
}
として、main.php内でtest();
とするのはどっちがいいでしょうか?
後者のほうが、見た目がいいと思うんですが、
関数が一杯詰まってるファイルの中でグローバル宣言は控えたほうがいいでしょうか?
0259258
04/03/11 18:11ID:???config.incで定義されている変数をfunction.inc内でしか使わないなら後者(グローバル宣言は除く)
0260nobodyさん
04/03/11 18:12ID:???0261258
04/03/11 18:14ID:???定数の定義のみなら後者でもいいが、
変数の定義なら、普通はやっぱ前者。
0262257
04/03/11 18:19ID:???<?php
require('config.inc);
function func1(・・・){
・・・
}
function func2(・・・){
・・・
}
function func3(・・・){
・・・
}
?>
こういう状態だからです。
0264nobodyさん
04/03/11 18:25ID:???裏で生成した一部の変数、例えばDBへのコネクションオブジェクトなど、
表に出てきて欲しくない変数は、globalで渡す。
0265258
04/03/11 18:41ID:???関数がglobal宣言して参照しているだけならな
変数じゃなくて定数を使用すべきじゃないのか?。
0267nobodyさん
04/03/11 19:59ID:???あああ・・・>3文字
この場合は6文字と返してほしいのですが、、何かありませんか?
0271nobodyさん
04/03/12 12:37ID:???0272nobodyさん
04/03/12 12:44ID:???ここにアクセスすると自動的にリンク元が書き込まれるようにするにはどうすればいいでしゅか?
0278nobodyさん
04/03/12 14:19ID:???0281今日始めたPHP君
04/03/12 15:09ID:???なぜでしょう
<html>
<head>
<body>
<form method="post" action="<? echo $PHP_SELF; ?>">
<b>コメント</b><input name="name" type="text" size="20">
<input type="submit" value=" Send ">
<?
$data = file("data.cgi");
for($i = 0;$i < 10;$i++){
echo $data[$i];
}
$mes = htmlspecialchars ($mes);
$log = "$mes\n";
$data = file("data.cgi");
$fp = fopen("data.cgi","w");
fputs($fp,$log);
for($i = 0; $i < 20;$i++)
fputs($fp,$log[$i]);
fclose($fp);
?>
</form>
</body>
</head>
</html>
0283今日始めたPHP君
04/03/12 16:38ID:eRikD6BWこれですか?(何がミスってるか分からないでFA)
0284nobodyさん
04/03/12 16:43ID:???雌
0285nobodyさん
04/03/12 16:46ID:???何か抜けてる行がいっぱい。
取り合えず、
1.既存のデータファイルから読み込み変数に保持。
(読み出しの行数に制限は掛けないでファイルの最後まで読む)
2.保持してるデータを画面に出力(読み出しながらでも良いけどね)
3.一旦データファイルを閉じて、再度書き込みでオープン
4.保持してる変数の中身と、ブラウザからの入力には関係ない
プログラム中で指定した特定の文字列をデータファイルに書き込む。
つう感じのプログラム書いてみ。
(練習用なので上の処理には無駄があるが)
0286nobodyさん
04/03/12 16:50ID:???0287nobodyさん
04/03/12 17:03ID:???ログがもし画面出力されても改行されないれす(ブラウザ状で表示するなら)
このままでは直前の書き込みしかファイルに出力されないれす
0290nobodyさん
04/03/12 18:58ID:???*.chmの日本語版PHPヘルプはどこにありますか?
0291nobodyさん
04/03/12 19:37ID:K27QBh9Ittp://www.zend.com/zend/trick/tricks-nov-2001.php
どなたか解決方法があれば、教えてください。
問題は、フォームに「\0」が入力されると、置換処理が行われません。
winの場合は「\0」のみですが、linux環境の場合、「\2」とか「\4」とかでも問題が出ます。
ソースは以下の簡単なもので確認できます。
include_once ("class.FastTemplate.php");
$tpl = new FastTemplate(".");
$tpl->define(array(test => "test.html"));
$title = htmlspecialchars(stripslashes($_POST[title]));
$tpl->assign( "title", $title );
$tpl->parse( "CONTENTS", "test" );
$tpl->FastPrint();
強引ですが、円マークがPOSTされたら、強制的に全角にしてしまう、
という解決策を考えたのですが、スマートな解決策があれば教えてください。
0293291
04/03/12 20:35ID:K27QBh9Imagic_quotes_gpcはONです
magic_quotes_gpcに関係なく、「\0」などで置換しようとすると問題です。
以下の場合もダメということです
$tpl->assign( "title", '\0' );
0294nobodyさん
04/03/12 20:53ID:???そうなると、class.FastTemplate.phpのソースを見てみないとワカランが、
\0を文字列としてではなく数字として認識してしまっているとか?
または\0=NULLもしくは特別な文字として扱っているとか。
試しに、$tpl->assign( "title", '\\0' );としたらどうなるのだろう...
0295nobodyさん
04/03/12 21:31ID:???彼は始めたばっかだから色々判らなくて構わないと思う。
ただ最初から自分のやってることが判んなくて他人に
訊くつうことは、その取っ掛かりの難易度が高いか、
人に頼るのに慣れてしまってるのかのどちらか、またはその両方。
なんでコードありきじゃなくアルゴリズムから追っていった
方が楽だと思うんだよね。
0296nobodyさん
04/03/12 22:05ID:USSqUR4c出そうと考えています。
どうも以下の書き方ではうまくいきません。
$previous_name = session_name("WebsiteID");
echo "前回のセッション名は、$previous_name です。<p>";
0301nobodyさん
04/03/13 17:37ID:???どのように記述しますか?
$obj = new SomeClass();
$ret = $obj->func();
じゃなく
$ret = SomeClass->func();
見たいな感じで利用したいのですが
0302nobodyさん
04/03/13 17:46ID:???::
0303301
04/03/13 17:52ID:???出来ました。
ところでこれって全ての関数に利用する事が出来ると思うんですが、それを
制限する事って出来るのですか?
Javaでいうとこの private/publicみたいな、全ての関数にクラス利用者がアクセス
出来るのは・・・
0305nobodyさん
04/03/13 18:08ID:???詳しい友達から聞くと
関数はexe自体、クラスはlnkだ、つってたんですが・・・
例えば
a.php
<?php
require('function.php');
echo aiueo($a,$b);
?>
b.php
<?php
require('function.php');
echo aiueo($a,$b);
?>
function.php
<?php
function aiueo($a,$b){
return($a*$b);
}
?>
こういうファイルを友達にみせると、毎回requireしてるので無駄だって言うんですが
0306305続きです
04/03/13 18:11ID:???a.php
<?php
require('class.php');
echo aiueo::hoge($a,$b);
?>
b.php
<?php
require('class.php');
echo aiueo::hoge($a,$b);
?>
class.php
<?php
class aiueo{
function hoge($a,$b){
return $a*$b;
}
}
?>
このように毎回requireするから変わらないんじゃないでしょうか?
0307nobodyさん
04/03/13 18:33ID:???できないのです。どうやったら"<"を表示できるのでしょうか。
よろしくお願いいたします。
<?php
print "<";
?>
0308nobodyさん
04/03/13 18:37ID:???ブラウザでってことだよね。
そのまま表示するとhtmlタグとして認識されるから、エスケープしないとね。(ソースには<って出てるでしょ)
「<」これを単一で表示したいなら、print "&lt";(&は半角に直してね)
エスケープする関数使うなら
print htmlspecialchars("<");
0309nobodyさん
04/03/13 18:43ID:???ありがとうございました。
ググっても全然出てこないので困っていましたので、
ご教示大変感謝致します。
0310nobodyさん
04/03/13 19:33ID:???で質問です。
function bar() {
...
if ($true) return $true_array;
return FALSE;
}
見たいな関数を作ったとき
呼び出し元はどうしますか?
$ret_array = bar();
if (!$ret_array) {
// error !!!
}
か
$ret_array = bar();
if (!is_array($ret_array)) {
// error !!!
}
0311nobodyさん
04/03/13 19:45ID:???それだけじゃかわらんわな。
クラスをある機能を実現する関数郡ととりあえず例える。
関数郡ということなら、そのファイルを読むだけでクラス化しなくても
同じだのだが、
a.phpからはその関数郡をそのまま使う。
しかし、b.phpは
その関数郡のうち、一部だけ機能を変更したい。
一部の機能を追加したい。
等ということしようとすると、クラス化したほうが便利。
参考としてPEAR_Authのソースを見ると判るが、
usernameとpasswordの格納先(File,DB,LDAP等)に応じて
Auth_Containerクラスを継承している。
0312nobodyさん
04/03/13 19:50ID:???難しいです・・・
function.phpに
function hoge1(・・){
・・
}
function hoge2(・・){
・・
}
〜hoge10まで10個関数があるとして、
a.phpはhoge1〜hoge10まで全部使う、b.phpはhoge3だけ使うとすると、どういう風になるのでしょうか?
0314nobodyさん
04/03/13 20:05ID:???いや、それだけだとクラス化する利点が出ない。
hoge1-10を使うが、
b.phpはhoge3を一部改造して、hoge11機能を追加したいとか、
c.phpは各関数の結果は直接要らんが、その結果から得られる新たな値が欲しい。
なんて形にならないとな。要は使うときに機能の変更や追加をしたい場合。
後、プロパティ(言い換えれば、クラス化内スコープな変数)を使った
関数郡の連携とか。global変数じゃないので、メインスクリプトとの変数名の衝突がない。
0315nobodyさん
04/03/13 20:09ID:???うーん。。。やはりよく分かりません。。
必要な時期になれば分かりますかねぇ、、。。
今のところは何も考えずにがんばっていきます
0317nobodyさん
04/03/13 20:24ID:???PHP書いていたとしよう。あるとき仕様が変わってDBがPostgreSQLに変わったとしたら、
あちこちのmysql_query()をpg_query()に書き換える必要が出てくる。
もしデータベース関連をクラス化しておけば、書き換える部分は一箇所で済むだろう。
あるいは様々なDBに対応したクラスがあれば、色々なサイトを作るときに毎回使い回しが効く。
0318nobodyさん
04/03/13 20:33ID:???class db_query{
var $qb=mysql;
・
・
・
・
・
}
こんな感じで作っておいて、クラスから呼び出すということですか?
0319293
04/03/13 22:20ID:MdRW/jwCなんとか、自己解決しました。
$tpl->assign( "title", '\\0' );としたら,結果は「\0」に置換されました。
class.FastTemplate.phpのソースを見たら、
問題の部分が以下のようになっていました。
$template = ereg_replace("$key","$val","$template");
// $template = str_replace("$key","$val","$template");
以前に自分でソースを見たときに同じような処理をしていたので、下の方をコメントしたのを思い出しました。
ちなにに、コメントを外して両方の置換処理を有効にしたら、
$tpl->assign( "title", '\0' );
の処理が正常にできました。
しかし、\0のあとに文字を入れると、
$tpl->assign( "title", '\0a' );
「\0aa」と置換がダブりました。
結局、両方の置換を有効にして、順番を入れ換えるのが最善のようでした。
$template = str_replace("$key","$val","$template");
$template = ereg_replace("$key","$val","$template");
しかし、やっぱり、
$tpl->assign( "title", '\\0' );
のように「¥」が重なると、エスケープの格好になるので結果は「\0」ですね。
smartyのtemplateだとこういうことは無いのかな?
0320nobodyさん
04/03/13 23:19ID:???の時
mysql_connectを
$this->db_connectってやってもうまくいかないんですが、どうすればいいですか?
${this->db}_connectとかもやってみたんですが・・・
0321nobodyさん
04/03/13 23:54ID:???実行時間がたまに極端に長くなってしまうスクリプトがあり、
指定した時間でタイムアウトさせる方法を探しているのですが、
タイムアウト時に特定の文字列を出力する方法がどうしても分かりません。
何か方法はありますでしょうか。。
0322nobodyさん
04/03/14 03:07ID:z/827O17CPU:p4-2.0
MEM:256+256+128MB
DB :Oracle9i
OS :Redhat7.2(Kernel 2.4.9-13)
で、質問なのですが、CSVを抽出する処理でメモリを大量(50MB程度)に消費するのですが、
OSがメモリを解放するまでにメモリを食いつぶしてしまうのですが、
PHP処理終了時に使用したメモリを強制的に解放する設定or関数などないでしょうか?
ちなみに、DBが確保したメモリ解放命令は入れてあります。
そのレコードセットを配列に確保するのにメモリを消費しているようです。
わかる方がいらっしゃたら教えてください。
0323nobodyさん
04/03/14 04:51ID:???pearのDBを見ればイメージが湧くかな?
http://pear.php.net/manual/ja/package.database.php
>>320
$this->db_connect()は自分自身のインスタンスのdb_connect関数を呼び出すという意味。
db_connectからmysql_connectはどうやって見つけるのだ?
>>321
〃∩ ∧_∧
⊂⌒( ´・ω・)くぜんぶマニュアルの機能・接続処理のページに書いてあったでつ
`ヽ_っ⌒/⌒c
0324320
04/03/14 05:34ID:???だから、${this->db}などとして、こいつをなんとか展開させようとしてるのですが・・・
どうやったらいいのでしょうか?
プロパティ$dbにはmysqlという文字列が入っていて
それをどうにかして
mysql_connectとしたいのです・・・
0325nobodyさん
04/03/14 06:04ID:???eval()を使えば可能だろうけど何となくイヤン。
class BaseDB{
function db_connect(){}
}
class ExMySQL extends {
function db_connect(){}
}
class ExPostgreSQL extends BaseDB{
function db_connect(){}
}
ってな感じにしておいて、
$ex_db = new ExMySQL() や $ex_db = new ExPostgreSQL() から
$ex_db->db_connect()で呼び出すのも手かと。
*_connectだけで無く他の関数の違いも吸収しやすいし。
0326nobodyさん
04/03/14 07:59ID:???$func_connnect = $this->db . '_connect';
$con = $func_connect($host, $user, $passwd);
でダメ?
0327nobodyさん
04/03/14 10:01ID:???0328nobodyさん
04/03/14 10:21ID:???すんません、見つからなかったです。。
set_time_limitとregister_shutdown_functionの組み合わせで出来るかと
思ったんですがregister_shutdown_functionではブラウザへの出力処理は
無効みたいで…。
他にはset_time_limitとset_error_handlerとtrigger_errorの組み合わせも
使えそうなんですがどうも例題が分かり難く自分向けの応用が出来んのです
あとは終了する前にJavascriptを出力しておき不完全読み込みのまま
一定時間経過すると専用のページにジャンプする方法も考えたのですが、
どうも順次結果を出力する事が出来ずで…。
コネクションを維持したままブラウザに出力するのには特別な設定が必要
なんでしたっけ・・・?
ウチのサーバが標準でgzip出力なのが問題なのだろうか・・・。
0329nobodyさん
04/03/14 12:41ID:???どのようにしたらよいでしょうか。
for($i = 0; $i =< 10; $i++) {
echo $text[$i];
//(ここで10秒待ちたい)
}
ご教示お願いします。
0331nobodyさん
04/03/14 13:26ID:???初心者だけどアドバイス
sleep(10);
とかじゃダメかな?
ttp://php.s3.to/man/function.sleep.html
■ このスレッドは過去ログ倉庫に格納されています