トップページphp
732コメント231KB

【PHP】質問スレッド Part9

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/07/12 03:18ID:???
■本家
 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-3ぐらい
0281nobodyさん03/07/28 21:23ID:???
おまいら、GD と GD2 についてご教示いただけませんか。

Windows + PHP4.3.2 で GD2 を使うと文字化けしまつ。
下記のコードを実行すると GD (php_gd.dll) の場合はきっちり表示されますが、GD の代わりに GD2 (php_gd2.dll) を有効にすると化けます。
Unicode から他の文字コードに変更されたのかと思い EUC-JP や SJIS を試してみましたがやっぱり化けてまつ。

GD2 に拘る必要が無いので取り敢えずは無問題でつが、何故 GD2 で化けるのか気になって気になって集中力を欠き大魔界村は3面で全滅する始末。
解説してくれませんか、エロい人。

<?php
Header("Content-type: image/jpeg");
$im = imagecreate(400,30);
$block = ImageColorAllocate($im,0,0,0);
$white = ImageColorAllocate($im,255,255,255);
$txt = "Test kanji 漢字";
$txt = mb_convert_encoding($txt, "UTF-8", "SJIS");
ImageTTFText($im,20,0,10,20,$white,"C:\WINDOWS\Fonts\MSGOTHIC.TTC",$txt);
ImageJpeg($im);
ImageDestroy($im);
?>
0282nobodyさん03/07/28 22:31ID:CcP+Vvas
$txt = mb_convert_encoding($txt, "EUC-JP", "SJIS");
0283nobodyさん03/07/28 22:34ID:???
>>279
thx
0284nobodyさん03/07/28 22:37ID:???
しまった。>>280さんが詳しい解説してくれてたんだね。
よく分かりました。ありがとう。
0285nobodyさん03/07/28 22:48ID:???
>>282
GD2 で Unicode から EUC-JP に変わったんだよ、というご指摘でしょうか。
一応試したのですが化けたままです。
>>281 Unicode から他の文字コードに変更されたのかと思い EUC-JP や SJIS を試してみましたがやっぱり化けてまつ。
0286nobodyさん03/07/28 23:03ID:???
>または>で始まる引用文をマークアップしたいんですが
$x = preg_replace('/^(>|(>)\S.*)$/','<q>\\1</q>',$x);
だと上手くいかないです。
しかも「$」が文末の改行に反応しない模様

あと2ch互換のトリップを造りたいのですが、
半角カナなどの置換も上手くいかないのですがどすればよいでしょうか。
ちなみにmbは使えない環境です。
0287nobodyさん03/07/28 23:51ID:???
>>286
$y = split("\n|\r|\r\n", $x); //配列に展開
$y = array_map('rtrim', $y); //行末ホワイトスペース削除
$y = array_map(create_function('$z', 'if (preg_match("/^(>|>)/", $z)) { return "<q>" . htmlspecialchars($z) . "</q>"; } return htmlspecialchars($z);'), $y); //説明省略
$x = implode('<br />', $y); //文字列に戻す
$x = str_replace('</q><br /><q>', '<br />', $x); //必要に応じて引用箇所をつなげる
0288nobodyさん03/07/28 23:58ID:???
>>287
ありがとうございます。一行ですっきりというわけには行かないんですね。
0289nobodyさん03/07/28 23:59ID:???
本7が紛れ込んでるな
0290nobodyさん03/07/29 00:05ID:???
>>286
つづき。
たぶんどっかのスクリプトのトリップ生成ルーチンを参考にしていると思うんだけど
半角カナは事前に文字コードをSJISにしておかないと期待どおりの結果は得られませんよ。
jcode.phpsを使いませう。

参考までに僕が使っているルーチンを書いときます。
$m = array(':',';','<','=','>','?','@','[','\\',']','^','_','`');
$n = array('A','B','C','D','E','F','G','a','b','c','d','e','f');

