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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/04/07 01:06ID:HTcWOpWf
PHP全般の質問スレです。
上級者用や雑談スレを立てたくなった場合は後から適宜立ててください。

■本家
 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-5
026725004/04/16 23:11ID:???
あああ、レスがあったんですね。
いま、戻りました。
あの後、置き換える関数やら、最後の位置を取る関数やらを使って一応出来て
そのまま、寝ちゃいました。
教えていただいた関数も方がスマートなので使わせていただきます。

もう寝ます。(ゝ_ξ) ゴシゴシ
0268nobodyさん04/04/16 23:28ID:???
>>266
>urlのid=の所を指定したら出来ました
今日日、その程度でも難癖つけられる場合もあるかもね。
0269nobodyさん04/04/17 20:15ID:???
preg_match (pattern,subject [,matches])
の、patternとして、「辞書配列hoge」の「要素hage」を使いたいのですが、
どういった記述をすればよいのでしょうか?
027026904/04/17 20:22ID:???
ごめん、事故解決。
preg_match ("/".$hoge['hage']."/",$subject)
であっけなくできたわ。
0271nobodyさん04/04/17 21:30ID:???
<?
require "setting.inc";
echo "ようこそ";

みたいな感じでで共通で使う変数を羅列した設定ファイル(setting.inc)を読み込もうとしているのですが…

setting.incの中身が全部そのままブラウザに吐きだされてしまいます…

$data_dir="/data/"; $imagefile="img/";ようこそ

↑こんな感じ


こんなはずではなかったのですが…
どうすればよいのでしょう…
0272nobodyさん04/04/17 21:56ID:???
>>271
includeされるファイルも、ちゃんとPHPスクリプトにしてるかい。
要は<?php ?>で囲んどるか?
# おっちゃん、短縮形は好かんぞ

027326904/04/17 22:22ID:???
すいません、今度こそまともな質問です。
PHPでWEBメーラーを作ろうと目論んでいるのですが、
メールの受信処理を行うには、どうすればよいのでしょうか?
0274nobodyさん04/04/17 22:26ID:jFDbaWFj
fsockopen
027526904/04/17 22:27ID:???
>>274
ああああっ! そっか、その手が……。
すいません、名無しに戻って首吊ってきます。
0276nobodyさん04/04/17 23:25ID:???
>>272
さんきゅ、はじめてなのでわかりませんでした。
ありがとうございます
0277nobodyさん04/04/18 00:02ID:???
>>276
require_once使っとけ
0278nobodyさん04/04/18 04:09ID:???
すいません、ファイルを新規作成して文字列を書き込もうとしているんですが、
うまくできません。
下のコード、どこがおかしいんでしょうか?

$filename = 'test.txt';

if (!$handle = fopen($filename, 'w+')) {    //←ここの条件分岐をスルーせずに
echo "Cannot open file ($filename)"; //ブラウザにコレが返ってくる。
return;
}

if (!fwrite($handle, "ほげ")) {
echo "Cannot write to file ($filename)";
return;
}

fclose($handle);
0279nobodyさん04/04/18 04:30ID:???
>>278
何らかの要因でtext.txtが新規作成できない。
ディレクトリのパーミッションとかそんな感じ。

PHPの動作モードとか、どういった権限のユーザで
動いてるのか等も関係するけど、その辺は環境毎に
違うので管理者に訊くなりして、自分で調べてね。
0280nobodyさん04/04/18 12:48ID:???
PHPで鯖のIPアドレスは取得できるのですが、
ポート番号を取得する関数とかないんですか?
0281nobodyさん04/04/18 13:24ID:???
>>280
言っている意味が不明。
028228004/04/18 13:32ID:???
>>281
説明下手ですいません。
httpデーモンが動いているポート番号(80など)を取得したいのです。
自分の環境が80では無く、可変なので。
0283nobodyさん04/04/18 13:36ID:???
>>282
$_SERVER['REMOTE_PORT']
0284nobodyさん04/04/18 13:40ID:???
は?>283
$_SERVER["SERVER_PORT"]
ちゃうの?
0285nobodyさん04/04/18 13:44ID:???
>>284
ごめん間違えた。
0286nobodyさん04/04/18 13:53ID:???
あの、cryptは先頭8byteしか見ないんですが、他に何かいいのありませんか?
複合化できるのは無しでお願いします。
md5って

