弐ch編集のphp講座
■ このスレッドは過去ログ倉庫に格納されています
まず最初は<?php
print("始まり");
?>
これでいいです >>117
いや別にどっちでもよかったような、、
ミスとか少しでも疑問に思ったら質問くらへ〜 >>118
外したら
Parse error: parse error in /どこか/bbs.php on line 3
だって。 このスレジャックしてPerl講座にしていいですか? >>120
ヽ(`Д´)ノダメ!スレ立テテヤッテクレ。 >>112
fopen()の戻り値はファイルハンドルだから$filenameよりは
$fhandle,$fhとかCの参考書みたく$fpみたいな感じにした方が誤解ないと思うよー >>124
サンクス!またミスやそれはチョット、、って言うのあったら指摘お願い
暇があったらまだ教えてない簡単なとこ教えてあげてくらはい。
>>120
マジレスして悪いがここはphpがどんなもんか知りたい人が来てるんだから
やめてくれ。
あと本当お前って自分に酔ってんな、笑い
じゃぁ! >>119
あれ?どうだっけ、、自分でもあんま覚えて無いや、悪い
じゃあ""これ付けないと駄目って事にしといてください(;;)
>>117
マニュアルには1文字でも囲むように例示してあるから
囲っといた方がいいのではないかと。
それより、その前の、ファイルの場所が気になる。
変数だけなんだったら囲わないんじゃないかな。普通。
ま、好みだからいいけどさ。たぶんちゃんと動くし。 文字列は囲わないとマズイでしょ。
連想配列の添え字は""いらないけど。 とりあえずコピペと、一行追加した程度だけど出来た
http://kkkkk.s4.xrea.com:8080/nihen/bbs.php
でもなぜか改行が出来ない。
これ print("$bbs[$i] <br>\n"); じゃダメかな?教えてくださいませ。
使ったソース全部 ↓
<FORM method="POST" action="bbs.php">
<INPUT size="20" type="text" name="msg"><INPUT type="submit" value="送信"></FORM>
↓最新カキコ5件↓<br>
<?php
$fl = "log.htm";
$filename = fopen("$fl","a+");
fwrite($filename,$msg);
fclose($filename);
$bbs=file("$fl");
for($i=0;$i<5;$i++)
{
print("$bbs[$i] <br>\n");
}
?> >>130
こんな感じ?違ったら詳しく説明きぼぬ。
<?php
$fl = "log.htm";
$filename = fopen("$fl","a+");
$msgg="$msg<BR>";
fwrite($filename,$msgg);
fclose($filename);
$bbs=file("$fl");
for($i=0;$i<5;$i++)
{
print("$bbs[$i] <br>\n");
}
?> あと常識なのかもしんないけど、一応。
112のミニ弐編姫のソースの部分を、bbs.phpっていうファイル名で保存して、
同時にログ書き込み用のlog.htmを0byteの中身空っぽ状態で作成。
で、二つを同じところにアップロードして、log.htmはのパーミッションは666に。
っていう三つのことをやらないと動きませんです。
オイラ含む、HTML程度の厨房のために書いときまし。 出来たです!!
えーと、
$msgg="$msg<BR>"; この部分てのは、
log.htmの中でログとして書き込まれるときに
改行しとくってことだよね。
それもやりつつ、
print("$bbs[$i] <br>\n");
printするときも改行っていう解釈でよろしゅうございましょうか?
とすると、for($i=0;$i<5;$i++)
これって、五回forの中を繰り返すって言う意味でしたよね?
だったら最新の5行を表示ってことなのかなと思ったんですけど。
違うのかな? >>133
>print("$bbs[$i] <br>\n");
>printするときも改行っていう解釈でよろしゅうございましょうか?
あ、ごめんコピペして消し忘れてた<br>\nここはいらないや、、
>for($i=0;$i<5;$i++)
>これって、五回forの中を繰り返すって言う意味でしたよね?
>だったら最新の5行を表示ってことなのかなと思ったんですけど。
>違うのかな?
う〜んfile関数で配列に埋め込まれたのを5番まで呼び出すって事です
じゃぁ寝るんで、オヤスミ明日もきてくれや〜 5番まで、、、
何がどう5番なのかチトーモわかりませんので、勉強してみます。
姫、乙でした。 う、、、いじってみたらリロードする度に書きこまれるキチガイスクリプトができた・・・ >>131>>134
$msgg="$msg<BR>";
じゃなくて
$msgg="$msg\n";
な。
<br>だとログファイル内で改行されないので
file($fp);
で読み込めない。
70が改行できてないのは$bbsの中身が$bbs[0]しかないからだと思われ ちなみに
ほげ
弐編姫
あばば
と書き込んだ場合、
frwite($fp, $msg);
で書き込むとログファイルの中身は
ほげ弐編姫あばば
出力は
ほげ弐編姫あばば
$msg="msg<br>";
frwite($fp, $msg);
で書き込むとログファイルの中身は
ほげ<br>弐編姫<br>あばば
出力は
ほげ
弐編姫
あばば
となる。
ちなみに両方ともforは一度しか実行されない。 >>138
訂正。
$msg="msg<br>";
→$msg="$msg<br>"; あれ?139さんの言うとおりしたら8行目がエラーになったよ。
http://kkkkk.s4.xrea.com:8080/nihen/bbs.php
で、ソースが
<FORM method="POST" action="bbs.php">
<INPUT size="20" type="text" name="msg"><INPUT type="submit" value="送信"></FORM>
↓最新カキコ5件↓<br>
<?php
$fl = "log.htm";
$filename = fopen("$fl","a+");
$msg="$msg<br>";
frwite($fp, $msg);
fclose($filename);
$bbs=file("$fl");
for($i=0;$i<5;$i++)
{
print("$bbs[$i]");
}
?>
>>140
$filename = fopen("$fl","a+");
を
$fp = fopen("$fl","a+");
にしろ。 $fp = fopen($fl , "a+");
これじゃいかんのですか? fclose($filename);
も
fclose($fp);
にしろ。 ありがと>>139,>>144
出来た模様です。
そして、136さんのようにリロードすると同じのが書き込まれるという
ステキスクリプトになっているのでどうにかしたい気持ちです。 ↑で指摘されてるように、
書き込むデータの改行を<br>じゃなくて\nにしないと
読み込んだときに複数データとしてばらしてもらえないよ。
それが証拠に5行以上表示されてるでしょ?
つまりforが機能していない。
$bbs[0]に全部のデータが1行で格納されちゃってます。 単純にコレ
$msg="$msg\n";
だけじゃダメみたいですな。 リロードで書き込ませたくなければ・・・
ヒント
1:HTMLフォームの、nameが変数名に、valueが変数の値となる。
2:リロードの際は送信ボタンは押されない
3:一番最初にやった条件分岐を使う
やってみよう。 >>48
HTMLは<br>がないと改行されない。
ファイルは\nがないと改行されない。
だから両方入れればよい。
ファイル書き込みの際に\nを入れて、
HTML表示のprint()のときに<br>を入れる。
これがスマートなんかな。
ファイルに<br>書き込んじゃってもいいけどね。 苦労してるなぁ。
PHPの場合は
<?=$value?><br>
がスマートっぽい なるほど。できた。
http://s7.xrea.com:8080/~readcgi/nihen/ex.php >>150さんのやりかたで改行は出来たけど再読み込み処理が出来ないよん。
ただいま修行中。 ちなみに、
test.php
と一緒に
test.phps(中身はtest.phpと同じ)
ってファイルを作ってアップロードしておくとweb上からtest.phpのソースが参照できるよ。 再読み込みつか、リロードしても書き込まれない処理、のことでした。
ゴメソ。 ファイルに書き込む処理を、送信ボタンが押されたときのみにすればいい。
たぶん今は呼び出されるたびに書き込むようになってるんじゃない?
それだとリロードどころか最初に呼び出したときにも空文字書き込んでると思うよ。
とりあえず処理とhtmを一緒にしないかifを使うか?
これで改行をかいれタンだけど、、どうかな?ドキドキ
<HTML>
<BODY>
<FORM method="POST" action="bbs.php"><INPUT size="20" type="text" name="msg"><INPUT type="submit" value="送信"></FORM>
<?php
if($submit=$msg)
{
$fl = "log.htm";
$filename = fopen("$fl","a+");
fwrite($filename,$msg."\n");
fclose($filename);
$bbs=file("$fl");
}
for($i=0;$i<5;$i++)
{
print("$bbs[$i]<BR>");
}
?>
</BODY>
</HTML> あれごめん書き込みのいちおかしいや、治してうpする
↑は無視して あれ基礎的なこと色々わすれてるや〜、じゃあ今日は休みで
基礎から俺も勉強しなおしてくるんで、明日、明後日再開です
ご め ん な つーか勉強できるような日じゃなかったしね・・・
そーす。
http://s7.xrea.com:8080/~readcgi/nihen/source.php?ex.php <HTML>
<BODY>
<FORM method="POST" action="bbs.php">
<INPUT size="20" type="text" name="msg">
<INPUT name="submit" type="submit" value="送信">
</FORM>
<?php
if($submit=="送信")
{
$filename = "log.htm";
$fp = fopen($filename ,"a+");
fwrite($fp,$msg . "\n");
fclose($fp);
$bbs=file($filename);
}
for($i=0;$i<5;$i++)
{
print("$bbs[$i]<BR>");
}
?>
</BODY>
</HTML>
これでどうかな?
ちょっと今動作確認できる環境が手元にないんで確認できないんだが。
ミスってたらごめん。
おそらく159の意図どおりリロードで書き込まないようになってると思う。
ただこれだと最新5件じゃなくて最初の5件にならない?
追記モードって確か最後に付け足すんじゃなかったっけ。
最新5件にするにはforの部分を少しいじらなきゃいけないな。 >>164
それだとリロードするとlogの内容も取得できなくない?
<HTML>
<BODY>
<FORM method="POST" action="bbs.php">
<INPUT size="20" type="text" name="msg">
<INPUT name="submit" type="submit" value="送信">
</FORM>
<?php
if($submit=="送信")
{
$filename = "log.htm";
$fp = fopen($filename ,"a+");
fwrite($fp,$msg . "\n");
fclose($fp);
}
$bbs=file($filename);
$bbs=array_reverse($bbs);
for($i=0;$i<5;$i++)
{
print("$bbs[$i]<BR>");
}
?>
</BODY>
</HTML>
でリロードの場合投稿されず&最新の5件を表示になると思う。 >>165
ありがと、やり方忘れてた、感謝〜〜!!!!
わかり易いようにソース書き直したけどいいのかな??
解説
<?php
$fl="log.htm";
if($msg)
{
$fp=fopen("$fl","a+");
fwrite($fp,$msg."\n");
fclose($fp);
}
$bbs=file($fl);
$bbs=array_reverse($bbs);←array_reverseっていう関数は
配列を逆にして返すって意味ね
for($i=0;$i<5;$i++)
{
print("$bbs[$i]<BR>");←それで逆から読みだしてる
}
?>
次回とう言うか今日だが本格的にテーブル等を使い掲示板を作る! >ミニヘン
お前漏れこのスレ楽しみにしているので
せいぜいがんばってください。 fclose($fp);
header("Location: ./bbs.php");
じゃダメ? ういうい。
http://s7.xrea.com:8080/~readcgi/nihen/test3.php
http://s7.xrea.com:8080/~readcgi/nihen/source.php?test3.php $msg=ereg_replace("<", "<", $msg);
$msg=ereg_replace(">", ">", $msg);
タグ消し >173
$msg = htmlspecialchars ($msg);
こんなんでいいの?
上のスクリプトに足してみた。
タグ禁止。 >>174
著作権表示消したらいかんよ
/* source view==PHP4 Only!== by ToR */
/* ->source.php?target.php */
>68
反応遅れてごめんなさい〜。
こんなページあったんだ・・・。
とりあえずみてみるよ。
ありがと〜。
そういえば、PHP4.1.0からpost/getされたデータを
グローバル変数で取り出すの、非推奨になってたんだね。
>176
ゴメソ。まともにダウンせずに、サイトに直で載ってたソースコピペしちゃってた。
直しまスた。
出来たできた〜、
やっぱフレームやめたは
ビルダー作だけど
htmlから
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META name="GENERATOR" content="IBM WebSphere Studio Homepage Builder Version 6.5.0.0 for Windows">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE></TITLE>
<BODY bgcolor="#619fbe" text="#ffffff">
<BLOCKQUOTE>
<form method="post" action="bs.php">
<DIV align="center">名前<BR>
<tt><INPUT name="name" type="text" size="24"><br>
本文<br>
<TEXTAREA name="com" cols="21" rows="9"></TEXTAREA><br>
<input type="submit" value=" Send "><br>
</tt></DIV>
</form><hr>
<?php
/* 設定 */
$logfile = "sample2.htm";//ログファイル名
$viewmax = 5; //表示行数
$logmax = 100; //保存最大行数
/* 書き込み処理 */
if($name && $com)
{
$com = str_replace("\r\n", "\r", $com);//Win系は\r\n
$com = str_replace("\r", "\n", $com); //Mac系は\r
$com = nl2br($com);//改行文字の前に<br />追加
$com = str_replace("\n", "", $com);//\n除去
$dat = "<P align=\"center\">$name<BR><BR><BR>$com</P>\n";
//ログに書き込む
$lines = file($logfile); //いままでのログを配列に読み込む
$fp = fopen($logfile, "w"); //ログをオープン(空になる)
fputs($fp,$dat); //データを書き込む(先頭に)
for($i = 0; $i < $logmax-1; $i++) //いままでの分を追記
fputs($fp, $lines[$i]); //(配列0-98→現ログ1-99行目)
fclose ($fp);
}
//表示処理
$lines = file($logfile);
for($i = 0; $i < $viewmax; $i++)
{
print("$lines[$i]<HR>");
}
?>
</BLOCKQUOTE>
</BODY>
</html>
ここ結構マネてんだけどね
http://php.s3.to/tt/tt5.php#multi
↓ソース解説、少しまってちょ <?php
/* 設定 */
$logfile = "sample2.htm";//ログファイル名
$viewmax = 5; //表示行数
$logmax = 100; //保存最大行数
/* 書き込み処理 */
if($name && $com)←&&は〜と〜って意味
{
$com = str_replace("\r\n", "\r", $com);//Win系は\r\n←str_replace関数は置き換え関数みたいな感じ
$com = str_replace("\r", "\n", $com); //Mac系は\r
$com = nl2br($com);//改行文字の前に<br />追加←<BR>タグいれてくれる関数nl2br
$com = str_replace("\n", "", $com);//\n除去
$dat = "<P align=\"center\">$name<BR><BR><BR>$com</P>\n";
//ログに書き込む
$lines = file($logfile); //いままでのログを配列に読み込む
$fp = fopen($logfile, "w"); //ログをオープン(空になる)
fputs($fp,$dat); //データを書き込む(先頭に)
for($i = 0; $i < $logmax-1; $i++) //いままでの分を追記
fputs($fp, $lines[$i]); //(配列0-98→現ログ1-99行目)
fclose ($fp);
}
//表示処理
$lines = file($logfile);
for($i = 0; $i < $viewmax; $i++)
{
print("$lines[$i]<HR>");<HR>は水平線
}
?>
宿題
何か作ってきて
次回 明日はお休み
カウンタ作ってみる? すまん急いで作ってんでわけわからんかもしれん、
またすっげー(・∀・)イイの作ってだすから〜ん!
今回わけわからんかった人も次の解説まってチヨ! >>184
>何か作ってきて
だった。何かって・・? >>184
ぃゃぁあのhtmlを駆使してイカシテル掲示板とか、
じゃんけんスクリプトとか何でもいいんで、おもろいもん、自分で
何か作るのが一番の勉強だからさ
>>186
俺が?
あと
>>167
>>168
ありがとーう!!!
>>169
意 味 が わ か ら ん
>漏れこのスレ楽しみにしてるから
ありがとう
>>せいぜいがんばれよ
はぁ?どっちやねん(´ω`;;;;) じゃあ寝るんで、お休みなさい明後日から再開します
じゃぁ! ミニ編さん、perlをやってるのですが、
PHPを勉強する利点ってありますか? >>181
ミニ編さま、講師おつかれさまですー。
個人的に 181の別解おもいついたのですが、効率を重視して(?)、
こういうのはどうでしょうか?
181の書き込み処理を軽くすませる方法(・∀・)
新たな命令 array_shift / array_slice / implodeつかってしまいました(´Д`;)
181の14行目〜21行目
//ログに書き込む-----------------------------------------------------------------------
$lines = file($logfile); //いままでのログを配列に読み込む
$lines = array_shift($lines,$dat); //配列の先頭に新しい要素(データ)を追加
$lines = array_slice($lines,0,$logmax); //配列の先頭[0]の要素から、指定個数($logmax)だけ残す
$write_data = implode($lines,""); //配列の内容を1つの文字データに結合
$fp = fopen($logfile,"w"); //ログファイル書き込みオープン
fwrite($fp,$write_data); //書き込み
fclose($fp); //クローズ
//------------------------------------------------------------------------------------- {192の補足コメント}
一度ログを配列にとりいれたのなら、配列だけで一度に新しい情報の追記などの処理をしてしまう。
書き込みは最後にfwrite一度のみで、済ませていまふ。
今回はforループ内で書き込み処理を使っていません。
forループで繰り返し書き込み処理(fputやfwriteなど)を行うと、保存行数が増えたとき、
(たとえば非現実的ですがログ保存行数が5000行とか)重くなるなど、のデメリットがあるため。
保存行数5000行ならループを5000回繰り返すことになるです(゚∀゚;)
以上、勝手な解釈ですみませぬ。m(_ _)m 1 名前:ミニ編 ◇aCDPDEl2 投稿日:2002/02/13(水) 22:07
http://pc.2ch.net/test/read.cgi/php/1012902013/l50
ここに俺odnADSLだからしばらく書けないかもって書いてきてください
ですって 1 ミニ編 ◇aCDPDEl2 2002/02/13(水) 22:07
俺odnADSLだからしばらく書けないかも
193のarray_shiftはarray_unshiftの間違いでしたm(_ _)m
失礼しました。 負荷のことはよくわからないが、
193のやり方がすっきりしてていいと思う。
でもどちらがサーバにやさしいんだろう?
5000行ぽっちじゃなくて
50万行くらいいったら差が出るんかな?
>>200
ステップ数よりも処理の内容によるでしょ。 >>200
50万行を配列にいれちゃうの?
ブルブル… あ、なんか勘違いしてた(;´Д`)
逝ってきます。 >202
foreachで回さない限り、破綻はしないけどね。
ま、アクセスが強烈なサイトだったらやめた方がいいかもね。
一日一万アクセス程度のサイトだったら、50万レコードの配列程度じゃびくともしなかったよ。
(ていうことは、やったということだけどね)
ちなみにサーバは、500MHz程度のペンティアムに512MBのメモリのLinuxだった。
whileで回して、lastで抜けてたけどね。 >205
foreachは、配列をいったん評価してからループにはいるから、配列の中身が50万個あると、
その50万個を評価するのに時間とリソース食う。
whileなら、さみだれ式に処理するから、めっかったところでなんか処理したらいい。
ただし、keysやvalues使っちゃうとwhileでも巨大なメモリ消費になるので、危険は危険。
eachで逐次処理するのが一番もっともらしいかな?
ただ、重いのは重いよ、やっぱし。
どきどきしちゃう。 Web Arena って PHP3.PHP4使用できるって書いて有るけど、制約が有るみたいな事も書いてある
普通に動かすことってできるのですか?
過去ログに有ったらすみません、場所教えてください。
PHP 素人です。 >>208
ホスティングサービスのPHP制限って言ったらセーフモードだろ(予想
あと、スレ違いな( `Å´) ミニ弐編!早く帰って濃い! みんなお前を待ってるぞ! いや、セーフモードでいいと思うよ
制限かかってるといってもsystem()とかそういうやつなので
こった事やろうと思わないなら問題ないと思う ereg(.., .., $regs);
$regs[1] ←$1 ミニ編いなくなっちゃったから、俺がしきるかなヽ(´ー`)ノ ■ このスレッドは過去ログ倉庫に格納されています