$salt = substr($key . 'H.', 1, 2);
$salt = preg_replace('/[^\.-z]/', '.', $salt);
$salt = str_replace($m, $n, $salt);
$id = substr(crypt($key, $salt), $o); //$oはトリップ桁数 x -1(10桁のとき、-10)
0291nobodyさん03/07/29 00:11ID:???
>>288
>>286の'/^(>|(>)\S.*)$/'を'/^(>|(>)\S.*)$/m'に変えたらうまくいくんじゃないかと思ふ。
でも掲示板での利用を考えているみたいだからあえて配列にしてから
コールバック関数を使うやり方を書きますた。
僕は複雑な処理をしたいときはarray_mapの代わりにpreg_replace_callbackを使ってまつ。
0292nobodyさん03/07/29 00:22ID:???
>>287氏(でいいのかな?)
/^(>|>\S.*)$/m でも上手くいきました
けど改行が挙動不振なので最初のほうがよさそうですね。

トリップはperlのルーチンを読み替えて実装しようとしてました。
SJISに変換しておかないといけなかったのですね。意外な盲点。
ルーチン参考にさせて頂きます。
どうもありがとうございました。
0293あぼーんNGNG
あぼーん
029403/07/29 15:32ID:AcfIX73p
>>281
Linux 上で試したが UTF-8 で漢字も出たよん。
> ImageTTFText($im,20,0,10,20,$white,"C:\WINDOWS\Fonts\MSGOTHIC.TTC",$txt);
ファイルの指定の \ をエスケープしなくていいの?
0295 03/07/29 16:08ID:???
過去スレ見てもわからなかったんですが、
結局PHPで添付ファイル付きのメール送信フォームは作れるのですか?
0296あぼーんNGNG
あぼーん
0297あぼーんNGNG
あぼーん
0298あぼーんNGNG
あぼーん
0299nobodyさん03/07/29 16:28ID:???
>>295
つくれます。
0300nobodyさん03/07/29 16:33ID:???
キー
0301nobodyさん03/07/29 16:34ID:???
PHPをコマンドラインで使う場合に、
キーボードからの入力を取り込むにはどうすればいいんでしょうか。
perlでの
$var = <STDIN>
みたいなやつです。
0302 03/07/29 16:40ID:???
>>299
ヒントだけでも・・・。
もう疲れました・・・。
0303nobodyさん03/07/29 16:59ID:???
>>301
まぬあるに そのまんま「PHPをコマンドラインから使用する」てのがある。

