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

【PHP】質問スレッドpart34【php】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/03/21(火) 10:19:14ID:???
PHP全般の質問スレです。>>2-10も参照。

【ガイドライン】
質問の前にgoogleやマニュアルを検索してください。
http://www.php.net/manual/ja/
http://php.s3.to/namazu/


◆質問する場合の注意
1. 自分のIDを表示させること。(メール欄には何も記述しないでください)
2. ハードウェア、OSのバージョン等を明記すること。
3. 己の行った操作、変更などを詳しく明記すること。
4. エラーメッセージはそのまま表記すること。
5. 質問者としても態度をわきまえること。


◆質問後の注意
・質問者は必ずIDを表示させてください。
  書き込む場合はメール欄に何も記述しないでください。
・2回目以降は最初に質問した際のレス番号を名前欄に入れてください。
  (逆に回答者は質問者に対して>>(アンカー)をつけて答えてください。)
・解決しなくても回答をもらった場合はお礼を言う。
  (荒らし、煽りは除く)

【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークはそれぞれの該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
・オブジェクト指向については良スレがないから本を買え
・速さについては自分でベンチをとってここに書け(違う環境の人も調べてくれるかも)

過去スレ、関連リンク、FAQ等>>2-10辺り
0082nobodyさん2006/03/25(土) 18:34:37ID:???
>>81
例えばA,Bという物理的に違うサーバを用意します。ドメイン名はtest.co.jp

サーバ バーチャルドメイン ファイル
A 01.test.co.jp 01.php
02.test.co.jp 02.php
B 03.test.co.jp 03.php
04.tets.co.jp 04.php

// ファイル内処理
01.php
$_SESSION['name'] = "name";

02.php
$_SESSION['mail'] = "mail";

03.php
$_SESSION['pass'] = "pass";

04.php
$_SESSION['sex'] = "sex";

// アクセス手順
01.php → 02.php → 03.php → 04.php
0083nobodyさん2006/03/25(土) 18:35:23ID:???
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
01.phpにアクセスしたときsess_0123456789というセッションファイル?がAサーバにできます。
セッションデータは "name"

次に02.phpにアクセスしたときsess_0123456789にセッションデータ "mail" が追加されます。
セッションデータは "name" "mail"

次に03.phpにアクセスしたときsess_0123456789というセッションファイル?がBサーバにできます。
セッションデータは "name" "mail" "pass"

次に04.phpにアクセスしたときsess_0123456789にセッションデータ "sex" が追加されます。
セッションデータは "name" "mail" "pass" "sex"
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

実験結果です。
ローカル側から送られる情報を参照して
php.iniの設定によりセッションを共有しているとしか思えないんですが・・・
アクセスしたサーバごとに違うセッションキーが発行され、
データも共有できないと思っていたのでこの動きを信用していいものか悩んでいます。
0084802006/03/25(土) 18:40:11ID:???
すいません。Aサーバ,Bサーバのphp.iniのsession.cookie_domainは
session.cookie_domain = test.co.jp
となっています。
0085nobodyさん2006/03/25(土) 19:47:01ID:???
session_nameを変更したら?
0086nobodyさん2006/03/25(土) 23:52:07ID:???
PHPでPerlの$ENV{'QUERY_STRING'};と同じ働きをする変数?を教えてください。
0087nobodyさん2006/03/26(日) 00:02:04ID:???
>>86
getenv('QUERY_STRING')
0088nobodyさん2006/03/26(日) 00:04:06ID:???
>>86
$_SERVER['QUERY_STRING']
0089nobodyさん2006/03/26(日) 01:40:48ID:???
86 はもしかして $_POST/$_GET を知らないとか。
あと $_ENV とか。


0090nobodyさん2006/03/26(日) 02:34:06ID:???
>>86
スーパーグローバル変数

でググれ
0091nobodyさん2006/03/26(日) 04:35:18ID:???
>>74