$pass="a8o4hn&$NKJnhsu5";
$md5_pass=md5($pass);

こんなので出来るんですか?
0287nobodyさん04/04/18 13:53ID:1szp522M
ちわ。

自宅鯖でPHPとMysqlを使っています。
下記のように書いたのですが、13行目でエラーが出てしまいます。
やろうとしていることはテーブルにあるデータを読み出して、カウントした数字を出したいのですが、
一体どうすれば・・・・


<html> //一行目
<head>
<title>test</title>
</head>
<body>
<table border="1">
<tr><td>ID</td><td>名前</td><?php
$con=mysql_connect("localhost","root","root");
mysql_select_db("kisop",$con);
$sql="SELECT * FROM test_table LIMIT 10";
$cnt="SELECT COUNT * FROM test_table";
$cnt1=mysql_query($cnt,$con);
print("データ件数は".$cnt1"件です"); //13行目
$res=mysql_query($sql,$con);
while($row=mysql_fetch_array($res)){
print("<tr>");
print("<td>".$row["id"]."</td>");
print("<td>".$row["name"]."</td>");
print("</td>");
}
?>
</table>
</body>
</html>
0288nobodyさん04/04/18 13:54ID:???
print("データ件数は".$cnt1"件です");
↓
print("データ件数は".$cnt1."件です");

凡ミスですな
028928004/04/18 14:03ID:???
みなさん、ありがとうございます。
$_SERVER["SERVER_PORT"]で上手くいきました。
// マニュアル読まないといけませんね。
0290nobodyさん04/04/18 14:04ID:1szp522M
あっ、どもです。
エラーはでなくなったんですが
データ件数は件です と表示され、数字が出てきません・・・
こっ、これは一体なぜでありましょうか?
0291nobodyさん04/04/18 14:22ID:???
>>279
ありがとうございます。
ディレクトリのパーミッション違いで解決しました。

ただ、もうひとつ問題がわき上がって、
fopenで開く時の$filenameが

$filename="/test.txt";
とか
$filename="http://hoge.com";

などの絶対パスだった場合はオープン出来ないんですけども、
これは鯖にインスコされてるphpの設定ファイルに基づいた仕様ですか?

うちはレンタル鯖なのでもしそうなら諦めた方がよさそうですが。
0292278=29104/04/18 14:23ID:???
あ、レス番つけるの忘れた
0293278=29104/04/18 14:26ID:???
さらにまちがい…

×

$filename="/test.txt";
とか
$filename="http://hoge.com";


↓

○

$filename="/test.txt";
とか
$filename="http://hoge.com/test.txt"; //←
0294nobodyさん04/04/18 14:43ID:???
>>293
まずhoge.comに繋いでからtest.txtをリクエストするようにすればいい。
0295nobodyさん04/04/18 14:47ID:???
リモートの XML ファイルを読み込んで、そのデータを全て配列変数にするにはどうすればいいでしょう?
具体的には

<?xml version="1.0" encoding="UTF-8"?>
<test>
<hoge>geho</hoge>
<foo>bar</foo>
</test>

$test[hoge] = "geho";
$test[foo] = "bar";

みたいな感じにしたいんですが…。
0296nobodyさん04/04/18 14:49ID:???
質問する奴って話の流れを考えないのな
0297nobodyさん04/04/18 14:53ID:???
>>293
open_basedirディレクティブで範囲を制限してると思われ。
http://www.php.net/manual/ja/features.safe-mode.php

前の動かないってやつもそうだけど、ちゃんとエラーが
出力されているので、レポーティングレベルきつくして
ちゃんと見れ。特にPHPに慣れてない場合は。
http://www.php.net/manual/ja/function.error-reporting.php
http://www.php.net/manual/ja/security.errors.php
(下はデバッグと運用時とでは、エラー出力の考え方が違うよという説明)
0298nobodyさん04/04/18 14:55ID:???
>>290
PostgreばかりでMySQLはよく知らないけど、
mysql_queryの返り値は"データ件数"ではないと思う。。。
0299nobodyさん04/04/18 14:58ID:???
>>290
mysql_query()は、クエリーが成功したかどうかを 表すために
TRUE(非ゼロ)またはFALSEを返します。(マニュアルより)

