PHPで掲示板の作り方

1行掲示板(連続投稿○、ページ切替型)

HTMLはHTML5を使います。metaタグやスタイルはメンドイので適用しませんが、適用させるなら空欄に入れて下さい(formのidやnameも同様)。各フォームの解説は、フォームの種類を参照。

ただし、インプットエリアのname属性はPOSTやGETでデータを受け渡す時の連想配列キーとして使うため、入力必須です。

1行掲示板(連続投稿○、ページ切替型)サンプル

<!--メインページ-->
<!DOCYTYPE html>
<html lang="ja">
<head>
<title>掲示板1</title>
<meta name="description" content="" />
<meta name="keywords" centent="" />
<link rel="stylesheet" href="" media="all" />
</head>
<body>
<form id="x1" name="x1" method="post" action="ex1.php">
<input type="text" name="body" size="40" maxlength="5" />(5文字まで)
<input type="submit" value="書き込み" />
</form>
<?php 
$data=file("./data.txt");//data.txtのデータを1行ずつ配列に入れる。$data[0]が1行目。
 
for($i=0;$i<count($data);$i++){//countで$data配列の要素数を調べる
    $no=$i+1;
    echo("記事No".$no.":".$data[$i]."<br /><hr />");
}
?>
</body>
</html>

inputでは、サイズで横幅を、maxlengthで最大入力文字数を設定することができます。submitボタンはinput要素のnameをキーとして取り出すvalueの値を送信するためには必須。

これらのタグをフォームタグで囲むことで、submitボタンを押すと、formに指定したaction属性のターゲット先(例ではex1.php)へと、POST方式で、{'name'=>'value'}の連想配列として送ります。

ex1.phpに飛ばしたデータをdata.txtに書き込む(追記)。戻ると追記されたファイルを読み込むので掲示板の行が増える。

<!--ex1.php-->
<?php 
header("Content-Type:text/html; charset=UTF-8");//summitで飛んだページの文字化けを防ぐために
?>
<!DOCYTYPE html>
<html lang="ja">
<head>
<title>掲示板1</title>
<meta name="description" content="" />
<meta name="keywords" centent="" />
<link rel="stylesheet" href="" media="all" />
</head>
<body>
<?php 
 
//スパム無効化関数
function newstring($string) {
    if(get_magic_quotes_gpc()){
    $string = stripslashes($string);
    }
$string = htmlspecialchars($string,ENT_QUOTES,'utf-8');
$string = str_replace(",",",",$string);
$string = str_replace(array("\r\n","\n","\r"),"<br>",$string);
return $string;
}
//無効化ここまで
 
if($_POST["body"]){//$_POST["name"]でvalue値を取り出す。
    $body=newstring($_POST["body"]);//取り出した値が悪意のあるタグのこともあるので上で定義した無効化関数で無効化。
     $body=$body."\n";//改行を加えておく
    $fp=@fopen("./data.txt","a");//@はエラーメッセージを非表示。aは終端に書き込みの意味、ファイル存在しない時は新規作成
    flock($fp,LOCK_EX);//書き込みの時は排他的ロックを使う。
    fputs($fp,$body);//$fp(開いたファイル)に対してbodyの内容を追記
    fclose($fp);//ファイルを閉じる
    echo("書き込み完了。<a href='1.php'>戻る</a>");
}
 
?>
</body>
</html>

str_replace(“,”,”,”,$string)で半角カンマを全角カンマに変換。str_replace(“a”,”b”,c)は、cのaをbに変えるという意味。

str_replace(array(“\r\n”,”\n”,”\r”),”
“,$string)で改行タグをbrに変換。配列をa部分に指定すると、中身全てが置き換わるみたい。これによりテキストエリア内に改行つきで記述してもタグに変換されるので2行扱いにならない。

最後のif文以降は¥タグを付加する記述です。phpの設定ファイル(php.ini)のmagic_quotes_gpcがOnになっていると、自動でエスケープされ¥が付加されますが、SQLコマンドで使用する時はこれでいいけど、ブラウザで表示したい時はエスケープしたままだと、特定の文字に¥マークが入って文字化けみたくなることがあるので、今回のようなブラウザにそのまま表示したい時は、php.iniの設定がOnかどうかをチェックして、On(1)なら¥を取り除く。

