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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/06/14 14:36ID:???
・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-4


抜けているものがあったら補足願います
0232nobodyさん04/06/20 19:08ID:QviSJ75H
馬鹿か。わざわざ邦訳済みのマニュアルの英語版を持ってきて
和訳できんのかなんていってるんだからただの糞厨房にきまってんだろ。
しかもファイル全体を読み込むからとか言語障害くせーぞ。
すげー無駄だわ。

>>228
スクリプトは問題ないし、GDのバージョンかなあ。
0233nobodyさん04/06/20 19:39ID:???
どうだろう。geleralの方ではバージョンでこけてるような報告はなかったけど。
つーかRedhat?
あれにデフォルトでのってるphpを使うといろいろ苦労が絶えないらしいね。
023420404/06/20 20:16ID:???
>>207
>>231が少し書いているが、これは本質的にはfopenの問題なのでfile_get_contents()だけじゃなく、
fopenのhttpラッパーをとるhttpアクセスすべて(要するにコンテクストをつかったもの)で起こる。

因みに、本家のバグリポートはこの問題の修正には極めて消極的で、
あきらめるしかないようだった。

荒れぎみなのでこの話はこれで終了ということにしてほしい。
以上。
0235nobodyさん04/06/20 20:32ID:Uv3J3abe
PHP 4.3.7を使っています。
バッチファイルからローカルでPHPを処理するプログラムを書きました。

ファイル名の一括置換プログラムなんですが、

foreach($rename as $var){ //$renameは置換条件を記した配列
 $n = $newfilename;
 $newfilename = preg_replace("/$var[0]/i","$var[1]",$newfilename);
 if($n != $newfilename) print "$n\n"; //四行目
}

として、preg_replaceで文字置換を行っているんですが、
日本語ファイルの場合、必ず ー(伸ばす音) が ・ に文字化けします。
四行目では、preg_replaceを通す前と通ったあとが違う場合に変化を表示させようと
したのですが、改名条件にはまったく ー を入れてないのに、
文字が変わってしまいます。

本バージョンで、文字化けなどのバグは報告されたりしてるんでしょうか
ググったら前のバージョンでの文字化けの情報があり、 ←参照ttp://jp.xoops.org/modules/newbb/viewtopic.php?viewmode=flat&order=ASC&topic_id=1998&forum=11&move=next&topic_time=1063857527
php.iniの設定をいじってはみたのですが変わりません。
0236nobodyさん04/06/20 20:41ID:???
バグじゃなくてただの設定ミスだね。
キチンと質問文かけば偉い人が教えてくれるかも。
0237nobodyさん04/06/20 20:51ID:???
設定しなくても文字コードさえ合わせれば正しく置換できると思うけど、
そうなるとphpの問題じゃなくなるか。環境しだいですな。
0238nobodyさん04/06/20 20:55ID:???
自己解決するに15カノッサ。

ところでphpの日本ユーザ会ってアクティブにやってんの?
まるで話を聞かないんだが。
googleの検索順位ではいつのまにかphp研究所を抜いてるね。
0239nobodyさん04/06/20 22:00ID:PqNZ37ce
printやechoや<?php ?>の外側の標準出力への出力を
スクリプトの途中で
いろんなファイルにリダイレクトしたいのですが
どうしたらよいですか?
024022804/06/20 22:12ID:???
>>232-233
どうも。結局原因不明のままファイルに書き出すように
仕様変更しました。
ちなみにDebian (woody)のパッケージ物でした。
本番環境は自分のいじれない環境なので、自力コンパイル
することもできず。。
024123504/06/20 23:01ID:Uv3J3abe
設定となるとphpの設定かwindowsの設定かどちらなんでしょうか
文字コードはphp.ini で
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none
にあわせたんですが、どこの設定を見直せばいいのでしょう
参考の参考ていどでもアドバイスがいただければお願いします
0242nobodyさん04/06/20 23:11ID:???
>>240
>PHP: 4.1.2
この頃のPHPでoutput_handlerにmb_output_handlerを使っていると、
Content-Typeを見ずに画像もコード変換するので画像が壊れるんだが
(phpinfoのロゴまで壊れてくれる)、その現象じゃないのか?
0243nobodyさん04/06/20 23:11ID:???
そうか、php をやるならまず apache をいれなアカンのか。
0244nobodyさん04/06/20 23:20ID:???
>>243
そんなことはない。確かにメジャーな組み合わせだけどね。
Webサーバ用インターフェースはCGIも含めて色々あるし、CLI(コマンドライン)版もある。
0245nobodyさん04/06/20 23:24ID:???
>>244
じゃあ Hello World ! 表示はどうやるの?
0246nobodyさん04/06/20 23:28ID:???
>>245
php -r 'echo "Hello World !";'
0247nobodyさん04/06/20 23:36ID:???
foo@bar[~]% php -r 'echo "Hello World !";'
PHP Warning: Unknown(): Unable to load dynamic library '/usr/lib/php/extensions/mysql.so' - libmysqlclient.so.12: cannot open shared object file: No such file or directory in Unknown on line 0