>>291
> $filename="/test.txt";
パーミッション
>$filename="http://hoge.com/test.txt";
HTTPは書き込みのみ。ftp://ならうまくいくケースもある。
詳しくは、マニュアルの「サポートされるプロトコル/ラッパー」を参照のこと。
0300nobodyさん04/04/18 15:00ID:???
>>295
普通にリモートのファイルをテキストとして読んで、
そのテキストをxmlとしてパースして処理する。
xmlのパースについては何通りかあるので自分で調べてください。
# 標準のものは初めてだと使いづらいかな。PEARとかSimpleXMLを検討せよ。
030129904/04/18 15:03ID:???
>>299の
HTTPは書き込みのみ -> HTTPは読み込みのみ 、に訂正。

本家のchmマニュアルはまだ中国語になってるねぇ。
最初見たときやたらと英語の部分が多いなと思ったら、その後は漢字の部分多すぎ、と。
0302nobodyさん04/04/18 15:16ID:???
>>301

> 本家のchmマニュアルはまだ中国語になってるねぇ。

政治的意図があると尾藻割れ。
0303nobodyさん04/04/18 15:59ID:1szp522M

//セレクト代入
$sql="SELECT * FROM test_table LIMIT 10";
$cnt="SELECT COUNT * FROM test_table";

$cntdata=mysql_query($sql,$con);
$cntdata2=mysql_num_fields($cntdata);
$cntdata2=$cntdata+1;

print("データ件数は".$cntdata2."件です");


なんかもっとスマートにできないものかと・・・・

030427804/04/18 16:18ID:???
>>299

あきまへん…
ルートフォルダのパーミッションを777にしてみても無理でした。

$filename="test.txt";
と
$filename="/test.txt";

のは全く同じ場所を指してるんですが、"/test.txt"みたいなルート参照の場合は、
やっぱりオープンエラーが出てしまいます。
0305nobodyさん04/04/18 16:41ID:???
>>304
ファイルシステムのルートとWEBサーバのルートを混同してませんか?

常識的なシステムなら
>$filename="test.txt";
>と
>$filename="/test.txt";
なんて変態な設定はされてないと思いますが。
030630504/04/18 16:42ID:???
× なんて変態な設定はされてないと思いますが。
○ が同じなんて変態な設定はされてないと思いますが。
030728604/04/18 17:23ID:???
md5($str)
でやってみたところ、うまく出来ました。
10万桁分ループ回しましたけど全然かぶってないです。
MD5が一番精度高いのでいいですか?
それと、md5($str)の使い方で合ってますよね?
もちろん複合化できませんよね?
0308nobodyさん04/04/18 17:30ID:???
精度ってなんよ?
>286にしてもお前さんが何がわからなくて何を聞きたいのか
わからないからレスがつかないんだと思われ
030928604/04/18 17:35ID:???
>>308
えっと、先頭何文字を見て暗号化するってことです
cryptは8文字なので精度が低い、ということです
0310nobodyさん04/04/18 18:05ID:???
そういう意味なら理論上"精度"は無限
031127804/04/18 18:13ID:???
>>305
realpathをとってみるとわかりましたが、見事に混同してました。
ありがとうございました。
0312nobodyさん04/04/18 18:13ID:???
>>309
言ってる日本語がオカシイ。
それなら精度じゃなくて強度。
また必ずしも強度は単純に
「先頭何文字を見て暗号化」
に比例もしない。
031331204/04/18 18:15ID:???
「10万桁分ループ回しましたけど全然かぶってない」
という意味か...精度つうのかな、それ。

少なくても強度の話をしたいのではなかったな、
そこは勘違いしてた。
031428604/04/18 18:24ID:???
えーと、いろいろ日本語がおかしかったようで・・・すいません。。。
1桁〜10万桁の数字を試したけどハッシュが被ってなかった->先頭10万桁以上は見てくれてる
ということが言いたかったんです。

