【PHP】質問スレッドpart32【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/01/03(火) 17:18:20ID:???【基本ルール】
・新規質問の方は上げてください。age進行でお願いします。
・質問者は2回目以降、最初のレス番号を名前欄に入れてください。
・回答者は質問者に対して>>(アンカー)をつけてください。
・煽り・荒らしは放置。荒らしに反応した香具師も荒(ry
・解決しなくてもこたえてもらったら礼を。
【質問テンプレ】
・マニュアルを調べたか、google検索したか(調べたキーワード)
・タイトル(禁:教えてください!etc) 例:requireとinclude
・内容 例:requireとincludeはどう違うのですか?
・質問する際には環境も明記。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークはそれぞれの該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
・オブジェクト指向については良スレがないから本を買え
・速さについては自分でベンチをとってここに書け(違う環境の人も調べてくれるかも)
【PHP マニュアル】
http://www.php.net/manual/ja/
※マニュアル上部の「search for」から検索を活用すべし(便利)。
過去スレ、関連リンク、FAQ等>>2-10辺り
0548nobodyさん
2006/01/31(火) 02:12:45ID:???print("fib($i)"); → print(fib($i));
print("fib($i)") ってのは文字列に$iの値を埋め込んで出力するって事、つまりfib()を関数として認識してない。
それと動作しないのとは関係ないけど、最初に書いてる$n; $i; は不要。$i は for($i=0; ...) で初期化されてるし、$n は使われてない。
まぁ次からは下質スレにおいで
0549nobodyさん
2006/01/31(火) 02:20:40ID:???0551540
2006/01/31(火) 09:12:48ID:2n+xF/sd>>547
信じてなかったわけではなく、理解できなかったわけで…。
コレを機会にちゃんと勉強します。
かなり甘えすぎてしまってごめんなさい。
答えてくれた皆さん、本当にありがとうございました
m(__)m
0554nobodyさん
2006/01/31(火) 20:33:44ID:???0555nobodyさん
2006/02/01(水) 00:05:32ID:???みたいな配列を
$res["aaa"]["bbb"]["ccc"] = 1;
のようにするのってどうやってやる?
evalは使わないで。
0558nobodyさん
2006/02/01(水) 01:07:07ID:???$array = array("aaa","bbb","ccc");
$ref =& $res;
foreach($array as $k) $ref =& $ref[$k];
$ref = 1;
0559nobodyさん
2006/02/01(水) 11:17:48ID:???なんかいろいろ応用できそうだ。
0560nobodyさん
2006/02/01(水) 12:08:18ID:???とあったのですが、
配列の1行目の要素を拾う場合は array_ なんと入れれば良いのでしょうか?
0561560
2006/02/01(水) 12:15:45ID:???$data[array_rand($data)];
こういう書式だったんですが
0563560
2006/02/01(水) 13:17:08ID:???<?
$data_file = "data.csv";
$row = array("7");
$num = count($row);
$data = file($data_file);
for($j = 0; $j < $num; $j++)
{
$result = $data[array_rand($data)];
$val = explode("\t", $result);
echo $val[$row[$j]] . "<br>";
}
?>
こういうプログラムで、data.csvの一番上のデータ行の、8列目の文字列を取り出す、
というのをやりたいんですが
$result = $data[array_shift($data)]; ではダメだった…
0564nobodyさん
2006/02/01(水) 13:35:24ID:???0565529
2006/02/01(水) 13:53:53ID:???ご存じの方、教えて下さい。
このコードは8M超のファイルがDownload可能である事を確認しました。
---------
[php.ini]
memory_limit = 8M
------------
[test.php]
$content_size = filesize("$FNAME");
header("Content-Type: application/octet-stream;");
header("Content-Length: ".$content_size);
header("Content-Disposition: attachment; filename=\"$SRCFILE_SJIS\"");
flush();
ob_end_flush();
readfile($FNAME);
------------
しかし、上記と全く同じものを、ファイル名($FNAME)選択する
PHP中に含ませると下記のエラーが出ます。
Allowed memory size of 8388608 bytes exhausted (tried to allocate 8209774 bytes)
php.ini の memory_limit を超えてDownlloadできる方法は
これで合っているのですが、解決方法や問題点をご存じの方、ご指摘願います。
(小さなファイルはDownload出来ています)
0567529
2006/02/01(水) 15:26:49ID:???ファイル選択の前に、ID/PASSの認証と、sessionを利用してます。(同じPHPコード内)
ロジックとして以下のフローとなっています。
認証 → .認証をSessionで保持 → ファイル選択 → .DL
もちろん、前段の部分が原因になっているとは思うのですが、
外すわけには行かず…。orz
DLに関しては、上記PHPコード部分で(ほぼ)独立した世界であると
考えておりましたが、甘かったようです。
最悪、外に fget.php を用意して、引数を与えて
DLさせるようにしてみようと思いますが、
何かしら解決手段、原因など判る方はご指摘願います。
0568nobodyさん
2006/02/01(水) 15:58:54ID:???前段でグローバル変数とか使いすぎてるんじゃないのか。
ダウンロードのとこ、readfile()で一気読み&出力しないで
fgets+fwriteのループ処理にしてやればいきなり8MBもメモリ確保するようなことはなくならない?
なんかPerl辺りじゃ常識的な省メモリ動作のロジックなのに(やらんやつはタコ呼ばわり)、
PHPの開発者って便利関数に頼りすぎて丸っきり無視する傾向にあるよな。
ファイルがあったら何でも配列に丸ごとぶちこめ!みたいな。
0569nobodyさん
2006/02/01(水) 16:40:16ID:???>PHPの開発者って便利関数に頼りすぎて
これはあるな。GETのQUERY_STRINGが自前のコードでパースできない奴とか。
便利なものを使わずに、わざわざ不便なやり方をしろとは言わないけど。
0570nobodyさん
2006/02/01(水) 16:45:40ID:???0571529
2006/02/01(水) 16:56:19ID:???レスどうも。 色々試してみた結果のご相談です。
>>529 読み込みバッファ固定+ループで吐き出し
大きなファイル×
小さなファイル ○
>>565 メモリ食わないように、強制バッファリング無し(ob_end_flush();)で吐き出し、(+flush系関数での試行錯誤。)
大きなファイル×
小さなファイル○
という結果で、路頭に迷っている訳です。
実は「強制バッファリング無し等が有効にならない条件」があって、
それにハマっているんじゃないかと思う次第です。
ともかく、下手打ってphpに100Mとか、1Gとかメモリを
食われるのはご免なので、もう少し苦しんできます。
0572nobodyさん
2006/02/01(水) 17:04:12ID:???Allowed memory size of 8388608 bytes exhausted は
PHPの変数で確保しようとしたメモリが足りないときのエラーだから
バッファリングのフラッシュとかは全然関係ないと思うぞ。
あと、ob_end_flashってob_start以降の出力制御をかけたときのフラッシュ処理で
ob_startを使ってないなら何の関係もない。
読み込みバッファ固定+ループってやつがやり方間違ってるとかじゃないの?
0573nobodyさん
2006/02/01(水) 18:35:08ID:???echo shell_exec("xcopy /?");
で走らせた所
'xcopy' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
と出て使えませんですた
0575nobodyさん
2006/02/01(水) 19:28:39ID:???普通に使える。
>php xcp.php
<?php
echo shell_exec("type xcp.php")."\n";
echo shell_exec("xcopy /?");
?>
ファイルとディレクトリ ツリーをコピーします。
[以下略]
path通してないんじゃ?
0576nobodyさん
2006/02/01(水) 21:13:37ID:???0577nobodyさん
2006/02/02(木) 12:29:48ID:nicG19IV関数やメソッドに「配列を複数の引数として渡す」のは
call_user_func_arrayなどで出来ると思いますが、
new時のコンストラクタには出来ないのでしょうか。
class obj{
function obj($a,$b,$c){
echo "a=$a,b=$b,c=$c<br />\n";
}
}
$arr=array("a","b","c");
new obj($arr);
↑みたいにしたいのですが・・・。
よろしくお願いします。
0578nobodyさん
2006/02/02(木) 12:43:48ID:???できないと思われ。
俺も以前、割と汎用的なファクトリパターンを実現したくて(飽くまで遊びでだけど)同じこと考えたけど、できないので諦めた記憶がある。
そのときは結局、継承だかインターフェイス使うかしてinitializeっていうメソッドを加えてcall_user_func_arrayした。
作ったやつ実際どこにも使わなかったけどorz
0580nobodyさん
2006/02/02(木) 12:49:48ID:???ヒントください。
0581nobodyさん
2006/02/02(木) 12:52:31ID:???new obj($arr); //newの戻り値無視
とは同等だけどね
0582nobodyさん
2006/02/02(木) 12:55:01ID:???PHP5ってそろそろ移行しといた方が良いと思う?
0583nobodyさん
2006/02/02(木) 12:59:48ID:???0584nobodyさん
2006/02/02(木) 13:02:20ID:???コンストラクタ側にそういう機能を持たせたら?
class obj{
function obj($a,$b,$c){
if(is_array($a)) {
list($a, $b, $c) = $a;
}
echo "a=$a,b=$b,c=$c<br />\n";
}
}
0585nobodyさん
2006/02/02(木) 13:17:08ID:???こんな感じのラッパーはどうか。試してない。
instance_on_array($classname,$args) {
$args_list=join(",",$args);
eval("\$instance=$classname $args_list");
return $instance;
}
0586nobodyさん
2006/02/02(木) 13:24:50ID:nicG19IVたくさんのレスありがとうです。
>>579さんの見て「おっ」と思ったのですが、
>>581さんの言う通り、普通の関数呼び出しです・・。
難しいようですね。
>>584さんの方法あたりで、もうちょっといろいろやってみます。
0587nobodyさん
2006/02/02(木) 13:28:53ID:???どういう挙動にしたいかいまいちわからないけど、例えばこんな感じか?
"*" . strstr("bbb.aaa.co.jp", ".")
0588nobodyさん
2006/02/02(木) 14:35:36ID:nicG19IVswitch( count($arg) ){
case 0:
return new $obj();
case 1:
return new $obj($arg[0]);
case 2:
return new $obj($arg[0],$arg[1]);
...以下ひたすら延々とw
皆さんありがとうです。
0589529
2006/02/02(木) 17:39:14ID:???--------------------------------------
環境
apache+mod_ssl-1.3.33+2.8.22_1 (httpsを利用)
php4-4.4.2
php.ini memory_limit = 8M
test.zip 25Mbytes
--------------------------------------
(1)OKコード
$filename = "./test.zip";
ob_end_flush();
readfile($filename);
--------------------------------------
(2)NGコード
$fp = fopen ("test.zip",'rb');
while(!feof($fp)){
echo fread($fp,1024*10);
flush();
}
fclose($fp);
--------------------------------------
(1)の場合でも、session_start();を利用すると×
両NG時、memory_limit = 100MでOK、70MではNGだった。
25Mのファイル如きに、冗談かと思うメモリ消費量。
なんにせよ疲れた…。
0590nobodyさん
2006/02/02(木) 18:02:40ID:v1gMyS91実はHPを運営してるんだが、phpの掲示板を設置した
しかし、設置したはいいが動作しない(ページが表示されない)
鯖はsakuraです
しかし別の鯖ではうまく動作します
phpはぜんぜんわからないのでご支援ヨロです。
0591nobodyさん
2006/02/02(木) 18:08:41ID:???0594590
2006/02/02(木) 18:20:47ID:v1gMyS91>>593別の鯖は無料の代わりに広告が入るから…。
出来ればサクラで動かしたい
同じ鯖で同じスクリプト使ってるサイトもあるのだが、
ちゃんと動作している。
0595nobodyさん
2006/02/02(木) 18:25:23ID:???あと「動作しない」ってのがどういうふうに動作しないのか具体的に書くよろし。
エラーメッセージが出るのか出ないのか、表示はできるけど書き込みすると変なことになるとか、文字化けがあるとか。
何をどうしたときにどう変なのか。
0596nobodyさん
2006/02/02(木) 18:31:08ID:???経験的に多いのは
FTP時に勝手に文字コードが変わったとか
設定ファイルを書換時に文字コードが変わったとかで
サーバの設定上使えない文字コードになっていたり
一部のファイルのみ文字コードが変わった結果
部分的にエラーになっている状態。
エラーメッセージ無しで真っ白なんだよね?
0598nobodyさん
2006/02/02(木) 18:38:28ID:???0599590
2006/02/02(木) 18:53:06ID:4KM2QfVchttp://zut.jp/index.php?mode=page&aim=A4B1A4EAA1BCA5BDA5D5A5C8
具体的には500エラーとなります
0600nobodyさん
2006/02/02(木) 18:59:28ID:c4LX8dEo0601nobodyさん
2006/02/02(木) 19:30:21ID:???さくらではCGIはsuExecでCGIを起動して所有者権限で動作する。
フォルダとスクリプトのパーミッションは何になってる?
777とか707じゃ動かない筈、755か705でやってみれ。
フォルダとスクリプトは755(705)、それ以外は644(604)、ブラウザで直接参照しないデータファイルなら600でok
これでならないようなら、レンタル鯖板のさくらインターネット質問スレで聞け
↓さくら使うなら一通り目を通すように
>さくらのレンタルサーバ非公式FAQ
>ttp://faq.sakura.ne.jp/
0602590
2006/02/02(木) 19:42:51ID:4KM2QfVcありがとう。でもダメだったぽ
なんどやっても500エラーorz
レンタル鯖板のさくらインターネット質問スレで聞いてみることにするよ
いろいろサンクス
0603nobodyさん
2006/02/02(木) 19:55:35ID:???うーん・・ならないか。
試せる環境ないし、一息ついてから聞いてごらん
非公式FAQより
>一回、鯖上のCGIもローカル上のCGIも全部消してごらん。
>そして、コーヒーなりお茶なりで一服してごらん。
>落ち着いたら、もう一回CGIを落としてきて、
>説明書きに書いてある通りに、何も考えずにやってごらん。
>
>大混乱してるときには何やっても上手くいかないよ。
>落ち着いてマターリと。
0604nobodyさん
2006/02/02(木) 19:59:24ID:???0607nobodyさん
2006/02/03(金) 14:37:08ID:Rdf8V/FSextension_dirとMySQL
・内容
�@c:/windows/php.iniファイルで、extension_dir = "c:/php/ext/"
と設定しましたが、phpinfo()で確認したところ、ブラウザには
extension_dirはc:\php5となっていました。c:\phpフォルダは作成済み
ですが、c:\php5フォルダは作成していません。
php.iniでのextension_dir設定を反映させるにはどうしたら良いでしょうか。
また、この現象の理由も知りたいです。
�Aphpinfo()による出力画面でMySQL設定項目が表示されません。
大項目「libxml」の次は「odbc」となっており、「mysql」がありません。
mysql項目がphpinfo()で表示されるにはどうしたら良いでしょう。
php.iniで下記の設定をしています。
extension_dir="c:/php/ext"
extension=php_mysql.dll
c:/windows/system32フォルダにはc:/php下のdllをコピーしています。
・環境
OS:WindowsXP SP2
サーバ:Apache2
PHP:ver.5.1.2
MySQL:ver.5.0
ウィルスソフト:Norton Internet Security
・google検索したキーワード
phpinfo,php.ini,extension_dir,mysql,httpd.conf
アドバイスのほど、宜しくお願い致します。
0608nobodyさん
2006/02/03(金) 14:55:01ID:???phpinfo() の最上部ブロックの
Configuration File (php.ini) Path を確認しれ
ttp://www.php.net/manual/ja/configuration.php
0609607
2006/02/03(金) 16:11:13ID:Rdf8V/FSC:\WINDOWS と書いてあります。
下記にはphp.iniはありませんでした。
【1】C:\Program Files\Apache Group\Apache2
【2】HKEY_LOCAL_MACHINE\SOFTWARE\PHP\IniFilePath
0610607
2006/02/03(金) 16:40:00ID:Rdf8V/FSApache2の設定ファイル httpd.conf に次の行を記述したところMySQLを認識しました。
○PHPIniDir "c:\php\"
それまでは上記の行を
×PHPIniDir "c:/php/"
と書いていました。
0611607
2006/02/03(金) 16:43:11ID:Rdf8V/FSC:\WINDOWS\php.ini となりました。
アドバイスありがとうございます。
0613607
2006/02/03(金) 17:31:54ID:Rdf8V/FS>>610 に書いた設定をコメントアウトしてもOKでした。
#PHPIniDir "c:\php\"
PHPIniDir "c:\php\" を書いてしまっていたのが良くなかったようです。。
0615nobodyさん
2006/02/03(金) 20:00:36ID:nU0pDG8Yコンストラクタ内で、同じクラスに定義された関数の呼び出し
【Google, PHPマニュアル】
Google: オブジェクト指向、コンストラクタ、PHP5、クラス、etc...
マニュ: クラスとオブジェクト(PHP 5)あたり
【環境】
XAMPP1.5.1、PHP5.1.1、WindowsXP SP2
【内容】
コンストラクタ内で、同じクラスに定義した関数を呼び出すにはどうしたらいいでしょう。
もしくは、それと同等のことを行う代替案などはないでしょうか?
コンストラクタ内に全部の処理を書くと、量が多くて保守が大変そうなのです。
言葉で少し説明しづらいですが、下のような感じでやりたいのです。
本来のソースでは、関数内のコード量が多く、かつ関数がたくさんあるのですが・・・。
class testClass
{
private $val;
public function __construct($arg){
$this->val = func($arg);
}
function func($arg){
return defaultFunc($arg)
}
}
0617nobodyさん
2006/02/03(金) 21:05:05ID:qY0QLJ3A0618615
2006/02/03(金) 21:39:09ID:???undefind function、ってそういうことだったんですね・・・。
コンストラクタが呼び出された時点で、関数が作成されていないのかと思ってました。
ありがとうございます!
0619nobodyさん
2006/02/04(土) 03:00:52ID:HNAkLjne0620nobodyさん
2006/02/04(土) 04:19:53ID:???0621nobodyさん
2006/02/04(土) 06:09:58ID:???全角スペースを除去する方法ありますか?
0622nobodyさん
2006/02/04(土) 06:23:04ID:???0623622
2006/02/04(土) 06:29:45ID:???解答thxです。
確かにその方法ありますよね。
実は数千件のデータ処理に使ってるのですが、
正規表現だと重いので避けたいのです。
なので関数の方が好ましいのですが・・・。
#貧弱開発環境('A`)マンクルポ
0626nobodyさん
2006/02/04(土) 11:22:51ID:???--enable-zend-multibyte Compile with zend multibyte support.
この二つのオプションの違いを教えてください。
0627nobodyさん
2006/02/04(土) 11:51:05ID:???簡単に言えば
--enable-mbstring マルチバイト関数を有効にする
--enable-zend-multibyte 通常はスクリプトの記述として使えないSJISを使用可にする
0629nobodyさん
2006/02/04(土) 16:35:43ID:+uM4bJSpテキストファイルに数行のデータを書き込みます。
その時に
キーワード<>データ1<>データ2<>....
というようなフォーマットで書き込んでいきます。
この時に、テキストファイルからキーワードを検索し、
そのキーワードを含む行を取ってくるようにするには
どうしたらよいでしょうか。
0630nobodyさん
2006/02/04(土) 16:51:04ID:???0631nobodyさん
2006/02/04(土) 17:02:28ID:???1.1行取り込む。
2.取り込んだ行の最初の<>までのデータをキーワードとして取得する。
(キーワードには<>が含まれていないこと)
3.取得したキーワードと検索キーワードを比較する
4.比較の結果マッチすれば、その行を保持する
5.ファイルの終わりまで1〜4までを繰り返す。
これを>>630の言うようにマニュアルの文字列関数等で
使えそうなものがないか確認しつつ実装する。
0632nobodyさん
2006/02/04(土) 17:47:40ID:+uM4bJSpありがとうございます。やってみます。
0633nobodyさん
2006/02/04(土) 21:10:03ID:???0634nobodyさん
2006/02/04(土) 22:10:43ID:f7yaA8i8<head>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; CHARSET=Shift_JIS">
</head>
<body>
<?
$str = "%82Q%82%83%82%88%82%c5%82%b7%81B";
echo rawurldecode($str);
?>
</body>
で表示すると”2chです”としっかり表示されますが
<head>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; CHARSET=UTF-8">
</head>
<body>
<?
$str = "%82Q%82%83%82%88%82%c5%82%b7%81B";
echo rawurldecode($str);
?>
</body>
ではUTF-8なのでしっかりと表示できません。
そこでエンコードされた値を調べUTF-8でエンコードされたのか、またはShift_JIS、EUCなのかなどを判断しUTF-8ならデコードしそのまま表示。そのほかの場合は一度デコードしUTF-8型に戻してやりしっかり表示させるにはどうしたらいいのでしょうか?
0635nobodyさん
2006/02/04(土) 22:53:17ID:???それ、decodeとか関係なく普通に文字コード処理の基本の話だから。
mb_convert系のマニュアルを頭から読み直すとよろしい。
0637nobodyさん
2006/02/05(日) 00:55:08ID:???0638nobodyさん
2006/02/05(日) 01:27:19ID:???0639nobodyさん
2006/02/05(日) 01:32:18ID:???TABでなく「<>」を使うってのはどういう意図?
0640nobodyさん
2006/02/05(日) 01:40:57ID:???「<」だけでも本来なら良いはず。
0641nobodyさん
2006/02/05(日) 01:58:56ID:???で、世間一般で区切り文字として標準的なのは「,」かTABだろ。
何故そこであえて「<>」を採用するのか?ってことだよ。
1人や2人なら、まぁそういう人もいるよね、好き好きだしね、で済むけど
わざわざ他人の真似をしてまで採用するようなもんじゃないと思うんだが。
0642nobodyさん
2006/02/05(日) 02:03:33ID:???どうしたらいいですか?
0643nobodyさん
2006/02/05(日) 02:09:19ID:uUJqicme中略
fputs($fp,$footer);
として、投稿日時、コメント用ページへのフッターを貼り付けたいのですが、
「Posted comment()」 となってしまって時間が表示されません
回避方法はありますでしょうか・・・・・
0645nobodyさん
2006/02/05(日) 02:22:43ID:???まあ考えられるのは$postedや$dateに値が入ってないってことくらいだろうけど。
print_rやvar_dumpを$footer = ・・・の直前でやってみたりしてごらん。
未定義か空文字かnullかfalseかその辺だろうから。
原因がわかったら$postedや$dateに値を代入している部分周りのロジックを入念にチェック。
0647nobodyさん
2006/02/05(日) 02:28:36ID:uUJqicme$footerを2分割して後でまとめて表示することでできました。
ありがとうございました
0648nobodyさん
2006/02/05(日) 02:58:11ID:uUJqicme�@〜〜〜
?>
<HTML本文>
<?php
�A〜〜〜
?>
のように間にHTMLの本文を挟んで離れた<?php〜?>間で変数の受け渡しって可能なんですか?
■ このスレッドは過去ログ倉庫に格納されています