foreach($array as &$value){
$value = mb_convert_encoding($value, $tocode, $fromcode
}

$valueを参照にすればこんな風に書けるよね
0092nobodyさん2006/03/26(日) 04:42:37ID:???
>>91
んな書き方できねーだろ
0093nobodyさん2006/03/26(日) 07:35:17ID:???
>>92
カッコが閉じてないってこと?
0094nobodyさん2006/03/26(日) 10:54:57ID:???
質問スレもPHP4とPHP5でスレ分けた方がいーんじゃねーか?
0095nobodyさん2006/03/26(日) 11:06:00ID:???
>>94
WHY?
0096nobodyさん2006/03/26(日) 11:16:07ID:???
>>94
一理あるけど如何せん人がそこまで多いわけではないので分離は難しいかと。
次スレ立てる奴が勝手に【PHP5】質問スレッドとかにしたらいつの間にかPHP4スレも立つかもね。
もしくはくだ質がPHP4になるとか。
まあその時に誰がいるかによって変わるでしょう。
0097nobodyさん2006/03/26(日) 12:45:29ID:???
PHP4.4.2使ってるけど、いつかはPHP5に移行するんだよな。いつかは。
PHP5の環境も整えようと思ったけど、Windowsだとphp.iniの入れ替えがめんどいんだよな。
何かいい方法ないか?
0098nobodyさん2006/03/26(日) 12:51:33ID:???
xampp使えばいいんでね?
4,5の同時起動はできないけど、バッチファイル(php-switch.bat)で切り替えの面倒を見てくれる。
0099nobodyさん2006/03/26(日) 13:00:54ID:???
やっぱりバッチだよなぁ。

忘れてたがhttpd.confの書き換えも必要なんだな。
まぁいいか。とりあえずPHP5の設定していつでも使えるようにしておく。
0100nobodyさん2006/03/26(日) 13:32:00ID:???
httpd.confも切り替えの対象になってるよ。
php-switch.batはcli版のphp(xamppに含まれている)を使って実際の切り替え処理をphp-switch.phpでやってるんだが、
それを見た感じだと php.ini httpd.conf 各バージョンのDLL 拡張モジュールのDLLあたりを切り替えてる。
0101nobodyさん2006/03/26(日) 14:05:11ID:???
>>100
XAMPP入れる気はないから、自分で切り替え用のプログラムでも組むしかないか。
サンクス
0102nobodyさん2006/03/26(日) 14:13:31ID:???
ほんと、さっさとPHP5に移行してほしいんだがなぁ。
0103nobodyさん2006/03/26(日) 14:38:41ID:???
Apache のポートを変えて 2 つ動かしてる。
PHP5 は 80、PHP4 は 8080 のように。
0104nobodyさん2006/03/26(日) 14:50:33ID:???
Cで切り替え用のプログラム書いた。
0105nobodyさん2006/03/26(日) 19:33:57ID:???
ポート2つって何かスマートじゃないな。
modphpに手を入れて二つ動かせるようにした法が良くないか?
/php4以下ならphp4が動いて、
/php5以下ならphp5が動くように。
0106nobodyさん2006/03/26(日) 19:39:46ID:???
マシン2台、これ最強
0107nobodyさん2006/03/26(日) 20:37:46ID:???
>>105
Windowsだとphp.iniがどうもな。
0108nobodyさん2006/03/27(月) 17:09:51ID:S2DOnOnv
0001
0002
0003
と桁数の決まっている数字で簡単に数字を1ずつ上げる方法はないでしょうか?
01091082006/03/27(月) 17:14:19ID:S2DOnOnv
と、思って色々試してたら以下ので簡単にできました。お騒がせしました。
$num = '0010';
print $num . '<br>';

$num++;
print $num . '<br>';

print str_pad($num, 4, "0", STR_PAD_LEFT);
0110nobodyさん2006/03/27(月) 17:57:30ID:???
$num = '0010';
printf('%0'.strlen($num).'d', (int)++$num);
0111nobodyさん2006/03/27(月) 18:02:58ID:???
↑この質問もそろそろFAQかな。何回か見た希ガス。

Q. '0001'、'0002'、'0003'・・・とインクリメントしたい
A. 数値(int)で計算した後str_padかsprintf等で整形

なにげにPHPにはどんな文字列でもインクリメントできる変な隠し機能があるけど、>>108-109のようにintへの暗黙の型変換が働いて0埋めができないので結局は数値で計算するのが最善かな。
0112nobodyさん2006/03/27(月) 18:14:05ID:???
隠し機能というかPerlのをそのまま持ってきた気がする
0113nobodyさん2006/03/27(月) 18:16:12ID:???
>>112
perlでもできるんかい。そいつは知らなかった。
0114nobodyさん2006/03/27(月) 18:18:45ID:???
連投スマソ
perlだと試してみたら
$num = '0001'; $num ++;
でちゃんと'0002'になるんだね。
phpありえなす・・・
0115nobodyさん2006/03/27(月) 18:22:41ID:???
もともといいとこ取りだし
0116nobodyさん2006/03/27(月) 19:22:12ID:???
>>114
マジっすか?!
01171082006/03/27(月) 20:09:10ID:???
>>110
そんな方法もあるのですね。参考になります。
0118nobodyさん2006/03/27(月) 20:42:30ID:???
perl なら
$a = 'a';
$a++;
で $a が b になるしな。
0119nobodyさん2006/03/27(月) 20:47:32ID:???
>>118
それはPHPも同じだ
0120nobodyさん2006/03/27(月) 20:53:52ID:???
C言語でもJavaでも'a'のインクリメントは'b'
0121nobodyさん2006/03/27(月) 20:58:24ID:???
その話題、チョット前にやらなかったっけ?
0122nobodyさん2006/03/27(月) 21:00:32ID:???
>>120
さすがに
$a = "azz";
$a ++;
で $a が "baa" になったりはしないけどな >CやJava
0123nobodyさん2006/03/27(月) 21:18:24ID:???
勝手にそんなことになったら困るよ
0124nobodyさん2006/03/27(月) 21:28:12ID:???
PHP5.1以降はPDO関数が標準ですか?
PHP5.0のsqliteみたいに、将来標準から脱退になったりしませんか?
0125nobodyさん2006/03/27(月) 22:12:15ID:???
>>124
中の人に聞いて。ここで聞くよりましかと。
0126nobodyさん2006/03/27(月) 22:23:40ID:???
PDOは流石にないんじゃないかな、とか言ってみる。
0127nobodyさん2006/03/27(月) 23:36:54ID:???
PDO が SQLite に対応したから
0128nobodyさん2006/03/28(火) 00:24:08ID:???
アッー!の元ネタワカラナス(´・ω・`)
0129nobodyさん2006/03/28(火) 01:45:57ID:???
>>128
スレ違い。いい加減に市ね
0130nobodyさん2006/03/28(火) 02:05:12ID:???
はじめてかきこんでのにorz
0131nobodyさん2006/03/28(火) 03:26:50ID:???
>>130
はじめてなら、スレ違いぐらい認識しろ。
認識したら回線きって(ry
0132nobodyさん2006/03/28(火) 12:23:20ID:???
0009をインクリメントして、000aにするのと0010にするので揉めそう。
まあ0001の次は、0010かもしれんし(w
0133nobodyさん2006/03/28(火) 12:46:32ID:???
>>132
そのへんはphpもperlも基本的に各桁で数字なら数字、大文字なら大文字、小文字なら小文字でループしながら、繰上げは右から左に伝播するように統一されてるみたいだ。

ただphpの場合は自動型変換が最悪の事態を引き起こす。
$n = '1d7';
$n++; // '1d8'
$n++; // '1d9'
$n++; // '1e0'
$n++; // 2 ・・・あれ?
$n++; // 3
 :

この機能、使わないのが一番かと思われます。
0134nobodyさん2006/03/28(火) 13:36:45ID:???
EXCELのカラム記号を作るくらいしか使い道を思いつかない
0135nobodyさん2006/03/28(火) 15:28:44ID:???
パスワードを総当りでクラックとか
0136nobodyさん2006/03/28(火) 16:12:05ID:qFPc77vu
サーバー側のphp.iniの設定で、文字コードが指定してあり、
どうにも、こうにも、結果が面白くなくて、、困っています。

以前 php.iniを単独で作るって言う方法があったとおもうので、
資料や、その紹介サイトだけでもいいの、
ご存知でしたら、教えていただければ、幸いです。

もしくは、方法教えていただければ、幸いです。お願いします。
0137nobodyさん2006/03/28(火) 16:26:32ID:???
データファイルは
aaa<>bbb<>ccc<>ddd
bbb<>ccc<>ddd<>eee
・・・・
のようになっていて、これを縦の値でソートしたいんですが
何か方法はないものでしょうか?
0138nobodyさん2006/03/28(火) 16:42:57ID:qFPc77vu
<>で区切って
aaa bbb<>ccc<>ddd
bbb ccc<>ddd<>eee

と引っ張って、 aaaを配列のキーにしてみては?
0139nobodyさん2006/03/28(火) 17:01:59ID:???
>>137
もっと質問を具体的に
0140nobodyさん2006/03/28(火) 17:22:22ID:???
>>138-139
大変申し訳ないです。もっと具体的に書きます。

id1<>1000<>2000<>3000
id2<>5000<>4000<>6000
id3<>3000<>8000<>1000
・・・・・

のようなテキストファイルが存在する時、
縦方向を見て、大小を比較してソートしたいのです。

たとえば、2列目をソートするような命令があった場合、
1000、5000、3000の大小を比較し、
5000、3000、1000や、1000、3000、5000のようにソートしたいのです。
そのときにあわせて横一列丸ごと表示してほしい訳です。
つまり、表示するときは

id2 5000 4000 6000
id3 3000 8000 1000
id1 1000 2000 3000

のように。
お知恵を貸してくださいorz
0141nobodyさん2006/03/28(火) 18:08:10ID:qFPc77vu
俺がへたれなのか、、、
近頃は区切り文字を <> にするのがはやり?

まあ、それはいいとして、とりあえず、、

検索する場所を配列のキーにして、そのrecordごと文字列として入れる
配列のキーをソートする

配列を順番に取り出す。
区切り文字で配列を変数化する

でよくないのかな?

すまん、、もっとスマートな方法はあるかもしれんが、、、、近頃CSVのソートなんてしないので、、
SQLに頼りっきりってのが、だめなのかのー
0142nobodyさん2006/03/28(火) 18:19:29ID:???
>>141
区切り文字を<>にするのはむしろ過去の遺物
0143nobodyさん2006/03/28(火) 18:26:21ID:???
>>142
おれいまだに<>使ってるんだけど代替なににしたらいい?
0144nobodyさん2006/03/28(火) 18:29:04ID:???
>>143
つSQL
0145nobodyさん2006/03/28(火) 18:31:44ID:???
一度データベースに慣れると
とてもじゃないがログファイル作る気になれn
0146nobodyさん2006/03/28(火) 18:57:34ID:???
>>140
PHPの過去の遺産(?)を使うとこんな感じ。
$k = 1; // 2列目

// 1. array_multisort
$data = array(); $columb = array();
foreach (file($file) as $line) if ($line = rtrim($line)) {
  $record = explode('<>', $line); $data[] = $record; $columb[] = $record[$k];
}
array_multisort($columb, SORT_NUMERIC, $data);
foreach ($data as $record) echo implode(' ', $record), "\n";

// 2. usort
$data = array();
foreach (file($file) as $line) if ($line = rtrim($line)) {
  $record = explode('<>', $line); $data[] = $record;
}
usort($data, create_function('$a, $b', 'global $k; return $a[$k] < $b[$k] ? -1 : $a[$k] > $b[$k];'));
foreach ($data as $record) echo implode(' ', $record), "\n";

// 3. ksort
$data = array();
foreach (file($file) as $line) if ($line = rtrim($line)) {
  $record = explode('<>', $line); $data[$record[$k]] = $record;
}
ksort($data, SORT_NUMERIC); $data = array_values($data);
foreach ($data as $record) echo implode(' ', $record), "\n";
0147nobodyさん2006/03/28(火) 19:04:31ID:???
SQLiteが標準で使えるならもうファイルを使うメリットってサイズが小さいことぐらいしか浮かばね。
0148nobodyさん2006/03/28(火) 21:57:46ID:???
PDOStatementのfetchSingleメソッドが廃止された裏事情を知っているものがいたら情報求む。
結構便利っぽかったのに。
0149nobodyさん2006/03/28(火) 22:28:37ID:???
下位互換性確保とかね。
sqlite2とsqlite3の互換性無かったはず。sqlite4に成ったらどうなるか予想出来るよね?
0150nobodyさん2006/03/28(火) 22:37:26ID:???
でもPHPとDBを連携させるにはREAR覚えないといけないんでしょ?
0151nobodyさん2006/03/28(火) 22:39:00ID:???
REARってなんじゃい。
しかもライブラリは「覚えて使う」ようなものじゃねーぞ?
0152nobodyさん2006/03/28(火) 22:39:10ID:???
>>150
DBを特定するなら不要
0153nobodyさん2006/03/28(火) 22:56:51ID:j0f8wCQk
パソコン・携帯から同じファイル名でアクセスしphpでパソコン向け、携帯向け(さらにキャリア別)で表示させたいんだけど出来る?

自分でも調べた事はここに書く予定
0154nobodyさん2006/03/28(火) 23:02:44ID:???
>>153
キャリアごとにIPアドレスのレンジが公開されてるはず
0155nobodyさん2006/03/29(水) 02:39:02ID:???
JpGraphでY軸を2つ使うとき、2つ目の軸(右側の方)のグラフが
1つ目の軸のグラフの後ろに隠れてしまう。
オーダーを変更して2軸目のグラフを前面に出したいけど
どうしたらいいかな?
0156nobodyさん2006/03/29(水) 05:55:44ID:???
>>153
単純な手はユーザーエージェントで判別して別々の内容を表示するだけ。
0157nobodyさん2006/03/29(水) 20:45:59ID:???
その辺のノウハウはビジネスに成るからなあ。無料のにちゃんで教えてもらおうってのは甘い考え。
0158nobodyさん2006/03/29(水) 21:16:12ID:???
>>157
このご時世に、んなもんが金になるわけない。
0159nobodyさん2006/03/29(水) 21:35:42ID:xErJGbSu
>>157
お前自分が恥ずかしくないのか?
0160nobodyさん2006/03/29(水) 21:41:49ID:???
ネタだろどうせ
0161nobodyさん2006/03/29(水) 21:48:28ID:???
>>153
つNet_User_Agent_Mobile
0162nobodyさん2006/03/29(水) 22:16:30ID:???
>>157の人気に嫉妬
0163nobodyさん2006/03/29(水) 22:34:02ID:Vy3b1LJ+
お知恵をお貸しください。

1,,,,,,
1,,,4,,6,
1,,3,4,5,6,7
1,,3,4,,6,7
1,,3,4,,6,

な値(,で繋がってる値)の配列があって、この値を利用して以下の配列
を作りたいのです。

$count=array('1'=>1の合計,'2'=>2の合計,'3'=>3の合計・・・)

splitで1,2,3をバラバラにするとこまでは出来るのですが、後どうした
らよいかわかりません。だれかアドバイス下さい。お願いします!
0164nobodyさん2006/03/29(水) 22:47:16ID:xErJGbSu
配列の合計出す関数(explode(",", 配列));
0165nobodyさん2006/03/29(水) 22:48:59ID:xErJGbSu
あぁ、縦の合計か。スマソ。まぁ同じことか。
0166nobodyさん2006/03/29(水) 22:53:28ID:Vy3b1LJ+
>>164
まちがってたらすいません。explode()だとsplit()と同じですよね?

array(1,2,3,4,5,6,7)

って配列が出来たとして、これを行分作って足さないといけないんで
しょうか?
0167nobodyさん2006/03/29(水) 23:19:39ID:???
>>163
質問がわかりにくい。
最初の配列は
$array = array(
'1,,,,,,',
'1,,,4,,6,',
'1,,3,4,5,6,7',
'1,,3,4,,6,7',
'1,,3,4,,6,'
);
で、結果の配列は
$count = array('1' => 5, '2' => 0, '3' => 3, '4' => 4, '5' => 1, '6' => 4, '7' => 2);
になりゃいいの?
7って数字は固定なの?それとも配列の情報から動的に計算しなきゃいけないの?
0168nobodyさん2006/03/29(水) 23:28:55ID:Vy3b1LJ+
>>167
わかりずらかったですね。すいません。

おっしゃる通りです。7って数字は固定ではなく動的です。
checkboxからの値を","でjoin()されて配列にユーザーごとに格納されて
います。
0169nobodyさん2006/03/29(水) 23:59:17ID:???
>>168
なんかよーわからんけど、とりあえず。
$array = array(
'1,,,,,,',
'1,,,4,,6,',
'1,,3,4,5,6,7',
'1,,3,4,,6,7',
'1,,3,4,,6,'
);
$count = array();
foreach ($array as $each) {
    foreach (array_count_values(explode(',', $each)) as $n => $cnt) {
        if ($n) {
            @ $count["$n"] += $cnt;
            if (@ $max < $n) $max = $n;
        }
    }
}
for ($i = 1; $i < $max; $i ++) {
    if (! @ $count["$i"]) {
        $count["$i"] = 0;
    }
}
ksort($count);
print_r($count);
0170nobodyさん2006/03/30(木) 00:14:03ID:???
>>169
夜分遅くにアドバイスありがとうございます。
とりあえず、実装してみます。結果が出ましたらご報告させて頂きます。
本当にありがとうございます。
0171nobodyさん2006/03/30(木) 00:37:11ID:???
>>169
おかげさまでいけそうです!
本当にありがとうございました。
0172nobodyさん2006/03/30(木) 03:39:49ID:D3mh+GN9
ものすごく初歩的な質問で申し訳ないんですが・・・

テキストファイル(test.dat)

1=abc
2=def
3=ghi

があったとして

$str=file_get_contents("test.dat");
ereg('1=(.*)',$str,$reg);
print($reg[1]);

abcという結果を期待してるのだけど

abc 2=def 3=ghi

という結果になっちゃうんですが。
パターンを

1=(.*)\n

としても結果は同じになっちゃいます。
(.*)の中に途中の改行も入っちゃってる様子なんですが
どうしたらいいんでしょうか。
0173nobodyさん2006/03/30(木) 05:44:30ID:???
>>172
[^\n]*
と\nを除外してみては?PHPのことうろ覚えだけど。
0174nobodyさん2006/03/30(木) 05:53:18ID:???
>>166
explodeとsplitは同じじゃない
explodeの方がはるかに高速です
0175nobodyさん2006/03/30(木) 08:34:57ID:???
>>172
\n使うなら
''
じゃなくて
""
で括ろうな。
"1=([^\n]*)\n"
で上手くいくだろう
0176nobodyさん2006/03/30(木) 09:07:15ID:rPy49/sd
>>172
行単位で処理するならfile_get_contentsじゃなくてfile()で配列に読み込んだら
0177nobodyさん2006/03/30(木) 10:11:55ID:???
>>172
> パターンを
> 1=(.*)\n
> としても結果は同じになっちゃいます。
その場合の書き方は 1=(.*?)\n だ。
?をつけて最短マッチにさせないと、1番後ろの\nを探しにいってしまう。
0178nobodyさん2006/03/30(木) 12:15:52ID:???
           |\___
           / :::::::。::::::;;;;;;>
          /::::::::::::;;;www
        )ヽ/ とノ (,,゚д゚)つ < みんなジョーズだな
       メノ'\    /
           U"U
0179nobodyさん2006/03/30(木) 13:14:17ID:???
>>172
>>177で答えは出てるが、別の点で。

ereg系関数は速度的に難があるから使わないほうがいい。
Perl互換正規表現関数のpreg系関数の方が10倍ほど高速。

あとはマニュアル参照
0180nobodyさん2006/03/30(木) 13:26:32ID:???
>>172
じゃ、俺も別の点で。
preg系のパターンではドットが改行を含まないのでpreg_match_all('/[0-9]+=(.*)/', $str, $m)あたりで意図した結果になるかな。
(逆に改行も含めたいときはsオプションで)
まあ>>172の言うように(特にpregを使うなら)fileやfgetsで一行ずつ処理するほうがやりやすい気はする。
01811802006/03/30(木) 13:27:37ID:???
ごめん。アンカーミス
×まあ>>172の言うように
○まあ>>176の言うように
■ このスレッドは過去ログ倉庫に格納されています