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

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

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


抜けているものがあったら補足願います
0554nobodyさん04/08/18 16:17ID:???
>>552
そのエラーメッセージを訳したらどうなる
ちゃんと英語を読め
055555204/08/18 16:23ID:???
ヘッダー情報を修正することができません。
0556軟式PHP04/08/18 16:32ID:???
>>555
      r;ァ'N;:::::::::::::,ィ/      >::::::::::ヽ
.      〃  ヽル1'´        ∠:::::::::::::::::i
       i′  ___, - ,. = -一   ̄l:::::::::::::::l
.      ! , -==、´r'          l::::::/,ニ.ヽ
      l        _,, -‐''二ゝ  l::::l f゙ヽ |、 よく頑張ったじゃねぇか。
        レー-- 、ヽヾニ-ァ,ニ;=、_   !:::l ) } ト
       ヾ¨'7"ry、`   ー゙='ニ,,,`    }::ヽ(ノ  もうちょい先まで読んでみようぜ。
:ーゝヽ、     !´ " ̄ 'l,;;;;,,,.、       ,i:::::::ミ
::::::::::::::::ヽ.-‐ ト、 r'_{   __)`ニゝ、  ,,iリ::::::::ミ    
::::::::::::::::::::Vi/l:::V'´;ッ`ニ´ー-ッ-,、:::::`"::::::::::::::;゙ ,  な!
:::::::::::::::::::::::::N. ゙、::::ヾ,.`二ニ´∠,,.i::::::::::::::::::::///
:::::::::::::::::::::::::::::l ヽ;:::::::::::::::::::::::::::::::::::::::::::/ /
::::::::::::::::::::::::::::::! :|.\;::::::::::::::::::::::::::::::/ /
055755204/08/18 16:37ID:???
スマン、サパーリだ_| ̄|○
0558nobodyさん04/08/18 16:38ID:???
ヘッダーは既に (・・・・・・) で 送信されている。
0559nobodyさん04/08/18 16:39ID:???
頼むから読んでくれ.辞書の引き方くらい中学校で習っただろ.
> headers already sent
056055204/08/18 16:40ID:???
・・・つまりヘッダーは1個しか無理ぽ系?
0561nobodyさん04/08/18 16:40ID:???
header() とか setcookie() とか の前に
echo とか print とかしてると 起こりやすいね。
056255204/08/18 16:42ID:???
printもechoもないぽ
<?php
if ($action == "投稿"){
$mynews = 'page/〜/data.cgi';
$file = file($mynews);
$count = count($file);
if ($count > 10){
$count = 10;
}
$host = getenv("REMOTE_HOST");
$addr = getenv("REMOTE_ADDR");
if($host == "" || $host ==$addr){
$host = gethostbyaddr($addr);
}
list ($name2,$url2,$title2,$comment2,$host2) = split( ",", $file[0]);
if ($host != $host2 && $url != url2){
$input = implode(",", array($name,$url,$title,$comment,$host));
$fp = fopen($mynews, "w");
flock($fp,LOCK_EX);
rewind($fp);
fputs($fp, "$input\n");
for($i = 0; $i < $count; $i++){
fputs($fp, $file[$i]);
}
flock($fp,LOCK_UN);
fclose($fp);
unset($file);
}
header ("Location:http://〜/index.php");
}
?>
0563nobodyさん04/08/18 16:43ID:???
>>562
> Cannot modify header information
の前に何かエラーか警告が出力されてないか
<?php の前に改行や空白がないか
056456204/08/18 16:50ID:???
エラーはこれ一つだけです
空白もナイポ
0565nobodyさん04/08/18 16:54ID:???
ぽ$って
マジきもいんだけど
0566nobodyさん04/08/18 16:57ID:???
locationのhttp:が全角なんだけどこれは意図的にやってるんだよね
それからエラーの出ているHTMLのソースはどうなってるかよく見てみれ
0567nobodyさん04/08/18 17:11ID:???
ほれ、訳してやったぞ。
ヘッダー情報-、(/usr/家/自由な/家/市場/public_html/mmorpg/index.php
で始められた出力: 4)既に送られたヘッダー-を修正することができません。

この辺りも見とけ
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30

headerの行を削除した時に、全く何も画面出力されていないことが必要だぞよ
0568nobodyさん04/08/18 17:16ID:???
>>562
$mynews = 'page/〜/data.cgi';
なんでデータファイルがcgiなのかと子一時間
0569nobodyさん04/08/18 17:27ID:???
>>568
何がおかしいのか小一時間
0570nobodyさん04/08/18 17:37ID:???
わざわざデータファイルを実行系ファイルの拡張子にする時点でオ�hル
0571nobodyさん04/08/18 17:41ID:???
>>570
無償のレンタル鯖でアクセス制限が掛けられない時、
データファイルの拡張子をcgiにしておけば、URL直打ちでも
データファイルを覗かれないという利点がありますけど。
0572nobodyさん04/08/18 17:43ID:???
データファイルの拡張子を.cgiにしておけばそのファイルにアクセスされても
500がでて見れないようにしているんだと思う
# 自分だったらそんな変なことしないで.htaccessによるアクセス制限するが
0573nobodyさん04/08/18 17:44ID:???
>>568
( ゚∀゚)アハハ八八ノヽノヽノ \ / \
0574軟式PHP04/08/18 18:40ID:???
>>568
(つω;)ヾ(・д・ )ヨシヨシ
0575nobodyさん04/08/18 19:03ID:???
拡張子の話はどっかのスレで
さんざんやってたような希ガス
0576nobodyさん04/08/18 19:05ID:QMhJW4BU
拡張子なんて飾りですよ。偉い人にはそれがわからんのです。
0577nobodyさん04/08/18 20:07ID:???
*.gifをphpでパースするようにサーバを設定してみますた
0578nobodyさん04/08/18 20:31ID:???
チンコって反ってる方が強そうだよな?
057957804/08/18 20:32ID:???
スマン、誤爆だ
0580nobodyさん04/08/18 21:10ID:???
>577
すげー。このサイト全部 GIF かよ。ってことになるのか。
で、GIF 画像を表示するとき困らないかしら。
あふぉなブラウザが勘違いして妙なことになりはしないかしら。

わたしもやってみよー。
0581nobodyさん04/08/18 22:03ID:sgbsN4EW
ヒアドキュメントで、変数展開を防ぐ方法はありますか?

$str = <<<EOS
aaa $x bbb
EOS;

この例なら $x を展開しようとして「初期化されてない変数」というエラーがでてしまう。
もちろん \$x と書けばいいのだが、ちょっと面倒くさい。

$s = <<<'EOS'
aaa $x bbb
EOS;

と書いたら変数展開されないかなーと思ったけど、シンタックスエラーだ。
0582nobodyさん04/08/18 22:29ID:???
””
0583nobodyさん04/08/18 22:52ID:???
>>577
jsp にしたら多少リソース喰っても許される
aspx にしたら客が他に移管するって言い出さなくなるし単価も上がり、初期投資も色乗せれる
cgi にしたら単価下がるけど杜撰な運用でデータ漏れても泣き寝入り度上がる
php にしたら 普通じゃーん と思われつつ、人員の技能レベルとセキュリティホールやバグを執拗に心配される

まぁどれを選ぶかはおまい次第だ。


# .html を被せて運用してるところはマジであるよね。運用情報隠して被いたずら/クラッキング率を下げる
0584nobodyさん04/08/18 23:14ID:???
初耳だな
0585nobodyさん04/08/18 23:20ID:???
>>581
1字付け足してエスケープするのが一番楽だろう。
それかその部分だけエラー制御で殺す。テンプレートエンジンはコレやってる。

ヒアドキュメント自体そんなに使う物でもないし、不満になってきたら他のやり方探す方がいい。
0586nobodyさん04/08/18 23:22ID:???
忘れてた、
> それかその部分だけエラー制御で殺す。テンプレートエンジンはコレやってる。
考え無しにコレをやると脆弱性作るぞ。
運用段階で register_globals を有効にされたり、そのコードの前で外部変数を extract されたらまさに鴨。
テンプレートエンジンがソレやって許されるのは、きっちり閉じ込めてあるからで。
0587nobodyさん04/08/18 23:27ID:???
@使えばいいじゃん
0588nobodyさん04/08/18 23:28ID:???
もう一つ忘れてた。

PHP の変数ではなく、> 変数 $hoge に対して~ とか文章の流れで $var が出てくるってのなら、
$ はエンティティにでもしておくのが妥当だと思われ。
0589nobodyさん04/08/18 23:33ID:???
>>587
Σ( ̄∇ ̄ !!
059053004/08/19 01:08ID:???
あれから文字コード変えてみたりphp.ini弄ってみたりと色々やってみたのですが、
シェルからphp hoge.phpとしてphpを呼び出すとちゃんと日本語にしてくれて、
apacheから呼ぶと駄目みたいです。
どっちも同じユーザーでやってみたので権限の問題でもないようですが、
もうさっぱりです。
どなたかご教授願います。m(_ _)m

>>539
PHPがshell関数で動かす環境の言語とは何処を設定すれば良いですか?
PHP-usersも検索してみましたが探し当てられず・・・。
0591nobodyさん04/08/19 01:37ID:???
>>590
shell_exec('touch 日本語のファイル名.txt');
としてapacheとシェルから実行したらどうなるかやってみてよ
059253004/08/19 01:54ID:???
>>591
mkdirでも出来たので予想はしてましたけど、
apacheとシェルどちらもEUC-JPで日本語名のファイル作ってくれました。
EUC-JPで.shファイル作ってやっても出来たので、oggencの引数はEUC-JPで良いみたいですし。
何が悪いのでしょう?
0593nobodyさん04/08/19 02:00ID:???
それでoggencの引数にUTFで値を渡したときはやってみたの?
059453004/08/19 02:11ID:???
>>593
やりました。
apacheからやった場合は文字コードの1バイトが#に置き換わって表示されます。
シェルからやった場合は#と?で出てきます。
どちらも英字の部分は普通に表示されています。
059558104/08/19 02:15ID:???
>>585
どうもありがとう。
背景をちょっと説明すると、PHPスクリプトの中にPHPスクリプトを書く必要があって、
それをヒアドキュメントで書いています。
$code = <<<EOS
#PHPスクリプトをここにかく
<?php echo \$x ; ?>
EOS
それで、Cut&Pasteで貼り付けてるんだけど、そのあとに¥でエスケープするのが
面倒だったので質問しました。
\n なんかも \\n としなきゃいけないんで、結構面倒なんですよ。
まあ頑張ってちまちま直します。

>>587
どういう意味?
0596nobodyさん04/08/19 02:31ID:???
>>587
どういう意味?

エラー制御演算子 でぐぐれ
0597nobodyさん04/08/19 04:37ID:???
>>595
俺ならテンプレート使って終わり。
っていうか

?>
好き勝手書けや (#゚Д゚)オラー!
<?php
0598nobodyさん04/08/19 09:23ID:???
まずヒアドキュメント使う必要があるのかと
0599もん吉04/08/19 10:35ID:???
現在PHPとMySQLを使って検索システムを作ってるんですけど
SQL文で
$sql = "SELECT * FROM data WHERE NAME LIKE '%".$data."%'";
$dataは前ページからもらってきたデータが入ってるんですが
データベースの中身(NAME)が全角(例:カーショップ)の場合で
$dataが半角(例:カーショップの場合bとかjでした)の場合
なぜか引っかかってしまいます。
これはなぜでしょうか?
0600nobodyさん04/08/19 10:58ID:???
しつもーん。

$hoge .= "ほげ";
これだとエラー。

$hoge = "";
$hoge .= "ほげ";
これだとエラーなし。

そういうもんなんでしょうか?
                                                php4.3.4
0601もん吉04/08/19 11:06ID:???
$hoge .= "ほげ";は$hogeに"ほげ"を追加するため
先に$hoge = ""; としておかないと追加する場所がなく
エラーが出るのだと思います。
$hoge = "ほげ";だと問題ないですよ。
0602nobodyさん04/08/19 11:07ID:???
ケータイ用のサイト(Shift_JIS出力)の人でPostgreSQL+PHPで運用している方が
いれば教えてホシイのですが、どういう手段で文字コード変換やってますか?

jcode.phpとかだと半角カナをうまく使えないですし、
かといってレンサバなのでphp.iniをいじくったりモジュール追加できないので悩んでいます。
0603nobodyさん04/08/19 11:16ID:???
includeでCGIを挿入できたっけ?
060460204/08/19 11:22ID:???
>>603
よく読んでみてください
jcode.cgiじゃなくてjcode.phpですよ
0605nobodyさん04/08/19 11:26ID:???
includeって拡張子は何でも良いのでは?
0606nobodyさん04/08/19 11:43ID:???
includeでCGIを呼び出そうとしたらCGIの中身が出てきますた
0607nobodyさん04/08/19 11:43ID:???
>>602
jcode.phpって半角カナで何か不具合あるの?
0608nobodyさん04/08/19 12:02ID:???
Shift_JISはあちこちでマルチバイト対応に迫られるね
そもそもjcode.phpって必要
0609nobodyさん04/08/19 12:03ID:???
$2ch['php']['1091774679']['body'] .= '?';
0610nobodyさん04/08/19 12:26ID:???
Warning: rewind(): supplied argument is not a valid stream resource in /usr/home/free/home/market/public_html/mmorpg/link/index.php on line 19
Warning: fputs(): supplied argument is not a valid stream resource in /usr/home/free/home/market/public_html/mmorpg/link/index.php on line 20
Warning: fclose(): supplied argument is not a valid stream resource in /usr/home/free/home/market/public_html/mmorpg/link/index.php on line 24
Warning: Cannot modify header information - headers already sent by (output started at /usr/home/free/home/market/public_html/mmorpg/link/index.php:19) in /usr/home/free/home/market/public_html/mmorpg/link/index.php on line 28

もうだめぽ_| ̄|○
0611nobodyさん04/08/19 13:06ID:???
parse error, unexpected T_STRING, expecting T_CASE or T_DEFAULT or '}'
とはどういう意味でしょうか?
0612nobodyさん04/08/19 13:10ID:???
>>610
セーフモードは色々と制限があるからね

>>611
見ての通り → '}'
0613Imo ◆.jC7ANgFY. 04/08/19 13:23ID:???
>>611
文法エラー
文法上の誤りがあります。
本来、case(T_CASE)またはdefault(T_DEFAULT)または}であるべき
ところが文字列(T_STRING)になっています。

0614nobodyさん04/08/19 13:27ID:???
>>610
その前にもっと大切なエラーが出ているはずなのになぜ省略するよ。
061561104/08/19 13:27ID:???
switch($listB2){
case1:$a = "q";break;
case2:$a = "w";break;
case3:$a = "s";break;
case4:$a = "x";break;
}

って間違ってるのかな〜
0616nobodyさん04/08/19 13:33ID:???
普通に間違ってるし
061760204/08/19 13:48ID:???
>>607
"アホ自動車"をEUC-JPで保存して、
JcodeConvert()でEUC->SJIS変換して出力してみてください
0618nobodyさん04/08/19 14:13ID:???
>>615
2ちゃんは半角スペースが消えるからわからんが、
そんなオチの気がする
0619軟式PHP04/08/19 14:39ID:???
case 1
case 2
case 3
case 4
だろ。
0620nobodyさん04/08/19 14:43ID:HVGJn52b
MySQLで、select round(166.5);
が167にならないのって一体どういう事だ?
おかげで徹夜しますた。
0621Imo ◆.jC7ANgFY. 04/08/19 14:59ID:???
>>620
注意: 引数の値が 2 つの整数の中間にある場合の ROUND() の動作は、
C ライブラリの実装に応じて決まる。
実装に応じて、最も近い偶数に丸められる場合と、
常に切り上げまたは切り下げられる場合、
あるいは常にゼロ方向に丸められる場合がある。
特定の丸め方法を必要とする場合は、この関数ではなく、
TRUNCATE() や FLOOR() などの明確に定義された関数を使用するようにする。
0622nobodyさん04/08/19 15:04ID:???
>>617
普通に変換されたけど
どこか他の部分で間違ってるんじゃない?
0623nobodyさん04/08/19 15:10ID:???
>>619
そこを本人に考えさせるのが615のため
0624軟式PHP04/08/19 15:13ID:???
そだなー。スマソ。
あと俺はcase処理を1行で書くのは嫌いだな。
619のようなやつだったら配列処理でいいし。
062562004/08/19 15:15ID:HVGJn52b
PHP上では普通にできるのに・・・
なんか>>621の文言が言い訳にしか聞こえない(^^;
で、結局「四捨五入」する方法ってどれなの?
TRUNCATE() や FLOOR() ってどう工夫すると期待した結果が得られるの?
0626nobodyさん04/08/19 15:20ID:???
0.5足して切り捨て
0627nobodyさん04/08/19 15:20ID:???
>>624
私も書き方は気に入らないが個人の好みもあるし
最初はあんなものでしょ

>>625
てかMySQLにいけ
オマケにマニュアル読め
0628nobodyさん04/08/19 15:32ID:???
>>625
"四捨五入 銀行型"辺りでぐぐれ
明確にされてないのが気に食わないのかもしれないが、
そのround実装は普通(の範疇)だ
0629Imo ◆.jC7ANgFY. 04/08/19 16:12ID:???
>>625
私はマニュアルをコピペしただけですが?

0.5引いて切捨てしろってことだろ
FLOOR(`num` - 0.5)
0630nobodyさん04/08/19 16:14ID:h2ZrLQAF
こんにちは

教えて頂きたいのですが、
アドレスで
123/456/
の時は最後の「/」を削除して
123/456
の時は何もしない
最終的にどちらも123/456

となるようにしたいのですが、
何か方法ないでしょうか?
よろしくお願いします。
0631Imo ◆.jC7ANgFY. 04/08/19 16:17ID:???
>>630
最後が「/」の時は最後の「/」を削除して
ほかのときは何もしない。
をそのままプログラムにすればいいじゃない。
0632Imo ◆.jC7ANgFY. 04/08/19 16:21ID:???
>>630
ついでに言うとif文を使わずすっきり書く方法がある。
それがrtrimだ。あとはマニュアルをよく見ろ。
0633nobodyさん04/08/19 16:37ID:???
>>632
ども〜
マニュアルみてきました!
$trimmed = rtrim($text," \t.");
ってのがのっててそれで目的が達成できそうです。
欲しい関数はなんでもありますねw

ありがとうございました!
0634nobodyさん04/08/19 16:43ID:???
>>632
630ではないが、rtrimってこういう使い方もあったのか・・・知らなかった
「/」が可能という事は全ての文字で利用出来るという事ですね
0635nobodyさん04/08/19 16:45ID:???
「この関数は文字列の最後から空白文字を取り除き、 取り除かれた文字列を返します。
rtrim()は以下の文字を削除します。」と書いてあるが空白文字以外でも利用出来るなら
そう書いてくれよ
0636nobodyさん04/08/19 16:49ID:???
>>635
書いてると思うが?
ttp://php.s3.to/man/function.rtrim.html
0637nobodyさん04/08/19 17:24ID:???
ttp://php.us.themoes.org/manual/ja/function.crc32.php
ttp://www.beginnersphp.co.uk/digitalclock.php
を参考にしたのですがファイルのCRC4の取得方法がわかりません。
途中に出てくる ^ 排他的論理和(Xor?)がワケワカラン…

$file = "./data/a.png";
$size = filesize($file);
$fp = fopen($file, rb);
$da = fread($fp,$size);
fclose($fp);
echo crc4($da);
function crc4($a){
〜〜〜〜〜〜〜〜〜〜〜〜〜
処理
〜〜〜〜〜〜〜〜〜〜〜〜〜
return $crc_data;
}
こんな感じにしたいのです。
0638nobodyさん04/08/19 17:39ID:???
なるほど
0639nobodyさん04/08/19 17:58ID:???
>>635
string rtrim ( string str [, string charlist])
[]はオプション。お前オプション注意して見たことないだろ?
phpの関数には至る所にオプションがある
0640nobodyさん04/08/19 18:22ID:???
_ = 半角スペース

<tr>
__<td class="">
____<a href="http://hogepage.com/sample.php">サンプル</a>
__</td>
__<td class="">
____2004/08/19 00:00
__</td>
</tr>

以上の文字列から、パターン %<a href=\"(.+?)\">(.+?)</a>(.+?)</tr>% で
リンク部分を抽出して、さらに3番目にマッチした部分から、
パターン ([0-9]+/[0-9]+/[0-9]+ [0-9]+:[0-9]+:[0-9][0-9]) で時刻を
抜き出していますが、最初のパターンで、更新時刻もきれいに取得したいのです
もう少しコンパクトにすることはできないでしょうか?

どうぞよろしくお願いします。
0641nobodyさん04/08/19 18:34ID:???
>>640
こんな感じか?

preg_match_all('%<tr>(?:.*?)<a href="(.+?)">(.+?)</a>(?:.*?)(\d\d\d\d/\d\d/\d\d \d\d:\d\d)(?:.*?)</tr>%s', $html, $m);
print_r($m);
064262004/08/19 18:54ID:HVGJn52b
遅レススマソ
>>629
いや、知ってる、そのマニュアルの文言が言い訳っぽいって事
>>628
せめて一貫性を保ってほしいよな
select round(166.5); が166なのに
select round(167.5); が168になるのはどうかと・・・
そんな中途半端な関数最初から作るなって感じだな
というわけで、MySQLスレ逝ってくるわ
0643nobodyさん04/08/19 18:57ID:???
>>642
はぁ?
一貫性保ってんじゃん.バカ?
0644nobodyさん04/08/19 19:00ID:???
if(isset($_COOKIE['ck'])){
echo "COOKIE";
}
この処理をディレクトリ変えたらできなくなるのですがなぜでしょうか?
よろしくおねがいします
064562004/08/19 19:02ID:???
>>643
どの辺が?
0646nobodyさん04/08/19 19:06ID:???
>>645
"四捨五入 銀行型"でぐぐったのか?
0.5を偶数になるように繰り上げたり切り捨てたりするのさ
167.5 -> 168
166.5 -> 166
165.3 -> 165
0647nobodyさん04/08/19 19:07ID:???
>644
> ディレクトリ変えたら
意味わかんね
064864404/08/19 19:10ID:???
ええと、
<?php
if(isset($_COOKIE['ck'])){
echo "COOKIE";
}
?>
このファイルがa.phpで、hogeというディレクトリに入っていて、a.phpを実行するとCOOKIEと表示されます。
で、a.phpをhoge2というディレクトリに入れると、COOKIEと表示されないのです。
064962804/08/19 19:16ID:???
>>642
世の中には「偶数側に丸める(round(166.5)→166, round(167.5)→168)」
という丸め方法があって「銀行型の四捨五入」と呼ばれています

それに一貫性がないってのは……、銀行に文句を言ってみてくださいね(苦笑
0650nobodyさん04/08/19 19:20ID:???
>>641
うまくできました!
本当にありがとうございました

結婚させてください!
0651nobodyさん04/08/19 19:28ID:???
if(isset($_COOKIE['ck'])){
echo "COOKIE";
}
これって間違ってますか_?
なぜディレクトリ変えただけでクッキーの値取れないのだろう(汗
065262004/08/19 19:32ID:???
なるほどね、トンクス
とりあえず銀行に文句言ってくるわ
0653nobodyさん04/08/19 19:34ID:???
>>620
ネタ乙
0654Imo ◆.jC7ANgFY. 04/08/19 19:34ID:???
>>651
setcookieのオプションを全部うめてみればいかが?
■ このスレッドは過去ログ倉庫に格納されています