if文の中はmagic_quotes_gpc==1が省略された形。trueなら省略可、逆にfalseなら!magic_quotes_gpcとすればOK。

convString()の引数に指定された変数は、これらのエスケープを順番に受けて、整形された変数($string)がreturnで返されます。

1行掲示板(連続投稿○、ページ移動なし)

「書き込み完了しました」的なコメントを出す必要がなければ、無理にページ移動をする必要はありません。あと、簡単なスパム対策(ほぼ意味ないけど)としてパスワードを入力しなければ投稿できないようにしてみます。

無効化関数はhead内に移動。body内が以下。

パスワード入力欄を作って、もしbodyがtrueでかつpassが1139だったらというif文を加える。actionの先を空文字もしくはaction="<?php echo $_SERVER['PHP_SELF'] ?>"のようにして、送信先を今開いているphpファイルに指定する。

書き込みはfopenを使った、ファイルを開いて行う処理、読み込みはfile()関数を使った、ファイルを開かずに行う処理ということで、ちょっとごちゃまぜですが、書き込みも読み込みもファイルを開かずに行うほうが主流なのかもしれません(ファイル操作)。

1行掲示板(連続投稿○、ページ移動なし)サンプル

<body>
<form id="x1" name="x1" method="post" action="">
<dl>
<dt><label for="body">インプットエリア(10文字まで)</label></dt>
<dd><input type="text" id="body" name="body" size="40" maxlength="10" /></dd>
<dt><label for="body">パスワード(1139)</label></dt>
<dd><input type="password" id="pass" name="pass" size="10" maxlength="4" /></dd>
</dl>
<input type="submit" value="書き込み" />
</form>
<?php 
if(!empty($_POST["body"])&&($_POST["pass"]==1139)){
    $body=newstring($_POST["body"]);
    $body=$body."\n";
    $fp=@fopen("./data.txt","a");
    flock($fp,LOCK_EX);
    fputs($fp,$body);
    fclose($fp);
}
$data=file("./data.txt");
 
for($i=0;$i<count($data);$i++){
    $no=$i+1;
    echo("記事No".$no.":".$data[$i]."<br /><hr />");
}
?>
</body>
メソッド 0(ゼロ) 空文字”” null 未定義
empty() true true true true
isset() true true false false

複数行掲示板(連続投稿○、ページ移動なし)

1行掲示板を複数行の掲示板に作り変えるのは簡単で、inputのテキストボックスをテキストエリアに変えるだけです。改行情報も保持されます。

複数行掲示板(連続投稿○、ページ移動なし)サンプル

<form id="x1" name="x1" method="post" action="">
<dl>
<dt><label for="body">インプットエリア(10文字まで)</label></dt>
<dd><textarea id="body" name="body" cols="50" rows="10" maxlength="10"></textarea></dd>
<dt><label for="body">パスワード(1139)</label></dt>
<dd><input type="password" id="pass" name="pass" size="10" maxlength="4" /></dd>
</dl>
<input type="submit" value="書き込み" />
</form>

複数行掲示板(連続投稿×、ページ移動なし)

これに連続投稿をできないような仕組みを導入してみます。

ブラウザに情報を記録させておくSESSION命令を使います。これを使うためには、セッションを使うという決まり文句である、session_start()を最初に使って、セッション配列のどのキーにどの値を割り当てるのかを選択しなければなりません。

この場合では、$_SESSION['jikan']に対して値を入れています。@マークは最初変数が未定義だとnoticeエラー?がでることもあるので一応。設定ででなくもできますがね。

複数行掲示板(連続投稿×、ページ移動なし)サンプル

session_start();
 
if(!empty($_POST["body"])&&($_POST["pass"]==1139)){
    if(!@$_SESSION['jikan']){
        $_SESSION['jikan']=1;
    }
    if($_SESSION['jikan'] < time()){
    $body=newstring($_POST["body"]);
    $body=$body."\n";
    $fp=@fopen("./data.txt","a");
    flock($fp,LOCK_EX);
    fputs($fp,$body);
    fclose($fp);
 
    $jikan=time()+60;
    $_SESSION['jikan']=$jikan;
    }else{
    echo("連続投稿不可<br /><br />");
    }
}

