トップページ⇒php
1001コメント311KB

【php】part29【php】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/07/06(水) 09:57:54ID:0DucnAyH
・PHP全般の質問スレです。
・新規質問の方は上げてください。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-10辺り

前スレでは、尾張の方でお世話になりました。
原因は唯のファイル名間違いでした。ダッセー俺OTZ

0367nobodyさん2005/09/06(火) 12:05:44ID:???
>>366
画像1枚でそのサイズなの?
0368nobodyさん2005/09/06(火) 12:27:13ID:???
>>366
画像のピクセル数で制限したら
0369nobodyさん2005/09/06(火) 13:29:18ID:???
しかしメモリを最大で8メガしか使わせてくれないなんて酷だな。
巷のレンサバとかはそれくらいが相場なの?
0370nobodyさん2005/09/06(火) 13:41:19ID:???
php.iniのデフォが8Mだったと思う。
VPSや専鯖なら自由に設定できるが。
0371nobodyさん2005/09/06(火) 13:45:37ID:???
>>369
XREAは50Mある
0372nobodyさん2005/09/06(火) 14:11:39ID:???
get_memory_usageだったっけか
0373nobodyさん2005/09/06(火) 14:46:03ID:???
>>372
memory_get_usageは残りの使えるメモリだから今からimagecreate*で確保するメモリ量はわからんだろ
0374nobodyさん2005/09/06(火) 14:52:11ID:???
そこはphpのソース見て構造体のサイズ計算するしかなかろう
パディング入るから運用する鯖で確認しないとダメだが
0375nobodyさん2005/09/06(火) 16:04:52ID:???
GDでimagecreatetruecolor()とかするなら、少なくとも width*height*24/8 バイトは必要だね。
適当にテストしてみたところ、それよりだいぶ多く食うみたい。
サムネイルの分はせいぜい数百KBしか使わないだろうけど、オリジナルがでかいと厳しい。
(可能なら)外部コマンドでImageMagick使った方が幸せになれるかも。

php -r '$memB = memory_get_usage();
quote> $im = imagecreatetruecolor(640, 480);
quote> $memA = memory_get_usage();
quote> $val = array_map("number_format", array($memB, $memA, $memA - $memB, 640*480*24/8));
quote> var_dump($val);'
array(4) {
[0]=>
string(6) "39,640"
[1]=>
string(9) "1,586,976"
[2]=>
string(9) "1,547,336"
[3]=>
string(7) "921,600"
}
0376nobodyさん2005/09/06(火) 16:38:56ID:???
>>375
それってなんかメソッドも含んだサイズになってるんじゃ?
オブジェクト2つ作って変化調べてみ?
0377nobodyさん2005/09/06(火) 16:40:10ID:???
>>375
1pixelあたり5バイトだね
imagecreate()だと1pixelあたり2バイトだった
0378nobodyさん2005/09/06(火) 20:25:38ID:???
>>371
CGI版とmod版、さらに鯖番号によっては8MBだったり40MBだったり。
0379nobodyさん2005/09/06(火) 23:08:08ID:???
何個かわからないものをバインドする方法ご存知でしょうか?

$db = DB::connect( DSN );
$sql = "select * from table where id in ( ?, ?, ?, ?, ? )"
$db->getAll( $sql, array( 1, 2, 3, 4, 5 ) );
※PEAR使ってます