orz
0248nobodyさん04/06/20 23:43ID:???
>>247
auto_prepend_file
0249nobodyさん04/06/20 23:44ID:???
(;´Д`)????
0250nobodyさん04/06/20 23:54ID:???
>>249=247?
>>247のエラーは、php.iniにauto_prepend_fileを設定してあるんではないかと。
外しているかもしれんが。
設定してあったとしても、そういうエラーが出るのは不思議だが、
使ったこと無いので、わからんぽ。
0251nobodyさん04/06/21 00:19ID:???
>>241
winの文字コードからスクリプト内で扱っている文字コード(euc-jp)に
コンバートして、書き込み時は逆変換すればおkと思われ。
0252nobodyさん04/06/21 00:26ID:???
$ php -r 'echo "Hello World !";'
Error in argument 1, char 2: option not found r
Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>]
php <file> [args...]
-a Run interactively
-C Do not chdir to the script's directory
-c <path>|<file> Look for php.ini file in this directory
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value 'bar'
-e Generate extended information for debugger/profiler
-f <file> Parse <file>. Implies `-q'
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-q Quiet-mode. Suppress HTTP Header output.
-s Display colour syntax highlighted source.
-v Version number
-w Display source with stripped comments and whitespace.
-z <file> Load Zend extension <file>.

できないヽ(`Д´)ノ
0253nobodyさん04/06/21 00:29ID:???
>>252
php --version してみろ。多分それはCGI版だ。
0254nobodyさん04/06/21 00:32ID:???
CGI版だった。CLI版にするにはどうやったらいいのかわかんない
0255nobodyさん04/06/21 00:39ID:rIRMytTY
PHPのインストールでGDが有効になってくれません。

zlib libjpeg libpng GDをインストールした後、
./configure --with-zlib-dir=/usr/local/lib --with-gd --with-jpeg-dir=/usr/local/lib --with-png-dir=/usr/local/lib
make
make install
としたのですが、

なにか他にやることがあるのでしょうか?

OS: linux
PHP: 4.3.6
apache: 1.3


0256nobodyさん04/06/21 01:36ID:???
> なにか他にやることがあるのでしょうか?
FAQ を読むこと
025723504/06/21 02:16ID:U3ATJTTU
>>251
アドバイスありがとうございます。
それってphp.iniの設定ですよね?
今色々調べながら苦戦中です。文字コードを変えたら
日本語がまったく表示できなくなったりして
0258nobodyさん04/06/21 02:31ID:???
>>256
一応PHP.net等のFAQは見てみたのですが、参考になりそうなのがなさそうでした。
見つけられないだけかもしれません。
PHP付属のがあるので、GDは特に自分ではインストールする必要がなかったのでしょうか

0259nobodyさん04/06/21 02:48ID:???
>>257
iniの設定であわせてもいいし、251にあるようにスクリプト内で変換してもいい。
phpで参照する場合には、内部エンコードに合わせ、最終的な出力時にはwinの
コードにあわせて変えればいいだけ。
必要なことは全部マニュアルに書いてあるので、他は色々調べる必要なし。
http://www.php.net/mbstring

要するに内部エンコとwinのエンコが違うなら、当然一手間かける必要があるということ。
文字コードはいつまでもついて回るので自分で分かったと思えるまでやったほうがいいのです。
026025704/06/21 03:19ID:U3ATJTTU
>259
何度もすみません、ご指定のページを自分でも見つけてやってはみたのですが、
もとのphp.iniに追加モジュールのphp_mbstring.dllをsystem32に追加して
追加モジュールを受けるように php.iniのその行の;をはずしました。
あとは例2にあるようなEUC-JP ユーザ用のphp.iniの設定に直せばいいんですよね
php.iniはそのページの設定どおりに変更したはずなんですが、どうしても
伸ばす音が文字化けが消えないのですが、他にいじるところはあるのでしょうか
preg_replaceでもmb_ereg_replaceでも変わらないのですが・・・
0261nobodyさん04/06/21 03:28ID:???
よくわからないけど、ソースをeucで書くなら、euc-jpは*nixのコードなんで
windowsから受け取ったらeuc-jpに、windowsに渡すときはsjisにコンバートかければよいかと。
mb_convert_encoding($string, 'euc-jp', 'sjis');みたいな感じでつ。
0262nobodyさん04/06/21 03:29ID:???
あれ、windowsってunicodeになったんだっけ?
まあそのへんは適当に(^^);
0263nobodyさん04/06/21 04:38ID:t8xSnGRb
12345という文字列(UCS2)をurlencodeで変換した後、GETやPOSTで値を渡そうとすると上手く受け取れません。
渡す前の中身は "%001%002%003%004%005" なのですが、これを$_GETや$_POSTで拾おうとすると
"\01\02\03\04\05\" という文字列に変わってしまっています。
これを元に戻す、もしくは上手く拾う方法は無いでしょうか?
026426304/06/21 09:55ID:???
解決しました。
stripslashesでした。
0265nobodyさん04/06/21 11:05ID:???
>>255
/libは余計だろ。
026622804/06/21 11:45ID:???
>>242
神。解決しました。
0267nobodyさん04/06/21 13:33ID:???
>>265
やっとgd入りました、ほんとありがとうございます
0268nobodyさん04/06/21 13:34ID:???
>>216
文字フォーマットが分からんつーからパディング指定子などの
説明があるページを貼った。
0269nobodyさん04/06/21 16:30ID:???
>>247=249
libmysqlclient.so.12 をPHPがロードしようとして、
見付からなくて止まってるんだな。
find /usr -name libmysqlclient.so.12 で探して、
見つけたディレクトリを /etc/ld.so.conf に書き加えて、
ldconfig しとけ。
0270sage04/06/21 17:23ID:???
基本な事で申し訳ないですが質問を..

umask(0);
if(mkdir("/hoge/hoge", 0707)) {
 ...
} else {

 ...
}

これで同名のディレクトリが存在した場合に

Warning: mkdir(/hoge/hoge): File exists in /***/result.php on line --

と、警告がでてしまいます(処理は流れきっているぽい)

できればこの警告を表示させたくないのですが
なにか対処方法はありますでしょうか

0271sage04/06/21 17:24ID:???
基本な事で申し訳ないですが質問を..

umask(0);
if(mkdir("/hoge/hoge", 0707)) {
 ...
} else {

 ...
}

これで同名のディレクトリが存在した場合に

Warning: mkdir(/hoge/hoge): File exists in /***/result.php on line --

と、警告がでてしまいます(処理は流れきっているぽい)

できればこの警告を表示させたくないのですが
なにか対処方法はありますでしょうか

0272nobodyさん04/06/21 17:52ID:???
>>271
umask(0);
if(!file_exists("/hoge/hoge") && mkdir("/hoge/hoge", 0707)) {
 ...
} else {
 ...
}
でどぅ?

単にエラー表示したくないのなら
error_reporting(0);
0273nobodyさん04/06/21 18:43ID:???
エラー制御演算子でいいんじゃね?
0274nobodyさん04/06/21 18:46ID:???
>>271
そのエラーの発生要因が判っていて、かつ、
そのエラー発生を防ぐ為だけにとまどろっこしくなる(複雑になる)
のなら、エラー制御演算子
ttp://jp.php.net/manual/ja/language.operators.errorcontrol.php
を使うといいかも。

臭いものには蓋的な解決法なんで、>>272の方がいいけど
0275nobodyさん04/06/22 10:25ID:???
漠然とした質問で申し訳ないのですが、phpMyAdminのSQLからは実行出来るのに
PHPからmysql_queryするとエラーが出る場合、SETする文字に問題があるとは
想うのですが、どんな文字が原因となっていると考えられるしょうか?
mysql_query($query)の部分をecho $queryで出力してC&PでphpMyAdmin
のSQLで実行すると成功します。文字コードも関係しているのでしょうか?。
0276nobodyさん04/06/22 10:37ID:???
>>275
query投げる前が間違ってんだろ
connectしっぱいしてんじゃねーのか?
027727504/06/22 10:53ID:???
mysql_affected_rows() || mysql_query($query) || die('err');
と書いていたせいでした。お騒がせしましたm(_)m。

>>276
アドバイスありがとう^^
0278nobodyさん04/06/22 16:04ID:5HQSlaav
データベースから取得してきた値(配列)を全ユーザ、全ページで共有して使いたいんですが、
セッション以外に格納できる良い場所はないでしょうか?(毎回ページアクセスするたびにDBにアクセスされたくないため)

0279nobodyさん04/06/22 16:07ID:???
どうぞ -> rwxrwxrwx buff.dat 0byte
0280nobodyさん04/06/22 16:47ID:uF7//6+H
自分のアドレスを取得する方法を教えてください
0281nobodyさん04/06/22 16:52ID:???
>>280
名前欄にfusianasan
0282nobodyさん04/06/22 16:56ID:???
ttp://jp.php.net/manual/ja/reserved.variables.php
0283nobodyさん04/06/22 17:13ID:???
>>280
役所に行って住民票をとってこい。

それか、もちっと「アドレス」を正確に説明して味噌。あと「自分」も。
0284nobodyさん04/06/22 18:39ID:???
察してやれよ
0285nobodyさん04/06/22 19:41ID:???
じゃあifconfigでいいか
0286nobodyさん04/06/22 20:37ID:???
>>280
CS:EIPとか?
0287nobodyさん04/06/23 08:56ID:???
1.自分のグローバルIPが知りたいなら
診断君へ逝く
もしくはLAN外で、<?=$_SERVER['REMOTE_ADDR']?>
または、>>281

2.プライベートIPが知りたいなら
LAN内で<?=$_SERVER['REMOTE_ADDR']?>
もしくは、Windowsだったら、ipconfig
Linuxだったら、>>285

3.メアドが知りたいなら
ISPに聞く。

4.住所が知りたいなら
>>283

たぶん…3かな。
0288nobodyさん04/06/23 09:04ID:???
>>239
出力バッファに貯めておいて横取りしてファイルに出力する。
<?php
ob_start();
?>
(ここでいろんな出力)
<?php
$file = fopen('ファイル名','w');
fputs($file, ob_get_clean());
fclose($file);
?>
0289nobodyさん04/06/23 12:22ID:gFRZUYHb
Perlでの $ENV{'HTTP_REFERER'}
は、PHPではどうやるのでしょうか?教えてください、お願いします
0290nobodyさん04/06/23 12:23ID:gFRZUYHb
環境は
PHP5.0β4
Apache2.0.48
です。
0291nobodyさん04/06/23 12:30ID:???
質問です。
csvファイルのアップロードをするのに、fgetcsv関数をつかってるんですが
excel2000で"," をという値で保存したcsvファイルをアップロードすると,"と読み込まれます。
これは仕様でしょうか?
PHP Version 4.3.6を使っています。
よろしくお願いします。
0292うんこ04/06/23 12:40ID:???
>>289
http://jp.php.net/reserved.variables
0293うんこ04/06/23 12:42ID:???
>>291
excel2000で保存したcsvファイルをテキストエディタで見れば
問題は解決すると思います
0294290,29104/06/23 12:46ID:???
>>292
ありがとうございます
0295nobodyさん04/06/23 12:53ID:???
>>293
すいません。
エディタで見たのですが、わかりませんでした。

こちらのほうで正常に読み込まれたのでこちらをつかう事にします。
http://pukiwiki.org/index.php?%E8%87%AA%E4%BD%9C%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%2Fcsv2newpage.inc.php
0296nobodyさん04/06/23 14:01ID:???
$a に入っているのが 数字かそうでないか を判定したいんだけどどうすれば
0297nobodyさん04/06/23 14:20ID:qX+B9Isg
>>296
is_numeric($str)
0298nobodyさん04/06/23 14:32ID:???
>>297
is_numericは正確に言うと数値かどうかの判断だがなぁ。
0299nobodyさん04/06/23 14:41ID:???
>>298
うんにゃ。数値または数値文字列であるかの判断。
マヌアル嫁
0300nobodyさん04/06/23 14:59ID:???
>>297
(゚∀゚)サンクスコ
0301nobodyさん04/06/23 15:06ID:???
<INPUT NAME="unko" VALUE="<?= urldecode($_GET['unko']) ?>">

これで文字列に \ を入力すると どんどん増えていきます (バイバイン級)
どうしたらいいでしょうか
送信前にJavaScriptでurlencodeしなきゃだめ?
0302nobodyさん04/06/23 15:17ID:???
>>301
<INPUT NAME="unko" VALUE="<?= stripslashes($_GET['unko']) ?>">
0303nobodyさん04/06/23 15:31ID:???
>>296
ctype_digit($a)
0304nobodyさん04/06/23 15:32ID:???
>>301
バイバインなつかしいね
0305nobodyさん04/06/23 15:39ID:???
栗まんじゅう
0306nobodyさん04/06/23 15:44ID:???
function bybyne ($kurimanju) {
$kurimanju = $kurimanju * 2;
return $kurimanju;
}
030730104/06/23 15:55ID:???
>>302
ありがとう
でも新たな問題が!

" を入力できないっす
まあこれはあきらめようかな
無理っぽいし
0308nobodyさん04/06/23 15:59ID:???
>>307
お前、脳味噌あるか?
ちっとは自分で頭使って考えろや
030930104/06/23 16:11ID:???
>>308
まあそうなんだけどさ
VALUE="<?= urlencode(stripslashes($_GET['unko'])) ?>"
ってやってもだめだったし
preg_replace("/\"/","\\\"",$dpreg) でもだめだった
そもそも"\""という表記がだめっぽだし
シングルクオーテーションで囲えばいいんだけど
今度はそのシングルクオーテーションが入力できなくなるし
もうおっぱいおっぱいなんですよ
031030104/06/23 16:12ID:???
>>309の $dpreg は stripslashes($_GET['unko']) と思ってくだちい
0311nobodyさん04/06/23 16:15ID:jqDhu+uC
>>309
VALUE="<?= urlencode(htmlspecialchars(stripslashes($_GET['unko']))) ?>"
031230104/06/23 16:27ID:???
>>311
サンクスコ
urlencodeはいらなかったっす
0313nobodyさん04/06/23 20:26ID:15bnd+/J
Yahoo!オークションなど文字コードがEUCの検索エンジンを
$key=mb_convert_encoding($_POST["keyword"], "EUC-JP","auto");
で文字コードを変換すると、変換したくない他の検索エンジンもEUCに変換されてしまうのですが、
変換されないようにするにはどうすればよろしいのでしょうか。
<?php
$Key=urlencode($_POST['keyword']);
$key=mb_convert_encoding($_POST["keyword"], "EUC-JP","auto");
switch($_POST['engine']) {
case "kakaku": $url="http://www.kakaku.com/txtsearch/txtsearch.asp?SearchWord=";
break;
case "yahooauction": $url="http://search.auctions.yahoo.co.jp/jp/search/auc?auccat=0&alocale=0jp&acc=jp&p=";
break;
}
header("Location: ".$url.$Key);
?>
0314nobodyさん04/06/23 20:34ID:???
>>313
変換したくない時は変換しないようにスクリプトを書けばよいよい
0315nobodyさん04/06/23 20:38ID:???
>>313
方法は色々あるけど、件のソースのようにswitchで
切り替えてるなら、caseの中でそれぞれのサイトに合わせて
$key←$_POST["keyword"]の処理をしたらいいでそ。

最も、各サイトのurlとか変換処理の有無なんかは
配列かなんかで前の方で設定を集約するのがスマートやね。
0316nobodyさん04/06/23 20:42ID:15bnd+/J
>>314さん
>>315さん

教えてくれてどうもありがとうございます。
0317nobodyさん04/06/24 11:14ID:Ig3nklaT
経験豊かな皆さんに質問です。
昔のPHPはGETやPOSTなど区別する必要が無いと効いています。
例えば、
$_POST["giko"] : 10
$_GET["giko"] : 20
$_COOKIE["giko"] : 30
$_SESSION["giko"] : 40
のような場合のときに、
echo $giki
とすると何が表示されるのですか?
0318nobodyさん04/06/24 11:40ID:???
そんなコーディングはしちゃダメが正解。
0319nobodyさん04/06/24 11:43ID:???
区別する必要が無くても区別しなきゃ不味いだろう
>>317はやった事無いからシラネ
0320nobodyさん04/06/24 11:44ID:???
>>317
$gikiは定義されてないから何も出ない
0321nobodyさん04/06/24 12:00ID:???
>>320
だな
0322nobodyさん04/06/24 12:36ID:???
320に補足すると、「register_globals = On」な環境だと
variables_orderで指定した優先度の高い(右側)ものが入る。
通常の$_SERVER[]と同じ。

ああ、PHPの設定で変わるもんだから、仮にPOSTが無かった
時にはGETでという処理を書くときも、システムの動作に
依存させないで、ちゃんとコーディング上で処理しないと駄目。
# register_globalsはコードの中でini_setできないし
0323nobodyさん04/06/24 13:35ID:???
register_globals = Onの時に使ってたスクリプトを
register_globals = Offで使おうとしてこうやった事あるw

$key = array_keys($_REQUEST);
$i = 0;
while(isset($_REQUEST[$key[$i]])){
${$key[$i]} = $_REQUEST[$key[$i++]];
}
0324nobodyさん04/06/24 13:46ID:???
それはextractを知らなかったってところに笑えばいいんだよね?
0325nobodyさん04/06/24 13:49ID:???
てか、import_request_variables
0326nobodyさん04/06/24 16:35ID:???
セキュリティのことを考えると書き直したほうがいいんじゃないかな、と苦笑すればいいんだよね?
032731704/06/24 17:36ID:???
ありがとうございました。
自分ではそのようなかき方はしないのですが、
頂いたソースがそのように書いたものでしたので。
0328nobodyさん04/06/24 20:43ID:???
ある関数の使い方を確認するためにPHPのマニュアル見てたら
@function_name で呼出してる例があって
探したんだけど@についての説明を見つけることができませんでした
@つけるとどうなるんですか?
0329nobodyさん04/06/24 21:54ID:???
メールが出せます
0330nobodyさん04/06/24 22:26ID:WjPQG3mJ
おまいら、申し訳ないですがよろしくお願いします。

phpのソースをプレーンテキストとして表示させるにはどうしたらよいでしょうか?
apacheの設定なのか拡張子をtxtに変えただけでは、プレーンテキストとして表示してくれません。

よろしくお願いします。
0331nobodyさん04/06/24 22:45ID:???
>>330
Apacheの設定次第
よくあるのは.phpsとか
■ このスレッドは過去ログ倉庫に格納されています