time()関数は現在時刻を Unix エポック (1970 年 1 月 1 日 00:00:00 GMT) からの通算秒として返します。実際の値は13333333みたいな数。ちなみにdate()関数は、javascriptと違って引数をymdで指定してあげないと値を引き出せない。

複数行掲示板(1ページ内表示数制限型)

一度に表示させる件数が1000行とかになると縦になが~く見づらいので、1ページ当たり5つの記事だけを表示させて、次のページと前のページボタンで切り替えるようにします。

部分部分を変えるとわかりにくいんで、一旦body内を全部さらします。追加になっているのは33行目から74行目までです。

複数行掲示板(1ページ内表示数制限型)サンプル

<body>
<form id="x1" name="x1" method="post" action="">
<dl>
<dt><label for="body">インプットエリア(10文字まで)</label></dt>
<dd><textarea id="body" name="body" cols="50" rows="10" maxlength="10"></textarea></dd>
<dt><label for="password">パスワード(1139)</label></dt>
<dd><input type="password" id="pass" name="pass" size="10" maxlength="4" /></dd>
</dl>
<input type="submit" value="書き込み" />
</form>
<?php 
session_start();
 
if(!empty($_POST["body"])&&($_POST["pass"]==1139)){
    if(!@$_SESSION['jikan']){
        $_SESSION['jikan']=1;
    }
    if($_SESSION['jikan'] < time()){
    $body=newstring($_POST["body"]);
    $body=$body."\n";
    $fp=@fopen("./data.txt","a");
    flock($fp,LOCK_EX);
    fputs($fp,$body);
    fclose($fp);
 
    $jikan=time()+60;
    $_SESSION['jikan']=$jikan;
    }else{
    echo("連続投稿不可<br /><br />");
    }
}
$Redata=file("./data.txt");
$data=array_reverse($Redata);//記事が古いのが上で、新しいのが下というのはあれなので、array_reverse($Redata)で配列順序を逆にします。
$kensu=count($data);//配列要素の数を数える(記事の総数)
$no=array();//記事が逆だとNOも逆にしないとなので。記事配列とは別にナンバー配列も作っておく。
for($i=0;$i<$kensu;$i++){
$no[]=$kensu-$i;
}
if(empty($page)){//ページが0または空ならページは1
    $page=1;
    }
if(!empty($_REQUEST['page'])){
    $page=$_REQUEST['page'];
}
$page=max($page,1);//ページを1より小さくはしないように。
$maxPage=ceil($kensu/5);//最大ページは記事の総数割る5を切り上げた番号
$page=min($page,$maxPage);//ページは最大ページを超えないように
if($page > 1){//URLにキーと値を直接打ち込んで自分自身に送信して$pageの値を切り替える
?>
<p><a href="5.php?page=<?php echo($page-1);?>">前のページ</a></p>
<?php 
}else{
?>
<p>前のページ</p>
<?php 
}
if($page < $maxPage){
?>
<p><a href="5.php?page=<?php echo($page+1);?>">次のページ</a></p>
<?php 
}else{
?>
<p>次のページ</p>
<?php 
}
 
$start=$page*5-5;//開始位置を測るための変数
$end=min($kensu,$page*5);//今いるページが1ページ目なら5、2ページ目なら10まで。(終了位置を測るための変数)
 
for($i=$start;$i<$end;$i++){
    $number=$no[$i];
    echo("記事No".$number.":".$data[$i]."<br /><hr />");
}
echo("pageは、".$page."<br />");
?>
</body>

まず、

複数行掲示板(入力項目多数、チェック○、ページ移動あり)

名前と件名を加えて、より掲示板らしく整形してみます。

未入力なら0、入力は1として、全ての欄が入力(全部1)されているなら、セッションにその値を記録して、action属性ではなく、phpのヘッダーにて別ファイルに飛ばします。セッションに記録されているため、飛ばされてもデータは保持されます。

複数行掲示板(入力項目多数、チェック○、ページ移動あり)サンプル

<body>
<form id="x1" name="x1" method="post" action="">
<dl>
<dt><label for="name">名前(10文字まで)※必須</label></dt>
<dd><input type="text" name="name" id="name" size="50" maxlength="10" /></dd>
<dt><label for="sub">件名(10文字まで)※必須</label></dt>
<dd><input type="text" name="sub" id="sub" size="50" maxlength="10" /></dd>
<dt><label for="body">インプットエリア(10文字まで)※必須</label></dt>
<dd><textarea id="body" name="body" cols="50" rows="10" maxlength="10"></textarea></dd>
<dt><label for="password">パスワード(1139)</label></dt>
<dd><input type="password" id="pass" name="pass" size="10" maxlength="4" /></dd>
</dl>
<input type="submit" value="書き込み" />
</form>
<?php 
session_start();
 
$error=array();//1をtrueに、0をfalseに
if(empty($_POST['name'])){$error['name']=0;}else{$error['name']=1;}
if(empty($_POST['sub'])){$error['sub']=0;}else{$error['sub']=1;}
if(empty($_POST['body'])){$error['body']=0;}else{$error['body']=1;}
if($error['name'] && $error['sub'] && $error['body'] && ($_POST['pass']==1139)){
    $_SESSION['dat']=$_POST;
 
    header('Location:ex3.php');//ヘッダーで飛ばす
    exit();//これ以降の処理はしない
    }
$Redata=file("./data.txt");
$data=array_reverse($Redata);
 
$kensu=count($data);
 
$no=array();
for($i=0;$i<$kensu;$i++){
$no[]=$kensu-$i;
}
if(empty($page)){
    $page=1;
    }
if(!empty($_REQUEST['page'])){
    $page=$_REQUEST['page'];
}
$page=max($page,1);
$maxPage=ceil($kensu/5);
$page=min($page,$maxPage);
if($page > 1){
?>
<p><a href="6.php?page=<?php echo($page-1);?>">前のページ</a></p>
<?php 
}else{
?>
<p>前のページ</p>
<?php 
}
 
if($page < $maxPage){
?>
<p><a href="6.php?page=<?php echo($page+1);?>">次のページ</a></p>
<?php 
}else{
?>
<p>次のページ</p>
<?php 
}
$start=$page*5-5;//開始位置を測るための変数
$end=min($kensu,$page*5);//今いるページが1ページ目なら5、2ページ目なら10まで。(終了位置を測るための変数)
 
for($i=$start;$i<$end;$i++){
    $number=$no[$i];
    list($name,$sub,$body)=explode("|",$data[$i]);
    echo("記事No".$number." 題名:".$sub." 投稿者:".$name."<br />".$body."<br /><hr />");
}
?>
</body>

explode(A,B)は、BをAで分割して、配列に入れるという命令。$arr=explode()なら、$arrは[a,b,c]のようになるが、ここではlist()を使って配列にしないで分割された順番に直接変数に格納している。

//ex3.phpのbody内
<body>
<?php 
session_start();
 
if($_SESSION["dat"]){
    if(!@$_SESSION["jikan"]){
        $_SESSION["jikan"]=1;
    }
    if($_SESSION['jikan'] < time()){
    $name=newstring($_SESSION["dat"]["name"]);
    $sub=newstring($_SESSION["dat"]["sub"]);
    $body=newstring($_SESSION["dat"]["body"]);
    $body=$name."|".$sub."|".$body."\n";
    $fp=@fopen("./data1.txt","a");
    flock($fp,LOCK_EX);
    fputs($fp,$body);
    fclose($fp);
 
    $jikan=time()+60;
    $_SESSION['jikan']=$jikan;
    echo("書き込み完了<br /><a href='6.php'>戻る</a><br /><br />");
    }else{
    echo("連続投稿不可<br /><a href='6.php'>戻る</a><br />");
    }
}
?>
</body>

複数行掲示板(入力項目多数、チェック○、ページ移動なし)

入力項目のチェックをページ移動なしで行うためには、javascriptを使う必要があります。(たぶん)

チェックを行う方法でパッと思いつくのがalert()を使う方法。これは非常に簡単。以下はhtmlの部分のみ

複数行掲示板(入力項目多数、チェック○、ページ移動なし、alert)サンプル

<html lang="ja">
<head>
<title>掲示板2</title>
<meta name="description" content="" />
<meta name="keywords" centent="" />
<link rel="stylesheet" href="" media="all" />
 
<script>
function check(){
    if((document.getElementById('name').value=="")||(document.getElementById('sub').value=="")||(document.getElementById('body').value=="")){
    alert("必須事項を入力してください");
        return false;
    }else{
        return true;
    }
}
</script>
</head>
<body>
<form id="x1" name="x1" method="post" action="" onsubmit="return check()"><
<dl>
<dt><label for="name">名前(10文字まで)※必須</label></dt>
<dd><input type="text" name="name" id="name" size="50" maxlength="10" /></dd>
<dt><label for="sub">件名(10文字まで)※必須</label></dt>
<dd><input type="text" name="sub" id="sub" size="50" maxlength="10" /></dd>
<dt><label for="body">インプットエリア(10文字まで)※必須</label></dt>
<dd><textarea id="body" name="body" cols="50" rows="10" maxlength="10"></textarea></dd>
<dt><label for="password">パスワード(1139)</label></dt>
<dd><input type="password" id="pass" name="pass" size="10" maxlength="4" /></dd>
</dl>
<input type="submit" value="書き込み" />
</form>

見れば分かる通り、DOMで要素を指定して、その要素のどれかが空なら、alertで注意喚起して、falseを返す。返されたfalseはonsubmit()の中でreturnとくっついて、return falseとなってsubmit命令はストップされる。

でも、未記入の項目がどれかまではわからないんですねこれは。未入力のテキストボックスの下に「入力して下さい」のようなコメントを出るようにしたいこともあったり。

jQueryでやってもいいんですけど、あえてjavascriptで力づくでやってみました。

複数行掲示板(入力項目多数、チェック○、ページ移動なし、力づく)サンプル

多くは語りません。creatElementとかを使う方法もあるでしょう。もちろんこんなスパゲティにしないで条件分岐させる方法もあるでしょう。forとifくらいしか構文使えないんで。。。caseとかがいいんかな?

<script>
function check(){
    var enter ="※入力して下さい。";
    var nameElement=document.getElementById("namecheck");//.innerHTMLまでを変数に入れるとうまく動かない
    var subElement=document.getElementById("subcheck");
    var bodyElement=document.getElementById("bodycheck");
    if(document.getElementById('name').value==""){//nameが空なら、入力して下さいの文字を出現させる。name:sub:body×××
        nameElement.innerHTML=enter;
        if(document.getElementById('sub').value==""){//nameが空、かつsubが空なら、入力して下さいの文字を出現させる
        subElement.innerHTML=enter;
            if(document.getElementById('body').value==""){//nameが空、かつsubが空、かつbodyが空なら。name:sub:bod××○
            bodyElement.innerHTML=enter;
            }else{
            bodyElement.innerHTML="";
            }
        }else{
            if(document.getElementById('body').value==""){//name:sub:body×○×と×○○
            subElement.innerHTML="";
            bodyElement.innerHTML=enter;
            }else{
            bodyElement.innerHTML="";
            }
        }
        return false;
    }else if(document.getElementById('sub').value==""){//nameが○でもsubが空なら、nameは○なのでinnerHTMLは空に(再読み込みの際に文字を消すためname:sub:body○××と○×○
        nameElement.innerHTML="";
        subElement.innerHTML=enter;
        if(document.getElementById('body').value==""){
            bodyElement.innerHTML=enter;
        }
        return false;
    }else if(document.getElementById('body').value==""){//name:sub:body○○×のみ
        subElement.innerHTML="";
        bodyElement.innerHTML=enter;
        return false;
    }else{
        return true;
    }
}
</script>
</head>
<body>
<form id="x1" name="x1" method="post" action="" onsubmit="return check()">
<dl>
<dt><label for="name">名前(10文字まで)※必須</label><div id="namecheck"></div></dt>
<dd><input type="text" name="name" id="name" size="50" maxlength="10" /></dd>
<dt><label for="sub">件名(10文字まで)※必須</label><div id="subcheck"></div></dt>
<dd><input type="text" name="sub" id="sub" size="50" maxlength="10" /></dd>
<dt><label for="body">インプットエリア(10文字まで)※必須</label><div id="bodycheck"></div></dt>
<dd><textarea id="body" name="body" cols="50" rows="10" maxlength="10"></textarea></dd>
<dt><label for="password">パスワード(1139)</label></dt>
<dd><input type="password" id="pass" name="pass" size="10" maxlength="4" /></dd>
</dl>
<input type="submit" value="書き込み" />
</form>

データベース(MySQL)を用いた掲示板作成

テキストファイルやdatファイルに1行ずつ書き込む方法は非常に簡便である反面、ボリューミーなデータを扱うとなると少々パフォーマンスが落ちることや管理がしづらいので、できたらデータベース型に移行することをおすすめします。

データベースへのアクセス方法はここでは割愛。サンプルを参考に接続して下さい。もちろん、テーブルを作成し(ここではtoukou1)、カラムも作成しておきます(id,sub,body...他)。

ついでにファイル添付(画像のみ)できる形式に変更してありますので、ファイルをアップロードし、アップロードされたファイルの拡張子を判別し、下3桁が画像の拡張子であるなら、データベース上にその画像のファイル名を他の$_POSTで送られたデータと共にinsert intoで登録しておきます。

SQLインジェクションを防止するためにmysql_real_escape_string()関数を使用します。

表示は、SQLのselect文にて表示します。あとはファイル操作の時と同じ要領でページ移動出来るようにします。

<?php 
session_start();
$title = "タイトル";
$url="abc/aaa.php";

list($urlbe,$urlaf)=explode("/",$url,2);//urlを分解する

mysql_connect('サーバー名','ID','PASS') or die(mysql_error());
mysql_select_db('データベース名');
mysql_query('set names utf8');

function newstring($string) {
    if(get_magic_quotes_gpc()){
    $string = stripslashes($string);
    }
$string = htmlspecialchars($string,ENT_QUOTES,'utf-8');
$string = str_replace(",",",",$string);
$string = str_replace(array("\r\n","\n","\r"),"<br>",$string);
return $string;
}
if(!empty($_POST)){
    if($_POST['name']==''){
        $error['name']='blank';
    }
    if($_POST['sub']==''){
        $error['sub']='blank';
    }
    if($_POST['body']==''){
        $error['body']='blank';
    }
    if(strlen($_POST['pass'])<4){
        $error['pass']='length';
    }
    if(($_POST['pass'])==''){
        $error['pass']='blank';
    }
    if(empty($error)){
        $_SESSION['join'] = $_POST;
    }
    if(($_POST["pass"]==7248)&&(isset($_SESSION['join']))){
        if(!@$_SESSION['jikan']){
            $_SESSION['jikan']=1;
        }
        if($_SESSION['jikan'] < time()){
            $save_dir="./file/img/"; //ファイルを保存するディレクトリ
            $filemei=newstring($_FILES["upfile"]["name"]);
            $filetmp=newstring($_FILES["upfile"]["tmp_name"]);
            $file_check=substr($filemei,-3); //ファイル名の最後の3文字を抜き出す
            if($file_check==("jpg"||"JPG"||"jpeg"||"png"||"gif"||"bmp")){
            $file_name=$save_dir.$filemei; //ファイル名(ディレクトリを含める)
            if (is_uploaded_file($filetmp)) { //is_uploaded_fileでファイルがアップロードされたかどうかを調べる
                //copy($filetmp,$file_name); //テンポラリファイルをファイルにコピーする
                move_uploaded_file($filetmp,$file_name); //テンポラリファイルを移動する
            }
            }
            $sql = sprintf("INSERT INTO toukou1 SET name='%s',sub='%s',body='%s',title='%s',url='%s',img='%s',created=NOW()", //date(y-m-d h:i:s)でもいい
            mysql_real_escape_string($_SESSION['join']['name']),
            mysql_real_escape_string($_SESSION['join']['sub']),
            mysql_real_escape_string($_SESSION['join']['body']),
            $title,$url,
            mysql_real_escape_string($_FILES["upfile"]["name"])
            );
            mysql_query($sql) or die(mysql_error());
        $jikan=time()+20; //20秒空ける
        $_SESSION['jikan']=$jikan;

        unset($_SESSION['join']);
        @$jumpurl="Location:".$urlaf;
        header($jumpurl);
        exit();
        }else{
            echo("<p class='b3'><span>連続投稿不可。時間をおいて投稿してください。</span></p><br /><br />");
        }
    }
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>

</head>

<body>
<form id="x1" name="x1" method="post" action="" enctype="multipart/form-data">
<dl>
<dt><label for="name">名前(10文字まで)<span>※必須</span></label><?php if(@$error['name']=='blank'): ?><span> 入力してください</span><?php endif; ?></dt>
<dd><input type="text" name="name" id="name" size="30" maxlength="10" value="<?php echo newstring(@$_POST['name']) ?>" /></dd>
<dt><label for="sub">件名(10文字まで)<span>※必須</span></label><?php if(@$error['sub']=='blank'): ?><span> 入力してください</span><?php endif; ?></dt>
<dd><input type="text" name="sub" id="sub" size="30" maxlength="10" value="<?php echo newstring(@$_POST['sub']) ?>" /></dd>
<dt><label for="body">インプットエリア(255文字まで)<span>※必須</span></label><?php if(@$error['body']=='blank'): ?><span> 入力してください</span><?php endif; ?></dt>
<dd><textarea id="body" name="body" cols="30" rows="5" maxlength="255"><?php echo newstring(@$_POST['body']) ?></textarea></dd>

<dt><label for="upfile">アップする画像ファイル</label></dt>
<dd><input type="file" name="upfile" /></dd>

<dt><label for="password">パスワード<img src="../png/88.png" alt="" style="vertical-align:middle;" /></label><?php if(@$error['pass']=='blank'): ?><span> 左の4桁の数字を入力してください</span><br /><?php endif; ?><?php if(@$error['pass']=='length'): ?><span> 半角4文字で入力してください</span><?php endif; ?></dt>
<dd><input type="password" id="pass" name="pass" size="10" maxlength="4" /></dd>
</dl>
<input type="submit" value="書き込み" />
</form><br /><br />

<?php 

$data = mysql_query("SELECT COUNT(*) AS cnt FROM toukou1 t where t.url='".$url."'") or die(mysql_error());
$kensu = mysql_fetch_assoc($data);

if(empty($page)){
    $page=1;
    }
if(!empty($_REQUEST['page'])){
    $page=$_REQUEST['page'];
}

if($kensu['cnt']<1){//件数が0の場合に$endがマイナスエラーになるので。
    $kensu['cnt']=1;
    }

$page=max($page,1);
$maxPage=ceil($kensu['cnt']/5);

$page=min($page,$maxPage);



$start=$page*5-5;//開始位置を測るための変数
$end=min($kensu,$page*5);//今いるページが1ページ目なら5、2ページ目なら10まで。(終了位置を測るための変数)

$recordSet = mysql_query("SELECT * FROM toukou1 t where t.url='".$url."' ORDER BY t.id DESC LIMIT ".$start.",5") or die(mysql_error());

while($datas=mysql_fetch_assoc($recordSet)){

echo("<p class='p2'>記事No".newstring($datas['id'])." 題名:".newstring($datas['sub'])." 投稿者:".newstring($datas['name'])." 投稿日:".newstring($datas['created'])."</p><p class='p3'>".newstring($datas['body'])."</p><figure class='p4'><img src='./file/img/".newstring($datas['img'])."' alt='' /></figure><hr />");
}
//imgのURLは絶対パスじゃないとだめ。../../fileだと、最上位の階層までは戻れないみたい。
?>
<ul class="clearfix p1">
<?php 
if($page > 1){
?>
<li><a href="<?php echo($urlaf); ?>?page=<?php echo($page-1);?>">&lt;&lt;&nbsp;前のページ</a></li>
<?php 
}else{
?>
<li>&lt;&lt;&nbsp;前のページ</li>
<?php 
}

if($page < $maxPage){
?>
<li><a href="<?php echo($urlaf); ?>?page=<?php echo($page+1);?>">次のページ&nbsp;&gt;&gt;</a></li></ul>
<?php 
}else{
?>
<li>次のページ&nbsp;&gt;&gt;</li>
</ul>
<?php 
}
?>
</body></html>

ファイルをサーバー上にあげられると嫌なので、サンプルはありません。

コメントor補足情報orご指摘あればをお願いします。

(件名or本文内でキーワード検索できます)



記事No2598 題名:aaa 投稿者:aaa 投稿日:2023-11-05 15:51:47

aaaa


記事No1108 題名:aaa 投稿者:aaa 投稿日:2019-12-06 11:04:44

aaa


  • << 前のページ
  • 次のページ >>
ページトップへ