>>302
「添付ファイル メール php」でググる。
0304nobodyさん03/07/29 17:32ID:???
>>302
RFC 読もうよ… メールのフォーマットを理解すれ。
いつも思うけど何で安易に答を求めて一次情報に当たったり基礎理解を深めようとしないのか。
0305nobodyさん03/07/29 18:28ID:???
>302
疲れたんだったら金払う?
自分は他の労働でもして、PHPは得意な人に任せるほうがいいと思うよ。マジで
0306nobodyさん03/07/29 18:31ID:???
拡張子がPHPだとEZ-WEBやJ-PHONEの端末でも見れるでしょうか?自分の携帯
はdocomoなんですがちゃんと表示されてましたが。
0307nobodyさん03/07/29 18:46ID:???
>>306
携帯は拡張子を見ていません。
0308nobodyさん03/07/29 18:47ID:???
出力されたHTML(もしくはそう言った類)が、
携帯のブラウザの仕様に合ってれば大丈夫だと思う。
ちなみにEZはS-JISじゃないと読めないぽい。
0309あぼーんNGNG
あぼーん
031030603/07/29 19:02ID:???
>>308
そうですか、安心しました。レスありがとうございます。
0311nobodyさん03/07/29 19:52ID:???
>>310
安心するなよ(w

ユーザーとしての立場から質問投げてるならスレ違いだし、
趣味ならもっと腰落ち着けてゆっくり勉強しろよって思うし、
仕事ならさっさと辞めるか必死こいて基礎から勉強しろって思うyo!
0312nobodyさん03/07/29 22:59ID:???
夏だねぇ〜
0313nobodyさん03/07/29 23:10ID:???
正直ここまで綺麗に流れているとネタとは思えないんだけど
俺が書き込んでいるのは>>301だよな。
何でみんなずれてるんだ?嵐?
0314nobodyさん03/07/29 23:11ID:???
見た感じこんなんなってるし。でも質問には答えてるんだよな。
どうなってるんだよ・・・


291 名前:nobodyさん[sage] 投稿日:03/07/29 16:59 ID:???
>>301
まぬあるに そのまんま「PHPをコマンドラインから使用する」てのがある。

>>302
「添付ファイル メール php」でググる。
0315nobodyさん03/07/29 23:13ID:???
OpenJaneでずれていました__| ̄|○
0316nobodyさん03/07/29 23:22ID:???
文章内にある単語が何回出てくるかを調べたいのですが、おまいら良い方法知りませんか。
改行による単語の分割等は気にせず大雑把に。

以下のような力技は思いつきますがもっとスマートな方法がありそうなので相談に来ました。
適当な関数が見つからないでつ、、

> mb_strpos -- 文字列の中に指定した文字列が最初に現れる位置を見つける
等で行の先頭から検査を行い、マッチした場合、カウント処理を行って、次の文字列から検査を再開する。
これを行の終わりまで行う。
0317nobodyさん03/07/29 23:30ID:???
>>316
preg_match_all
>パターンがマッチした総数を返します。または、マッチしなかったか、 エラーが発生した場合にFALSEを返します。

ttp://search.net-newbie.com/php/function.preg-match-all.html
0318nobodyさん03/07/30 01:53ID:T6SL3iv+
閲覧者全員にセッションを使わせようと思うのですが
セッションのキャパシティーの限界ってどのくらいなのでしょうか?
0319nobodyさん03/07/30 05:17ID:???
>>318
その前にセッションの仕組みを理解しているのかと、問いたい、問い詰めたい、小一時間問い詰めたい。
0320nobodyさん03/07/30 06:00ID:???
>>318
わかりません。
0321nobodyさん03/07/30 10:44ID:???
>>319
お前の方が解ってない印象。
0322nobodyさん03/07/30 11:47ID:???
>>317
ありがとうございますた。
結局マルチバイト文字が通らずに mb_ereg_match で行数を数えました。
preg_match_all は知らなかったので勉強になりました。多謝です (_ _)
0323nobodyさん03/07/30 13:16ID:dn8BmAq6
$array = array("a","b");
array_walk( $array,"hoge");
function hoge(&$array, $i){

echo $i."\n";
}

を実行すると、$iは別段操作していない(というか、引いてもいない)のに

0
1

となることを偶然発見しました。この挙動は正常なのでしょうか?
032430203/07/30 16:37ID:???
ご回答ありがとうございます。
いろいろ調べました。

・メールの送信は添付があるからmail関数を使う。
・画像は一旦サーバにアップロードする。

というやり方なのでしょうか。他にもっと楽な方法ありますか?
0325nobodyさん03/07/30 16:52ID:???
>>324
釣り?
032630203/07/30 16:59ID:???
>>325
マジなのですが。
0327nobodyさん03/07/30 18:49ID:vO+6vZKe
date("Y-n-j")で現在日を表示させているのですが
明日の日を表示させるにはどうしたらいいのでしょうか?
0328nobodyさん03/07/30 18:56ID:???
UNIX TIME に 24h 足すとか。

関数で出来ること以外に想像力働かそうよ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
0329nobodyさん03/07/30 21:16ID:???
>>323

正常だし、マニュアルにある通り。

配列のキーが2番目のパラメータとして渡されるので、

ttp://jp.php.net/manual/ja/function.array-walk.php

array("a","b") のキーは指定されていないので、(0, 1)。

>>327

マニュアルに mktime() を使った、そのままの例があるような気が。

ttp://jp.php.net/manual/ja/function.date.php
033031803/07/30 22:10ID:T6SL3iv+
セッション変数は、具体的には鯖にファイルとして書かれていますよね? 多分。
従ってあまり多くのユーザーに、同時にセッションを発行することは、
できないんじゃないかな、と思ったのですが、
そんなに気を使うこともないということでしょうか?
0331nobodyさん03/07/30 22:29ID:???
>>318
ディフォルトのままphp.iniを放置してるならそうなるね。
/tmp 以下にファイルが生成される。
セッション変数をデータベースに保存することも出来るから
ユーザーがたくさんの場合はそうして下さい。MySQLが一般
的だと思うけど、あとは自分で調べてね。
0332nobodyさん03/07/31 02:35ID:???
>>330
>具体的には鯖にファイルとして書かれていますよね?
デフォルト設定はね。
で、そのファイルって見たことある?
なければ見てみてから質問しようね。
033331803/07/31 02:36ID:???
>>331
ありがとうございます。MySQLに保存することも出来るんですね。
今稼働させてるのは共用鯖だから難しいかもしれないですね。
ほかの方法を考えてみたいと思います。
0334nobodyさん03/07/31 07:18ID:???
phpinfo();で表示されるapacheのバージョンって
libphp4.soをコンパイルした時点のバージョンなの?
apache1.3.28にアップグレードして、apachectl status
でもそれは確認済みなんだけどphpinfo();を実行
してみるとapache1.3.27のままになってる。
0335nobodyさん03/07/31 07:40ID:CNcYnA/M
switch構文の中で変数への代入したいんですけどうまくいきません。
switch ($hoge) {
case "dog":
$position = "犬";
break;
case "cat":
$position = "猫";
break;
case "bird":
$position = "鳥";
break;
}
var_dump($hoge);

その結果は
string(0) ""
となります。何かとんでもない勘違いをしてる予感がしますが、
教えて下さい。php4.3.2をソースからコンパイルしました。mbstring
とmbregexpは使えるようになってます。
0336あぼーんNGNG
あぼーん
0337nobodyさん03/07/31 08:07ID:???
>>335
どの変数へ代入したのか、
どの変数を調べたいのか、
もう一度見直してみては?
0338あぼーんNGNG
あぼーん
0339あぼーんNGNG
あぼーん
0340nobodyさん03/07/31 08:41ID:???
>>337 すいません。

switch ($hoge) {
case "dog":
$hoge = "犬";
break;
case "cat":
$hoge = "猫";
break;
case "bird":
$hoge = "鳥";
break;
}
var_dump($hoge);

です
0341nobodyさん03/07/31 09:16ID:???
文字コードは? "犬" を "DOG" に変えてテスト。
0342nobodyさん03/07/31 09:16ID:???
>>340
arrayを使った方がスマートになりそうな悪寒。
0343nobodyさん03/07/31 09:17ID:???
>>342
はげどう。
俺ならテーブルを作る。
0344nobodyさん03/07/31 09:19ID:???
NULLじゃないってことは、渡ってるのか。
0345nobodyさん03/07/31 09:24ID:???
>>340
そもそもswitchする前に、$hogeに何も入っていないのではないかと。
print_r($hoge);
exit();
をswitchの前に置いて調べてみる。
0346nobodyさん03/07/31 10:19ID:???
実際はフォームから受け取った変数で試してたんですが、
>>345さんの言うように print_r($_POST['hoge'])を試し
てみたところ、何も表示されませんでした。もしやと思い
HTMLを見直してみたら
<option value "left">左足前</option>
と = が抜けてただけでした。。ごめんなさい。

こういう場合ってswitchじゃなくて array("dog" => "犬")
みたいにするほうがスマートなんでつか?
0347nobodyさん03/07/31 22:25ID:???
>>346
そうだよ。こういう場合、caseよりもarrayでやった方がスマート。
一件につき1行で済むから。
それに、拡張したくなった時、arrayの中にarrayを追加する事もできる。
0348nobodyさん03/07/31 23:31ID:???
あと1ヶ月の我慢だ
0349nobodyさん03/08/01 07:21ID:???
HeaderのLocationでページを移動させた時に
たまに文字化けしてしまうのですが(Sjisになってしまう)、原因が分かりません。
必ずではなく、5回に一回ぐらいなんですけど…。全て同じ移動先。
ちなみに、元&飛び先のヘッダーとHTMLのメタタグのヘッダー
で両方で文字コードは両方EUCに指定にしています。
スクリプトの文字コードも全てEUCになっています。
何故なんでしょう…(`д`;)
0350nobodyさん03/08/01 07:21ID:GLKjs7JF
さげちゃった.
0351nobodyさん03/08/01 08:01ID:???
Notice: Undefined index: が出たので変数(多分配列?)を初期化すれば
いいと思ったんですが、どのようにすればいいでしょうか?

本を見ても、webを見てもよくわかりませんでした。

$array = array();

では、ダメっぽいです。
多分$arrayは多重配列?というやつみたいです。

的違いかもしれませんが、よろしくお願いします。
0352あぼーんNGNG
あぼーん
0353nobodyさん03/08/01 10:01ID:???
>>351
$array['index'] = "初期値";
0354nobodyさん03/08/01 10:32ID:???
どなたかPHP4で多態性を実現できるかどうか、ご存知の方はいらっしゃいませんでしょうか?
もしも、実現できるのでしたら、サンプルコードなど掲示して頂けますと幸いです。
0355nobodyさん03/08/01 11:34ID:???
>>349
もしブラウザがNetscape4だったら
Location時のヘッダのcharsetを参考にして
その先のヘッダは無視するのでありえる。
0356nobodyさん03/08/01 19:56ID:???
> どなたかPHP4で多態性を実現できるかどうか
普通にできるでしょ。多重継承っぽい事をしたいなら aggregation 使って。
ただ、型チェックを手軽にできない点が難点かね。サンプルコードは例示するまでもない。
0357nobodyさん03/08/01 22:39ID:???
なんで多態性を実現する為に多重継承が出てくるんだ?
まぁ型チェックに関しては将来的に返り値が変わる可能性があるから
メンドイといえばメンドイか。
0358あぼーんNGNG
あぼーん
0359あぼーんNGNG
あぼーん
0360nobodyさん03/08/02 08:54ID:???
あげあげあげ
0361あぼーんNGNG
あぼーん
0362あぼーんNGNG
あぼーん
0363あぼーんNGNG
あぼーん
0364名無しさん03/08/02 15:48ID:???
>>353さん、ありがとうございます。

早速やってみたのですが、まだエラーがでています。

$array = $a->Test($b);

という行の上に
$array['index'] = '';
としました。

$a->Test($b);
が何を表しているかわからないので、これであっていないんだと思います。
$array ごと初期化はできないのでしょうか?(的はずれかもしれませんが)
0365nobodyさん03/08/02 16:39ID:???
>>364
それだけじゃ何をどうしたいのか分かんないよ。

せめてエラーメッセージと、
エラーの出てる行の前後のスクリプトを表示してくれ。




でも、マニュアル見ても分かんないんじゃなぁ・・・
0366ファイル操作の質問03/08/02 19:52ID:YoYEkQEt
<?php
// ファイル名
$file_name = "test.txt";

// ファイルを追記モードで開く
$file = fopen($file_name, "a") or die("OPENエラー $file_name");

// ファイルをロックする(排他的ロック)
flock($file, LOCK_EX);

// 書き込む文字列
$string = "文字列を書き込みます";

// データを書き込む
fputs($file, $string);

// fputs()関数でデータをファイルに書き込みます。

// ロックを解除する
flock($file, LOCK_UN);

// ファイルを閉じる
fclose($file);
?>

なぜか「// ファイルを追記モードで開く」の部分でdie("OPENエラー $file_name")の方が実行されてしまいます。
なぜなんでしょうか?
もうこれに4時間ついやしてる折れって。。(´・ω・`)

036703/08/02 20:14ID:AkiTeJ92
>>366
ファイルの置いてあるディレクトリに書き込み権限はあるのか?
mkdir a; chmod 777 a とかして、$file_name="a/test.txt";
でやってみ。
---
俺的ポータルサイトを作ろう
http://mysite.ddo.jp/
0368nobodyさん03/08/02 20:25ID:???
>>365さん、すみません。
以下がコードです。

$b = array(

'x' => $X,
'y' => 1,

);

//$b['string'] = "";
//$b['result'] = '';
$a = $p->Test($b);

if ($a['string']){
echo $a['string'];
}else{
$end = $a['result'];
}

以下がエラーです。

Notice: Undefined index: string in
/home/user/public_html/class/xxx.php(xxx) : eval()'d code on line xx

Notice: Undefined index: result in
/home/user/public_html/class/xxx.php(xxx) : eval()'d code on line xx
0369nobodyさん03/08/02 21:28ID:???
>>368

$p->Test($b) を実行したときの戻り値が $a に入るわけだが、
その $a に $a['string'] も $a['result'] も設定されてないってことだな。

$p->Test() がそういう仕様なら Notice だから気にするな。

でないとすれば $p->Test() の中身を見てみないとなんともなぁ・・・

$p->Test() に渡す引き数ってそれで合ってる?
037036603/08/02 21:28ID:???
>>367
神様!!!!!

あまりに疲れたためPCの横で寝ちゃってましたw
そんで今言われた通りにやったら動きました!!サンクス〜( ´∀`)
0371nobodyさん03/08/02 21:51ID:sYR+wwax
test
0372nobodyさん03/08/02 22:34ID:2wasv+SN
PHP始めて2日目です。
1行掲示板を練習もかねて作ろうと思っているのですが、
フォーム(ボタンとか、エディットボックスとか)
<INPUT TYPE="SUBMIT" VALUE="送信" NAME="action">
こうすると、NAMEで指定した物が、変数$actionとして使えるのでしょうか?
サンプルがあったので、試してみましたが、ボタンを押しても$actionには
何も入ってないようなのです。
もしかして、根本から間違ってますか?
0373nobodyさん03/08/02 22:34ID:2wasv+SN
if($action=="送信"){

$fp=fopen("bbs.log","r+");
rewind($fp);
fwrite($fp,$comment,256);
fclose($fp);
}
0374nobodyさん03/08/02 23:03ID:???
そのサンプルは古いのかも知れん。
"かなり前から" PHPのデフォルトの設定が、
$_POST['action']や$_GET['action']を使うようになっている。
register_globalsで検索してみ。
0375nobodyさん03/08/02 23:35ID:???
>>372
勉強の仕方を間違ってる。
要するに馬鹿だって事。
マニュアルあげるから二度と来るな。
http://www.php.net/manual/ja/
0376nobodyさん03/08/03 00:08ID:???
>>375
何か嫌な事でもあったのか?
037737503/08/03 00:17ID:???
スマソ。言い過ぎた。
あまりに広告やage荒しが多いんでナーバスになってた。

それにフォームの処理なんてマニュアルにそのまんま載ってるし。
マニュアルで分かりにくい所とか、俺ならこうするとかだったら
まだレスのしようもあるのだが。
いくら初心者だとはいえ、>>372の質問はあまりにも安易すぎる。
0378nobodyさん03/08/03 00:26ID:FS5J2fjr
ISDNだからマニュアルの表示が遅いんだよ。
どこかに、HTMLマニュアルがあるような記述を見つけ、
その先に行ってみたけど、何処に置いてあるのかわからなかった。
0379nobodyさん03/08/03 00:29ID:???
メール欄にsageと入れなかっただけでage荒らしか
038037503/08/03 00:37ID:???
>>378
http://www.php.net/download-docs.php
のJapanese,Many HTML Filesを解凍してローカルに置いとくと便利。
■ このスレッドは過去ログ倉庫に格納されています