ここで、
array( 1, 2, 3, 4, 5 )
の要素が場合によって増減するときが悩みどころです…
0380nobodyさん2005/09/06(火) 23:17:40ID:???
>>379
prepareするんじゃないならimplodeで連結して突っ込めばいいじゃん
0381nobodyさん2005/09/07(水) 00:49:02ID:4ftygnTr
おまいらプロだろ
0382nobodyさん2005/09/07(水) 07:02:12ID:???
perlでtime().$$みたいなユニーク値ってphpではどうすれば作れるのでしょうか?
0383nobodyさん2005/09/07(水) 07:09:01ID:???
>>382
uniqid('');
0384nobodyさん2005/09/07(水) 07:09:01ID:???
>>382
uniqid('');
0385nobodyさん2005/09/07(水) 08:46:06ID:???
すごい。
1秒以内だ。
0386383-3842005/09/07(水) 09:04:35ID:???
いや、単に送信ボタンをダブルクリックしてしまっただけだ。
スマソ。
0387nobodyさん2005/09/07(水) 09:08:35ID:???
       ヽ(・ω・)/   ズコー
      \(\ ノ
0388nobodyさん2005/09/07(水) 10:34:37ID:???
>>383-387
ワロタwww
03893792005/09/07(水) 17:39:08ID:???
>>380

即レス有難うございます。
implodeした文字列を一つの ? にぶちこんでもいけるんですね。
チャレンジしてみます。


連投すいません。
別件で一つ疑問が出てきました。

PEARのマニュアルページ
ttp://pear.php.net/manual/ja/package.database.db.db-common.getall.php
で、

$data =& $db->getAll('SELECT cf, nf, df FROM foo');
if (PEAR::isError($data)) {
die($data->getMessage());
}

とあるんですが、
一行目の =& は何の意味があるのでしょうか?
普通に = で解説してるサイトもあるようですが…
0390nobodyさん2005/09/07(水) 18:18:37ID:Zs1gbbuG
RSSから情報を取得してその情報で2chにスレ立てるようにしたいんですがどうやればいいでしょうか?
0391nobodyさん2005/09/07(水) 18:38:07ID:???
ちょwwwおまwwwwそんな安易にスレたてるなんてwwwww
0392nobodyさん2005/09/07(水) 18:39:16ID:???
>>389
ttp://www.php.net/manual/ja/language.references.php

>>390
ttp://pc8.2ch.net/test/read.cgi/php/1102980903/
0393nobodyさん2005/09/07(水) 22:38:46ID:QGlSv/RF
>>390
ひろゆき乙
最近人が減って、スレ立て自演しないといけなくなったんだろ?
0394nobodyさん2005/09/07(水) 23:14:28ID:???
ZENDがやってるPHPの資格持ってる人いますか??
試験受けようとおもってるんですが。。
03953822005/09/07(水) 23:36:06ID:???
>>383-334
ありがとうございましたm(_ _"m)ペコリ
0396nobodyさん2005/09/09(金) 21:44:22ID:???
5.0.5で配列関数に変な変更入ったんだが対応せんといかんもんかね?
0397nobodyさん2005/09/09(金) 21:59:42ID:???
>>396
array_shift(file("hoge.txt")) とか、リファレンスの挙動を厳密にした影響受けてる奴でしょ?
修正必須。
0398nobodyさん2005/09/09(金) 22:10:16ID:???
>>397
それそれ。
4系列も同じ流れになるなら良いんだが、なんか突出してる気がしてなぁ。
0399nobodyさん2005/09/09(金) 22:16:39ID:???
配列関数に限った話じゃないよん
0400nobodyさん2005/09/09(金) 22:23:48ID:???
4.4.0でも同様の修正入ってますよん
0401nobodyさん2005/09/09(金) 22:27:21ID:???
>>339
うん。force_refで定義された引数持ってる関数が全部影響ある。
単に、戻り値だけ欲しくてこの手の関数呼ぶケースが配列関数に多いだけ。

>>400
あれー?うちだと問題無いんだけど。もいちど落としてくるか・・。
0402nobodyさん2005/09/09(金) 22:30:14ID:???
5.0.x系列の存在をすっかり忘れていた
0403nobodyさん2005/09/10(土) 01:18:51ID:???
4.4.0入れ直して試したけどerrorもnoticeもwarningもでまへん。
どうなっとんじゃこりゃ?
0404nobodyさん2005/09/10(土) 02:06:13ID:???
窓から投げ捨てろ
0405nobodyさん2005/09/10(土) 10:46:05ID:???
javascriptと連携して画面の解像度を記録するにはどの湯にしたらよいのでしょうか
0406nobodyさん2005/09/10(土) 10:47:18ID:???
う〜ん、どの湯かなぁ・・・
0407nobodyさん2005/09/10(土) 10:54:15ID:???
ファイルの行数を簡単に取得する関数か何かありませんか?
0408nobodyさん2005/09/10(土) 10:56:33ID:???
>>407
count(file("filename"));
ファイルがバカデカイならfgetcで一文字ずつ読んで改行の個数数える。
0409nobodyさん2005/09/10(土) 11:20:46ID:???
flock($fp, LOCK_EX);
はfcloseすると自動的に解除されますが、
flock($fp, LOCK_UN);
をしてからfcloseをした方がよいのでしょうか?それともいきなりfcloseしても何ら問題はないのでしょうか?
0410nobodyさん2005/09/10(土) 12:22:04ID:???
問題ない






と言われたらそのまま信じるのか?
flockみたいなクリティカルな処理は自分で十分調べるしかないよ
0411nobodyさん2005/09/10(土) 13:01:44ID:???
PHP Fatal error:  Call to undefined function mb_encode_mimeheader()
というエラーが出るのですが、undefinedというのはどういうことなのでしょうか?
呼び出す前になにか必要なのでしょうか?
0412nobodyさん2005/09/10(土) 13:50:50ID:???
mbstringモジュールが有効になっていないんじゃないの?
04134112005/09/10(土) 15:00:08ID:???
php -iで見た限りは
--enable-mbstring=shared
となっているので、有効になっていると思うのですが
0414nobodyさん2005/09/10(土) 15:46:37ID:???
>>413
それは静的に組み込んでることを意味する訳ではないので。
何らかのパッケージでPHPをインストールしたのなら、
php-mbstringとか別のパッケージが存在しないか?
04154112005/09/10(土) 16:40:39ID:???
fedora core4なのですが、
yum search php-mb
でみてみると
php-mbstring.i386      5.0.4-10.4     installed
となっているのですが、エラーは依然出てしまいます
0416名無しさん@そうだ選挙に行こう2005/09/10(土) 18:30:09ID:???
>>415
だからsoはあるけど実行時にロードされてないんじゃないのって
0417名無しさん@そうだ選挙に行こう2005/09/10(土) 18:58:03ID:???
レッド法度のrpmは相変わらずのようだな
0418名無しさん@そうだ選挙に行こう2005/09/10(土) 20:34:47ID:???
「有効になっていると思う」じゃなくて、本当に有効になっているかphpinfo()あたりで確認すべきでは
0419名無しさん@そうだ選挙に行こう2005/09/10(土) 21:23:19ID:???
ヒント:/etc/php.d/
0420名無しさん@そうだ選挙に行こう2005/09/10(土) 22:33:50ID:???
auでファイルまでのパスを非公開にしたいため
http://ns1.php.gr.jp/pipermail/php-users/2005-January/024792.html
を参考にして以下のようにスクリプトを書きました。
$file = $_GET["file"];
$range = $_SERVER["HTTP_RANGE"];
if(preg_match("/^bytes=(\d+)\-(\d+)$/", $range, $arr)){
$offset = $arr[1];
$end = $arr[2];
$len = $end-$offset+1;
}
//ヘッダー
header("HTTP/1.1 206 Partial Content").
header("Last-Modified: ".date("D, j M Y G:i:s \\G\\M\\T", filemtime($file))).
header("Accept-Ranges: bytes").
header(sprintf("Content-Range: bytes %d-%d/%d",$offset, $end, filesize($file))).
header(sprintf("Content-Length: %d", $len)).
header("Content-Type: audio/3gpp2");
//読み込む
@readfile($file);
しかし実際にファイルのDLを行ってみると端末側でエラー表示がされます。
実際にそのリンク先のメーリングリストではreadfileまで行っているかが不明ですので
readfileが原因なのでしょうか?分かる方よろしくお願いします。
0421名無しさん@そうだ選挙に行こう2005/09/10(土) 22:41:56ID:EeO+nR6C
>端末側でエラー表示がされます。
俺らはエスパーではない
0422名無しさん@そうだ選挙に行こう2005/09/10(土) 22:52:47ID:???
>>420
まず、変な小細工なしに、普通にダウンロードをさせることは出来ているんだろうか?
auの場合、単純な<a>タグのリンクではムービーファイルは落とせないよ。
04234202005/09/10(土) 23:52:18ID:???
>>421
分かりにくい説明で申し訳ございません。
端末側でダウンロードしますか?と聞かれた後「はい」を選択すると
ダウンロードデータが正しくありませんと表示されます。

>>422
熟知しております。
<object data="hoge.php?file=test.3g2" type="audio/3gpp2">
のように使用しようかと考えております。

HTTP_RANGEの仕様がいまいち分かっていないため、スクリプト側の処理が分かっていない部分もあります。。
04244202005/09/10(土) 23:54:21ID:???
>>422
普通にファイルまでのパスを記述すればDL可能でした。
0425名無しさん@そうだ選挙に行こう2005/09/11(日) 18:28:24ID:???
>>420
HTMLでobject要素内のparam要素でsize指定してやらないと、
ファイルサイズを取得するためにHTTPリクエストをHEADメソッドで送ってくる。
これに対してHTTPレスポンスヘッダでファイルサイズをContent-Lengthにセットして返せばいいわけだが、
HEADメソッドでContent-Lengthを設定できないPHPの罠があるっぽい。
だから、最初にobject要素を表示する段階でsizeを指定してやるのが手っ取り早い。
04264202005/09/11(日) 20:55:18ID:???
>>425
objectの際に送ってくるデータをgetallheadersで取ろうとしたんですがArrary
になってしまったので分かりませんでした。助言ありがとうございます。

今現在このようになっています(まだエラーは出ます)。
au端末をお持ちの方、アドバイスよろしくお願いします。
http://nullpo.t35.com/file.phps
0427名無しさん@そうだ選挙に行こう2005/09/11(日) 21:04:40ID:Gpc71woo
httpsをサポートしたデッドリンクチェックプログラムって、phpでは難しいでしょうか?
0428名無しさん@そうだ選挙に行こう2005/09/11(日) 21:47:56ID:???
>>427
んにゃ。httpで既に出来てるならOpenSSLサポートが
有効になったPHPを利用すれば殆ど変更はいらない。
0429名無しさん@そうだ選挙に行こう2005/09/11(日) 21:58:15ID:???
>>426
臭い事やっていないで、
header("Content-Type: audio/3gpp2");
@readfile($file);
だけでやってみそ。

04304202005/09/11(日) 22:06:19ID:???
>>429
臭い云々ではなく端末の仕様上それでやった場合は無理なんです。
0431名無しさん@そうだ選挙に行こう2005/09/11(日) 22:11:53ID:???
> readfileが原因なのでしょうか?

パケット拾ってみれば判る

> header(sprintf("Content-Length: %d", $len)).
> @readfile($file);

めちゃくちゃすんな
0432名無しさん@そうだ選挙に行こう2005/09/11(日) 22:13:17ID:???
>>426
PEARのHTTP_Downloadを使うと楽かな
0433名無しさん@そうだ選挙に行こう2005/09/11(日) 22:13:57ID:PQjWelba
終わったな。
0434nobodyさん2005/09/12(月) 00:16:31ID:???
header(Location)
でページは飛ぶんだけど、ブラウザのURLが変わらない場合って
何かなかったけ?
0435nobodyさん2005/09/12(月) 00:17:42ID:???
ゲイツに聞いてこい
0436nobodyさん2005/09/12(月) 00:25:51ID:???
if(ゲイツ.PHP書ける && ゲイツ.隣){
   ゲイツ.ASK();
}
0437nobodyさん2005/09/12(月) 01:28:19ID:???
ゲイツ.answer()

だろ
0438nobodyさん2005/09/12(月) 02:30:20ID:???
>>436-437
PHPだと文字列の連結になってしまうが
04394322005/09/12(月) 02:50:05ID:???
ステータスコード弄ったりしても変化ないし、もう駄目誰か説明して。
$limit以上の連続アクセスでリダイレクト(jmp_Error)させたいんだけど
このまま攻撃するとエラーに飛ぶけどURL変わらず
★☆★の位置に移動させると勿論、問答無用で飛ぶけど
ちゃんとブラウザのアドレスがerror.phpに変わるわけです。
って事は明らかにif文・・・

function jmp_Error($code, $msg){
   $msg = urlencode($msg);
   noCache();
   header('Location: '.CFG_URL.'error.php?code='.$code.'&msg='.$msg);
   exit;
}


0440nobodyさん2005/09/12(月) 02:50:39ID:???
function DosDetector($limit){
   ★☆★
    $DB = DB_connect();
    $SQL = "LOCK TABLES `l_dos` WRITE";
    DB_Query($SQL,$DB);
    $SQL = "DELETE FROM `l_dos` WHERE `time` < UNIX_TIMESTAMP()-5";
    DB_Query($SQL,$DB);
    $SQL = "INSERT INTO `l_dos` VALUES(0, '{$_SERVER['REMOTE_ADDR']}', UNIX_TIMESTAMP())";
    DB_Query($SQL,$DB);
    if(mysql_insert_id($DB) >= 65535){
        $SQL = "DELETE FROM `l_dos`";
        DB_Query($SQL,$DB);
        $SQL = "ALTER TABLE `l_dos` AUTO_INCREMENT=0";
        DB_Query($SQL,$DB);
    }else{
        $SQL = "SELECT COUNT(*) AS 'access' FROM `l_dos` WHERE `ip` = '{$_SERVER['REMOTE_ADDR']}'";
        $Result = DB_Query($SQL,$DB);
        $row = mysql_fetch_array($Result);
        mysql_free_result($Result);
    }
    $SQL = "UNLOCK TABLES";
    DB_Query($SQL,$DB);
    DB_Close($DB);

    if($row['access']>=$limit){
        jmp_Error('dos','');
    }
    ★☆★
}
0441nobodyさん2005/09/12(月) 02:56:38ID:???
正直ページ飛ぶからどうでもいいけど凄くむかつく
ちなみにfirefoxだとif文の中でもURL更新されます
もう3時・・・F1見よ
04424322005/09/12(月) 03:03:02ID:???
>>439
人の名をかたってわけのわからんことを言うな。
0443439 4342005/09/12(月) 03:10:42ID:???
>>442
ごめんなさい。タイプミス
0444nobodyさん2005/09/12(月) 03:22:58ID:???
>>439
連続アクセス回避なら素直にdeny追加してはどうかと。
0445nobodyさん2005/09/12(月) 03:23:33ID:???
.htaccess使える場合だけだけどね
0446nobodyさん2005/09/12(月) 03:47:36ID:???
負荷が少ないのはhtaccessなんですよねぇ
でも追加した後削除するタイミングがなんとも
5分くらいでいいんですよ。拒否するのは。

function DosDetectorの前にBan Listを参照する処理があって
その場合だと拒否されてても一応アクセスできて
尚且つ時間が経ってれば解除できるってゆうふうな〜
0447nobodyさん2005/09/12(月) 04:01:01ID:???
厳密にやるならError Documentsをphpにしとく手もあるけど負荷になるから
別のアクセスがあった時にチェックさせるのが良いんでは?
別のアクセスないと永遠に解除されないけどw
0448nobodyさん2005/09/12(月) 04:39:48ID:???
>>447
>>別のアクセスがあった時にチェックさせるのが良いんでは?
深夜とかにBanされたらさえないね・・・w
まぁ過度なリクエストする奴が悪い訳だし。それでいっか。
0449nobodyさん2005/09/13(火) 12:02:04ID:i54bcrDK
phplibはphp5で使えますか?

http://www.sanisoft.com/phplib/manual/
ここ見るとphp4までしか書いてないようで、検索しても情報が見つからなくて。
0450nobodyさん2005/09/13(火) 19:28:48ID:Syde0mgy
phpで動的に吐いているページを、
どこか(プロキシサーバ?)でキャッシュされているようで
一部のユーザから不具合報告があります。
ヘッダで
Cache-control: no-cache
Pragma: no-cache
等吐けばキャッシュされないようですが
動的サイトは一般的にこうするのがデフォルトでしょうか?
あまり書籍等でも見かけないので…。
0451nobodyさん2005/09/14(水) 02:47:04ID:???
デフォルトじゃない
キャッシュを無効にするかどうかは状況に応じて行う
04524502005/09/14(水) 06:54:20ID:???
>>451
なるほど。考えてみればそうですね。
IPを見るとケーブルテレビでした
やはりプロキシサーバを挟んでいるようです。
0453nobodyさん2005/09/14(水) 07:52:09ID:???
Cache-Control: privateのほうがSEO的によさそうな気もする
0454nobodyさん2005/09/14(水) 22:38:17ID:???
そんな糞CATV串は聞いたことがないのだが
0455nobodyさん2005/09/15(木) 22:03:07ID:???
狭い世界に住んでいるのですね
0456nobodyさん2005/09/17(土) 18:10:46ID:KMtzZBBS
Step1.php −>Step2.php −>Step3.php
とStep1の結果を、Step2で処理しsubmitで、Step3へすすんでいます。
----step2.php--- 判定を $hogeでするとして-
 ・・
 if($hoge){
   echo '<form ・・・action="step3.php">';
   ・・・・
   echo "<INPUT type="submit" ・・・
   ・・・・
 }else{
  echo '<form ・・・action="step3.php">';
   ・・・・

Step2内での処理の結果、Step3に飛ばすにはどうすれば良いのでしょうか?
 if($hoge){
   step3.phpへ自動で飛ばす
 }else{
----------------------------
これを
if($hoge){
   require("step3.php"); exit;
 }else{
と、しましたらstep3には飛べましたが
 URL欄が http://www.*****/**/step2.php のままです。
 URL欄も step3.php にしたいのですけど、、、
0457nobodyさん2005/09/17(土) 18:46:50ID:???
そりゃ飛ばしてるんじゃなくて読み込んでるだけ
飛ばしたいならRefreshかLocation
04584562005/09/17(土) 18:58:32ID:???
PHPには、関数かなんかあるのかと思ってました。
>>457さん。
ありがとう
headerでRefreshかLocation を吐き出します。<(_ _)>
0459nobodyさん2005/09/17(土) 22:17:15ID:QWV6xr7F
PHPファイル間のPOSTデータの受け渡しはどうやればいいのでしょうか?
GETなら出来そうなのですが、POSTだと見当が付きません。
http://pc8.2ch.net/test/read.cgi/php/1120611474/5-11 みたいになるとは思いますが
出来たらその後にでも教えて欲しいっす、、
0460nobodyさん2005/09/17(土) 22:27:51ID:???
>>459
真面目にやるならfsockopen()を使ってHTTPを喋る。RFC2616あたり。
手っ取り早くしたいならpearのHTTP_Clientを使う。
04614592005/09/17(土) 22:30:14ID:???
すいません。書き込んだばかりですが半分解決です。
セッションで送って受け取ればいいんですね。

それ以外の方法をご存知の方いましたらよろしくお願いします。
0462nobodyさん2005/09/17(土) 23:41:14ID:???
>>461
それは「PHPファイル間のPOSTデータの受け渡し」ではないので
半分すら解決してない。何らかの解決だと考えてるのなら
もういっぺん>>459を正しく書き直し。
0463nobodyさん2005/09/19(月) 13:44:36ID:???
PHPに構造体というか、レコード型みたいなのはありますか?
0464nobodyさん2005/09/19(月) 13:53:36ID:???
>>463
ない
が、連想配列でカバーできる
0465nobodyさん2005/09/19(月) 15:01:38ID:???
>>464
なるほど。連想配列ってそういう用途だったんだ。
ありがトン
0466nobodyさん2005/09/20(火) 10:22:16ID:Lq8tYe3w
Vine Linux3.2上でphp5.0.5をビルド中に以下のエラーが発生するのだが

#./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pgsql
...
(略)
...
Configuring extensions
checking whether to enable LIBXML support... yes
checking libxml2 install dir... no
checking whether libxml build works... no
configure: error: build test failed. Please check the config.log for details.

libxml2が古いのかとおもってapt-getしたけど最新版だし..

おしえてエロい(ry
■ このスレッドは過去ログ倉庫に格納されています