それで、本題なんですが、パスワードを暗号化して管理するのにはどのアルゴリズムがいいのでしょうか、ってことです。
今までcrypt使ってたのですが、さすがに8桁は少なすぎると思って・・・
それで、複合化できなくて、強度?が高いのはどれでしょうか?
0315nobodyさん04/04/18 18:28ID:???
俺はパスワードは生でデータベースに保存してる。
データベースだから簡単にアクセスされないだろ?


って、安全面考えなさ杉?
暗号化するべきなのかなぁ?
でもそれだったらパスワード再発行がめんどいし
0316nobodyさん04/04/18 18:37ID:???
他と比べての採用じゃないけど、俺もそういう場合md5使ってる
0317nobodyさん04/04/18 18:37ID:???
phpでディレクトリを作成するのにmkdirを使ってるんですが、
一度に一つ(一階層分)のディレクトリしか作成できないんですか?

hoge/hog/ho

と一気に作りたいんですが…。

0318nobodyさん04/04/18 18:47ID:???
mkpath
0319nobodyさん04/04/18 19:35ID:???
>>318
ありがとうございます、できました。

っていうか、色々試してるうちに、どうやっても消去できないディレクトリとかができちゃったんですが(;´Д`)
FFFTP使ってるんですが、そのディレクトリとそれ以下のものがすべて削除できません。
練習用に作ったゴミフォルダだから削除したいのに。

とりあえず、削除したい大元のフォルダの属性は755になってます。
FFFTPで777とかにしようとしても755です。

これが原因なんでしょうか。
0320nobodyさん04/04/18 19:39ID:???
>>319
所有権がないんだろ。
0321nobodyさん04/04/18 19:55ID:???
>>319
phpからunlinkすればいいと思われ
0322nobodyさん04/04/19 01:24ID:???
>>315
再発行ダメだろ。リマインダからランダムパスワードで上書きして通知とか、それが妥当では。
俺はパスワード問い合わせてオペレーターから「あなたのパスワードは~です」と返ってくる状態の方が怖いな。
1サービス1パスワードを全ユーザーが通しているわけではなく、他のサービスと共通化していたり命名則が一緒の場合があるから
暗号化しといた方が運営上のリスクは減るんじゃないの、と思うが。
0323nobodyさん04/04/19 19:26ID:???
>>322
DBには複合不可能のアルゴリズムで暗号化しておき、
アクセス時には入力されたパスワードを同じアルゴリズムて暗号化させて合致すればOK
パスワード再発行は、秘密の質問と答えを始めに決めさせておき、それと一致したら、ランダムパスワードで再発行

こういうのでいいんかね?
アルゴリズムは複合できないとなるとMD5が妥当かなぁ
0324nobodyさん04/04/19 20:23ID:???
Windows上のApacheでPHPを稼動させています。
HTMLのフォームから値を受け取って、コマンドラインプログラムを実行しているのですが、
このときの権限って何になるんでしょうか?
UNIXならhttpd.confでユーザとグループを指定できますが、Windows版では無理ですよね?
domainのAdministrator権限で実行したいコマンドがあるんですが、何か良い手は
無いでしょうか?
0325nobodyさん04/04/19 20:59ID:???
>>324
標準だとSystemUserかな。
どちらにしても、それはPHP云々じゃなくてApacheの話題。
0326nobodyさん04/04/19 21:26ID:???
>>324
Apache用のアカウントを作ればいいだろ
032732404/04/20 00:14ID:???
>>325-326
ありがとうございます。
しかし、Apache用のアカウントを作るというのが???
Apacheのhttpd.confにApacheの実行権限を指定する
ところが無いと思うのですが・・・。

もう少しヒントをいただけませんか?
032832404/04/20 00:29ID:???
>>327
事故レスです。
なんとなく分かりました。NTのApacheサービス用のアカウントを
作って、Domain Adoministratorsに所属させるということですね。
やってみます。
0329nobodyさん04/04/20 19:05ID:nLs300iI
$host = getenv("REMOTE_HOST");
print"$host";
または
$host = $_SERVER['REMOTE_HOST'];
print"$host";

でリモートホストが取得できません。何も表示されないんです。
リモートホストの取得はどうやればいいんですか?
0330nobodyさん04/04/20 19:29ID:WtUQqgHt
329さま
恐らく
・DNS逆引きの設定が出来ていない
・ApacheならHostnameLookups Onという設定になっていない
とか、そういう事だと思います。
$_SERVER['REMOTE_ADDR']にはリモートホストのIPアドレスが格納されています。
このIPアドレスを指定して、DNS逆引きをする関数gethostbyaddrを呼び出せば、ホスト名を取得できます。
gethostbyaddr($_SERVER['REMOTE_ADDR'])を試してみてください。

http://php.benscom.com/manual/ja/function.gethostbyaddr.php

HostnameLookups On
0331nobodyさん04/04/20 19:30ID:nLs300iI
gethostbyaddrでいけたよ。
0332nobodyさん04/04/20 20:21ID:nLs300iI
>>330
very very veryありが�d☆
0333nobodyさん04/04/20 21:00ID:???
ApacheのHostnameLookupは関係ないって
0334zzz04/04/21 13:40ID:1XKUsAKf
http://www.koalanet.ne.jp/~kurui/cgi/
ここのサイトの
くるくるちゃっと2
のIP表示をさせたくないのですが
どうすれば良いですか?
詳しい方居ましたら教えて頂けますか?m(_ _)m
0335nobodyさん04/04/21 13:48ID:???
>>334
ここはPHPスレですよ

中身見ずに言うけど
REMOTE_HOST拾ってる辺りを潰しとけ
0336nobodyさん04/04/21 17:14ID:keTgdueJ
>>334
すでに配布されているスクリプトの改造依頼は
よほどのことがない限り、そっけないレスしかつきません。

もう少し、自分でがんばりましょう
0337nobodyさん04/04/21 19:45ID:???
つーか、perlじゃん
0338nobodyさん04/04/21 23:00ID:???
ハッシュの一部を、キーを指定して抽出したいのですが、
array_intersect() や array_intersect_assoc()、array_slice() や array_filter() も
使えないようですし、何か一発でできる関数ってないでしょうか。

$a から、例えばキーが k1, k2 のハッシュを取り出したいのです。

$a = array(
  "k1" => "v1",
  "k2" => "v2",
  "k3" => "v3"
);

↓

Array
(
  [k1] => v1
  [k2] => v2
)
0339nobodyさん04/04/22 00:43ID:???
>>338
これでは駄目?

$result =array('k1' => $a['k1'], 'k2' => $a['k2']);
print_r($result);
034033804/04/22 02:02ID:???
>339
ありがとうございます。
やはりそういう操作になってしまいますかね。
私はこう書くことにいたしました。

$a_new = array();
foreach(array('k1', 'k2') as $key){
  $a_new[$key] = $a[$key];
}

array_intersect_assoc() が、ハッシュの「キーと値」に対してでなく
「キー」だけに対して intersect をしてくれればいいんですがねぇ…。
まぁ、関数を使ってスマートに書きたいと思っただけなんで
できなければできないで、別に支障はないのですけどね。
どもでした。
0341nobodyさん04/04/22 15:16ID:4jX4Pnw0
激しく既出だと思うんですが...探しきれなかったので
PEARのMail_mimeDecodeを使ってメールの中身を切り出しています。
ドコモのishotから送ったメールだけがうまくデコードできません。

Content-Type: multipart/mixed; boundary="----=NextPart__20040422134952Bound"
となっているために、切り分けられてないと思うのですが、どすればよいでしょう?
Mail_mimeDecode相当のものあるいは、別のクラスなんてのはないでしょうか?

よろしくおながいします。
0342nobodyさん04/04/22 15:27ID:4jX4Pnw0
341でつ。
私が馬鹿ですた。すんまそん。
0343nobodyさん04/04/22 15:38ID:vEkBjwRu
やっと本家のchm版日本語マニュアルが直ったね。
よかったよかった
0344nobodyさん04/04/22 16:14ID:LC8g3h8J
>>343
キーワードが文字化けのやつかい
0345nobodyさん04/04/22 16:50ID:zopVeUQP
>>341

/etc/php.ini

の設定をEUC-JPからSJISにしたら直るかもよ。
0346nobodyさん04/04/23 01:55ID:???
>>344
ヘルプが中国語になってるやつだ
0347nobodyさん04/04/23 10:40ID:0gEdZW4b
アップロードしてから24時間以上経過している画像を削除したいんですが、
filemtime($file)
じゃ画像の時刻取得できないんでしょうか?
filemtime(): Stat failed for 〜のエラがでます。
普通のtxtファイルなんかは取得できました・・。
0348nobodyさん04/04/23 11:06ID:???
>>347
なんでエラーの内容を最後まで書かないの?
エラーの理由を書いてあることがあるのに(Permission deniedとか)。
0349nobodyさん04/04/23 11:21ID:???
まずは質問の仕方を覚えてから書き込めってこった
0350nobodyさん04/04/23 11:23ID:???
8割以上の確率で>>348で解決する。
0351nobodyさん04/04/23 11:41ID:???
横から失礼しますが「Permission denied」ってなんですか?
自分の環境も同じ様な現象が出て困ってました.
業者にpHPを入れ直してもらわないといけないのは困りますんで
なんとか回避する方法を教えて下さい
0352nobodyさん04/04/23 11:43ID:???
>>351
悪いけどPHPやる前にサーバとかそういうとこから勉強しなおしたほうがいい
0353nobodyさん04/04/23 11:50ID:???
>>352
と言う事は原因がサーバにあるという事ですね.
業者に確認してみます!

ありがとうございました!!助かりました
0354nobodyさん04/04/23 11:53ID:???
うわー
0355nobodyさん04/04/23 11:58ID:???
>>353
"サーバとかそういうとこから勉強しなおしたほうがいい" != "原因がサーバにある"
0356nobodyさん04/04/23 12:11ID:???
業者さんかわいそ・・・
0357nobodyさん04/04/23 12:28ID:???
いくらなんでもネタでしょ?
0358nobodyさん04/04/23 13:21ID:???

http://****/test.php?htm=/*****

で動いているスクリプトを

http://****/test.php_htm=/***** 「_」で動作させるにはどこを改造したらいいでしょうか。

0359nobodyさん04/04/23 14:01ID:???
351です.

あの後、業者に症状を伝えて環境の修正を依頼したら対応して頂けました!
やはり、サーバ側の設定が問題だったようです.
それに伴い、スクリプトの修正が必要だったらしく、併せて修正してもらいました.
修正内容を今から確認したいと思います!

取り急ぎ、教えて頂いた方にお礼を申し上げます
ありがとうございました!本当に助かりました
0360nobodyさん04/04/23 14:06ID:???
ここで聞くのが間違いだ・・
0361nobodyさん04/04/23 14:46ID:???
>359
>スクリプトの修正が必要だったらしく、併せて修正してもらいました

良い業者だな
普通はスクリプトの手直しなんかやってくれんぞ
どこの鯖屋か知りたい
0362nobodyさん04/04/23 14:48ID:???
>>358
Apacheを改造したらいいよ。
0363nobodyさん04/04/23 15:36ID:???
>>362
> >>358
> Apacheを改造したらいいよ。

すいません意味がわからないです。
0364nobodyさん04/04/23 15:44ID:???
>>358
その前になんでtestが全角なんだ?
0365nobodyさん04/04/23 15:58ID:???
>>364
> >>358
> その前になんでtestが全角なんだ?

あ、すいません半角のつもりが全角になってました。

メインは「?(クエスチョン)」を「_(アンダーバー)」にしてもスクリプトが実行されるようにするにはどうしたらいいのかと言うことでして。

0366nobodyさん04/04/23 16:13ID:???
>365
そんなことはしないでください
どうしてもするなら、世間一般のインターネットとは
激しく隔離されたネットワークでひっそりやってくだちい
0367nobodyさん04/04/23 16:22ID:???
351です.

>>361
業者が作ったスクリプトだったんで直してもらえました.
納品後は当方で修正する事になってたんですけど
症状を話したら「すぐに直します」と言ってくれました!
■ このスレッドは過去ログ倉庫に格納されています