【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辺り
0477nobodyさん
2006/01/26(木) 17:49:20ID:???・wikiを使いたい→wikiスレ
・レンタル鯖に設置したいけど方法が分からない→レンタル鯖板
・PHPのインストール方法が分からない→分からない点を書きアドバイスを求める (質問の内容によっては 自宅サーバ板)
PHPのインストールってのが何を指すのかよく分からない。
まぁ、wikiを設置したいけどやり方が分からないんだとエスパー
って事でこの板のwikiスレに行って、設置先の名前、設置するwikiの名前、それと分からないポイントを書けば誰か教えてくれるかもよ
0478472
2006/01/26(木) 17:50:14ID:ZWELklYbマジサンクス。マジ俺アホス。一発で解決しました。50円あげるお^^
つ �I�I�I�I
0480nobodyさん
2006/01/26(木) 18:11:44ID:???名前[ ]
内容[ ]
【プレビュー】【送信】
という表示だとして、プレビューのボタンを押した時に別ウィンドウが開いて
入力した内容が確認できる。
送信のボタンを押すとそのまま送信できる。
というのを考えているのですが、プレビューも送信もどちらもsubmitボタンとした場合、
formのaction先には1つのファイルしか指定できないわけで、どうすればいいか
迷っています。(プレビューと送信完了のページは別ファイル)
説明が下手ですみませんが、何かアドバイスをいただければと思います。
0484480
2006/01/26(木) 19:01:55ID:???その「Submitの名前」というのは、例えば以下のような事ですか?
<form action="test.php" method="POST">
ソース
<input type="submit" name="preview" value="プレビュー">
<input type="submit" name="entry"value="送信">
で、test.phpでifでsubmitからのnameを判別して
プレビュー用ならpreview.phpをincludeして、送信用ならentry.phpをinculdeするような。
>>482
確認はプレビューでするので、実際は登録されていない事になります。
0485nobodyさん
2006/01/26(木) 20:09:10ID:???オレだったら、hiddenだらけの別formを用意して、
プレビューはjavascriptで上記フォームを介して行い、
送信は普通にsubmitするかな。
もちろん、javascript offの環境ではプレビューできないけどw
0487nobodyさん
2006/01/26(木) 22:50:15ID:XYYPwXMirand(0,50);
で0以上50以下が出力されるのはわかったのですが
srand(初期値);
のsrandの使い方がいまいちわかりません。
0から50までの乱数を出す場合はsrandの初期値はどのように
設定すればいいのでしょうか?
0488nobodyさん
2006/01/26(木) 23:07:36ID:???とりあえずわかったのが、UserAgentで携帯端末情報を読み取るまではわかったが、それから先が一向に進まぬ
教えて下さい。大先生方!!
0489nobodyさん
2006/01/26(木) 23:39:02ID:???http://www.php.net/srand
> 注意: PHP 4.2.0 以降、 srand() または mt_srand() によりランダム数生成器にシードを与える必要はありません。これは、この処理が自動的に行われるためです。
つまり4.2.0以降のバージョンではsrandを書かなくていい。
ちなみに以前のバージョンでsrandを書く場合引数にはtime()などのランダムになりやすい値を与える。
つーかsrand(time())にするべし。
>>488
そこまでわかったのにどうして先に進めないのさ?
ifとかswitchとかincludeとかファイル入出力とかDBとか適当に組み合わせるだけだよ。
0490nobodyさん
2006/01/27(金) 02:21:59ID:???0493nobodyさん
2006/01/27(金) 14:07:06ID:lsupN3afついでにPHPも改造してください。
0494nobodyさん
2006/01/27(金) 17:14:49ID:zienXgmO$test = 'hoo';
echo $test['bar'];
で「h」が出力されるようになったのですが、
($test['bar'] が $test[0] と評価されている?)
こういう仕様に変わったんでしょうか?
0495nobodyさん
2006/01/27(金) 17:40:06ID:???PHP4.0.1辺りから色々試したけど同じように「h」が出力されたぞ。
「存在しない添字は0として評価される」なんて公式な仕様はないと思うので、
仕様ではないと思うけど。
0496nobodyさん
2006/01/27(金) 17:55:11ID:???連想配列に添字でアクセスしようとしてるんじゃなくて、オフセットを指定して
文字列にアクセスしようとしてて、string "bar" が int 0 にキャストされてるだけ。
0497nobodyさん
2006/01/27(金) 18:52:21ID:???php 4、MySQL、PostgreSQL 対応で。
0498nobodyさん
2006/01/27(金) 19:15:36ID:???存在しない添え字っつーか、それは文字列型への桁位置アクセスだからな。
配列とは違って数値しかありえない。よって[0]扱いが正しいと思われ。
0499nobodyさん
2006/01/27(金) 19:18:59ID:???できれば $hoge{0} と書いた方がいい。
0501nobodyさん
2006/01/27(金) 21:51:27ID:???http://www.php.net/manual/ja/language.types.string.php
文字列への文字単位のアクセスと修正
http://www.zend.com/engine2/ZendEngine-2.0.pdf
String offset syntax
0503nobodyさん
2006/01/28(土) 03:53:00ID:vNPPStC0どのくらいユニークなのかな?
ミリ秒を種にしているとのことだけど
無限にユニークであり続けることなんて不可能だし。
UNIXタイムの限界くらいまでユニーク?
0504nobodyさん
2006/01/28(土) 05:24:49ID:???uniqidは現在時刻をマイクロ秒単位(マニュアルにはミリ秒って書いてあるけど)でそのまま16進表記しただけなので、2038年(だったっけ?)のいつだかまでの間に1マイクロ秒のズレもなく同時にuniqidを呼び出さない限りは確実にユニーク。
echo uniqid(), "\n", uniqid();ってやっても多分ちょっとはズレる。
ちなみにUNIXタイムスタンプの最大値0x7FFFFFFF(約20億)に100万を掛けた数の膨大なuniqidが存在し得る。
以下はソースのext/standard/uniqid.cから一部抜粋
> /* The max value usec can have is 0xF423F, so we use only five hex
> * digits for usecs.
> */
> if (more_entropy) {
> spprintf(&uniqid, 0, "%s%08x%05x%.8f", prefix, sec, usec, php_combined_lcg(TSRMLS_C) * 10);
> } else {
> spprintf(&uniqid, 0, "%s%08x%05x", prefix, sec, usec);
> }
spprintfっていったい何だ?w
0506nobodyさん
2006/01/28(土) 12:17:41ID:???0507nobodyさん
2006/01/29(日) 02:15:45ID:???0508nobodyさん
2006/01/29(日) 04:31:28ID:???0509nobodyさん
2006/01/29(日) 10:01:30ID:???0510nobodyさん
2006/01/29(日) 15:22:58ID:mSKJalfC例>>
Aaa
The bbb
Ccc
これが思いつきそうで思いつかない……orz
0511nobodyさん
2006/01/29(日) 15:31:15ID:???ス レ 違 い
0512nobodyさん
2006/01/29(日) 15:33:53ID:???0513510
2006/01/29(日) 15:43:09ID:mSKJalfCこれってDBの話なの?
DBからは素直にとってきて、配列にして、PHP側でさあどうソートするかって話だと思ったんですが……。
0514nobodyさん
2006/01/29(日) 16:30:19ID:???>これってDBの話なの?
「DBに格納したデータを」って書いてるじゃないか。
文面通りに解釈すると「DBに格納したデータを特殊な条件付でソートし結果を受け取りたい」と読める。
だから、「どこがPHPの質問なの?」と突っ込まれたわけよ。
まぁ、usort でも使ってユーザ関数でソートしたら?
0516nobodyさん
2006/01/29(日) 16:49:08ID:???0518nobodyさん
2006/01/29(日) 23:54:56ID:???どういった方法があるでしょうか?
0520518
2006/01/30(月) 00:12:30ID:???1を2にするのは簡単ですが、
01を02にするのはかなり面倒そうですので。
0522nobodyさん
2006/01/30(月) 00:17:49ID:???計算自体は桁考えずに行って、最後に表示するときだけ
printf("%03d", $cnt); と3桁化すりゃいーよ。
0523518
2006/01/30(月) 00:27:03ID:???0524nobodyさん
NGNG自分で「短い文字でもちゃんとSJIS→JISに変換できるように!!」
と入れた処理なんですが、後から見て何をやっているか
わからなくなってしまいました。
/* 文字数が少ないとエンコードに失敗するんだとさ。*/
$message = "あいうえお眉幅ABC".$message;
$body = mb_convert_encoding( $message , "JIS", "EUC-JP,UTF-8,SJIS,ASCII,JIS");
$body = substr ( $body , 3 + 14 + 3 + 3 );
�@なぜ「"あいうえお眉幅"」ではなくて「"あいうえお眉幅ABC"」なのか
�A最後の「3 + 14 + 3 + 3」の詳細
解読できる人がいたら助けてください。。。。
0525nobodyさん
2006/01/30(月) 01:57:49ID:???0526nobodyさん
NGNGありがとう。
0527nobodyさん
2006/01/30(月) 09:39:33ID:JutOeLmXnullを渡せたらまだよかったんだけど。
もしくはデフォルト引数にnewを書けたらまだよかったかも。
タイプヒンティングせずに関数内でinstanceofしか方法はないかな?
よりよい型の制限方法あったら教えてください。
0529nobodyさん
2006/01/30(月) 18:52:22ID:???何かご存じの方、ご教授願います。
・実メモリ 128Mbytes
・DLファイル 1Gbytes
・直アクセスはしない
・DLダイアログは直ぐに出る
・https経由
DL部分のコードは下記の通りです。
ob_start(),ob_end_flush();を組み合わせても×でした。
$fp=fopen($FNAME,"rb");
while(!feof($fp)){
echo fread($fp,4096);
flush();
}
環境
apache 1.3.33
php4-4.4.1_1
0530529
2006/01/30(月) 19:28:04ID:???これから切り分けて、後で報告します。 お騒がせしました。
test.php
<?
$file="test.zip";
header("Content-Type: application/octet-stream;");
header("Content-Disposition: attachment; filename=$file");
ob_end_flush();
readfile("data/$file");
?>
0531nobodyさん
2006/01/30(月) 20:56:32ID:EJ05v1/FPOSTでwavのバイナリデータが飛ばされてくるシステムでデータを保存するのに
pack関数を使用して保存すれば良いのでは?という所まではたどり着いたのですが
どのように使用するのかがマニュアルを見たのですが今ひとつ分かりませんでした
どなたか使い方分かる方教えていただけませんか?
$data = urldecode($_POST['wavdata']);
$fp = @fopen("./data.wav","wb");
fwrite($fp, pack("[この部分がわかりません]",$data));
fclose($fp);
0532nobodyさん
2006/01/30(月) 21:31:50ID:???その前に何でそのシステムがRFC1867に基づく
ファイルアップロードを行わない(させない)のか教えてくれる?
Webブラウザ以外の特殊(といっていいのかな)なクライアントでも対応してる
場合が多いと思うけど。PHPでもアップロードのクラスがPEARにあるよ。
0533nobodyさん
2006/01/30(月) 21:46:56ID:/1xdn91h○ご教示
0534531
2006/01/30(月) 21:47:09ID:???私もシステム開発元になぜRFC1867に基づくファイルアップロード
を使用できないのか聞いたのですが、
開発元で作成したデータ保存後にFTPで送信するCGIを使用するか
もしくは自分で何とか出来るならしてください
の一点張りで結局教えてくれませんでした。
現在はつなぎとして開発元が提供しているFTPのCGIを使用していますが
とにかく遅いので自前で何とかしようと今回の書き込みとなりました。
0535nobodyさん
2006/01/30(月) 22:12:12ID:???それを読んだ限りだと、開発元が作成したのはデータ保存後FTPで送信する物であり、POSTでバイナリを送りつける妙な仕様の物ではない
つまり、その妙な物を作ったのは貴方だと受け取れるが、そうなのか?
仮にそうなら、そんな妙な仕様の物を作るのはやめて、RFC1867に基づくファイルアップロードをやってくれる物を使うべきだ
まぁ・・そもそも、遅いのはFTPするCGIが原因なのか?とか作って時間の無駄だったと気付きそうな香りが・・・。
0536nobodyさん
2006/01/30(月) 22:13:31ID:???それを標準出力(=POST)で送ってくる、とかの類じゃないの?
で、巷のお絵描き掲示板でそういう処理は実際にやってるから
ソース見てみたら参考になると思う。
参) PHP製のお絵描き掲示板 >ttp://www.punyu.net/
0537nobodyさん
2006/01/30(月) 22:16:36ID:???生のバイナリデータがそのまま送信されてくるので、
urldecodeだのpackだのは要らないです。
ヘッダで指定されたサイズで受信してそのまま保存。
なので、全然違う仕様の可能性も高いけど、それ以外に
そんな変な仕様になる理由が思いつかなかったので。
0538531
2006/01/30(月) 22:22:57ID:???開発元がPOSTでバイナリデータを送っいるといっていますので
こちらでわざわざ妙なつくりにしたということはありえません。
FTPが遅いのは流れから言っても確実です
FTPを使用した場合
CGIにデータ渡す>データをエンコード後保存>FTP接続しこちらのサーバーへ>ファイル公開
FTP使用しなかった場合
データをエンコード後保存>ファイル公開
0540452
2006/01/31(火) 00:20:15ID:+LWq5c8/>>457
亀ですんません。
[:XXXX:]は[:はーと:]と言ったように、
ひらがなで統一しようと思ってました。
でも、英数字でも問題ないです。
preg_replaceだと1個しか置換できないのかと考え、
preg_match_allで、[::]内のひらがなを抜き出し、
ループで回して該当する画像を表示させようと思ってたのですが、
>>456さんのやり方の方がいいのでしょうか。
正規表現がよくわからなくて、
調べてはみたものの、
ちぐはぐな返答かもしれません。
ごめんなさい。
---------------------------------------------------------
$text = 今日は天気[:hare:]がいい!明日は雨[:ame:]らしい。
---------------------------------------------------------
$textを表示させるときに、[:hare:]=太陽の画像、[:ame:]=傘の画像を
表示させたいのです…
0541531
2006/01/31(火) 00:50:36ID:???完全なテスト環境が家に無いので確実とはいえませんが
教えていただいたもので何とかなりそうです
みなさんありがとうございました
0542nobodyさん
2006/01/31(火) 01:21:23ID:???なんとなく、こんな感じかな?
ってか、正規表現くらい勉強しろ。”調べる”のではなく、”勉強”だ。
あと、
> preg_replaceだと1個しか置換できないのかと考え、
”考え”ではなく、試せ。せっかく >>456 が良い回答しているのに・・・。
以下、動作未確認スクリプト。
//
$text = "今日は天気[:hare:]がいい!明日は雨[:ame:]らしい。";
$text = preg_replace('/\[:(\w+?):\]/e', 'emoji($1)', $text);
function emoji($code) {
// 以下、DBに接続できていると仮定
$imageFileName = "";
$result = mysql_query("SELECT imageFileName FROM table_name WHERE emojiCode = '{$code}'");
if (mysql_num_rows($result)) {
$imageFileName = "<img src=\"".mysql_result($result , 0)."\">";
}
return $imageFileName;
}
0543nobodyさん
2006/01/31(火) 01:41:28ID:kuYyOVO4fopenとかじゃ無理だよね。
自前でサーバーにつないでhttpリクエスト書かなきゃダメ?
もしくはそういうステキなラッパーがあれば・・・
0544nobodyさん
2006/01/31(火) 01:44:59ID:???ちょっと調べてみたけど、sjisかeucだったら2バイト目にコロンと同じコード(3A)が来る文字はないから>>542の正規表現を'/\[:(.+?):\]/e'にすれば問題なくマルチバイト混在可能になるはず。
ただUTF-8の場合は2バイト目以降全てのコードがありえるらしいから : の直後に ] があると意図しない結果になるかも。
JISは終端エスケープが完全なら問題なし。
0545nobodyさん
2006/01/31(火) 01:50:48ID:b+k1eFbTできません。プログラムは以下のようにやっています。
<?php $n; $i; function fib($n){if($n==1){return 1;}else if($n==0){
return 0;}else{return fib($n-1)+fib($n-2);}}
for($i=0;$i<=20;$i++){print("fib($i)");} ?>
そして結果が、
fib(0) fib(1) fib(2)・・・fib(20)
のようになってしまい、ちゃんとした値がでません。
計算の仕方自体は間違っていないと思うのですが、functionのあたりが間違って
いるような気がしないでもありません。
echoや&をつけたりといろいろしているのですがうまくいきません。
何が違うのか、どうすればいいのかを、どうか教えて下さい。お願い致します。
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);
↑みたいにしたいのですが・・・。
よろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています