1. 現在位置:
  2. トップページ
  3. HP作成tips
  4. PHP-しりとり
しりとり
■ サンプル

トップページで使用してます

shiritori1.php 始めの表示画面
shiritori.php 本体
shiritori.dat 書込み用(666)
shiritori1.dat 表示用(666)
com.dat から始まる言葉用(666)

■ ソース

shiritori1.php  レイアウトはご自由に
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>しりとり</TITLE>
<META http-equiv=Content-Type content="text/html; charset=Shift_JIS">
<style type="text/css">
<!--
TD { font-size: 10pt }
-->
</style>
</HEAD>
<BODY BGCOLOR="#ffffff" TEXT="#000000" LINK="#3333ff" VLINK="#000033" ALINK="#ffff00">
<CENTER>
<FORM ACTION="shiritori.php" METHOD="post">
<TABLE BORDER="1" cellpadding="3" cellspacing="0">
<TR>
        <TD>名前</TD><TD>しりとりしてね</TD><TD>「 <?php include("com.dat"); ?> 」から始まる言葉</TD>
</TR>
<TR>
        <TD><input type="text" name="name" size=15></TD>
        <TD><input type="text" name="comment" value="" size=30></TD>
        <TD align="center" colspan="2"><INPUT TYPE="submit" name="submit" VALUE="送信する"></TD>
</TR>
</TABLE>
</FORM>
<FONT SIZE="2">20件まで表示します</FONT>
<TABLE BORDER="1" WIDTH="400" cellpadding="3" cellspacing="0">
<TR><TD WIDTH="80">名前</TD><TD WIDTH="240">続く言葉</TD><TD WIDTH="80">時間</TD></TR>
<? include("shiritori.dat"); ?>
</TABLE>
</CENTER>
</BODY>
</HTML>


■ ソース

shiritori.php
<?php
/*
 *    しりとり
 *
 *    Author    : Othubo Mithue
 *    Date    : 2003.2.18
 *    LastModify : 2003.3.3
 *
 *    (c) 2003 mitti All rights reserved.
 *
 */

$count_max = 20;

$name = $HTTP_POST_VARS["name"];
$comment = $HTTP_POST_VARS["comment"];
$submit = $HTTP_POST_VARS["submit"];
$daytime = date('Y/m/d');        // 日時の設定

$comment = stripslashes($comment); // addslashesでクォートされた文字列のクォート部分を取り除く // 申などの特殊な決まった文字の後ろに\マークが入らないようにする
$name = stripslashes($name); // addslashesでクォートされた文字列のクォート部分を取り除く // 申などの特殊な決まった文字の後ろに\マークが入らないようにする

// 入力のチェック
$comment2 = mb_substr($comment, -1, 1, "sjis"); // コメント最後の文字を取得
if ($comment2 == "ん"){
    print("最後に「ん」の付かない言葉にしてください。<BR>\n");
    exit;
}
if (eregi("[a-z0-9]", $comment)) {print("ブラウザの戻るで戻って<BR>ひらがなで入力してね<BR>\n");exit;}
if ($name==""){print("ブラウザの戻るで戻って<BR>名前を入力してね<BR>\n");exit;}
if ($comment==""){print("つながる文字を入力してね<BR>\n");exit;}

$filepath = "com.dat";        // しりとりファイルへのパスを指定
if (!file_exists($filepath)) {        // file_exists=ファイルの存在をチェックする
    print("ファイルがありません。<BR>\n");
    exit;
}

    $fp = fopen("com.dat","r");    // fopen=ファイルまたはURLをオープンする// 'r+'=読みこみ用にオープンします。ファイルポインタを ファイルの先頭に置きます。
    if ($fp == FALSE){
        print("ファイルポインタのオープンに失敗しました。<BR>\n");
        unlink("com.dat.loc");    // unlink=ファイルを削除する
        exit;
    }

        $buffer = fgets($fp,4096);    // fgets=ファイルポインタから1行取得する

    fclose($fp);                // fclose=オープンされたファイルポインタをクローズする
    if (!$fp) {
        print("ファイルポインタのクローズに失敗しました。<BR>\n");
        unlink("shiritori.dat.loc");    // unlink=ファイルを削除する
        exit;
    }

    $newrest = mb_substr($comment, 0, 1, "sjis");    // 文字列の最初の文字を得る

    if($buffer == $newrest){
    header("Location: shiritori1.php\n\n");
    }
    else{
        print("『");
        print("$newrest");
        print("』");
        print("は");
        print("先頭の文字がつながりません。<BR>\n");
        print("先頭の文字は");
        print("『");
        print("$buffer");
        print("』");
        print("です。<BR>\n");
        print("ブラウザの戻るで戻って入力しなおして下さい。<BR>\n");
        exit;
    }

// 続く文字を取得し書き込む
// 文字列の最後の文字を得る
$rest = mb_substr($comment, -1, 1, "sjis"); // コメント最後の文字を取得

if ($rest == "ぁ"){
$str = "ぁ";
$rest = str_replace("ぁ", "あ", $str);
}
if ($rest == "ぃ"){
$str = "ぃ";
$rest = str_replace("ぃ", "い", $str);
}
if ($rest == "ぅ"){
$str = "ぅ";
$rest = str_replace("ぅ", "う", $str);
}
if ($rest == "ぇ"){
$str = "ぇ";
$rest = str_replace("ぇ", "え", $str);
}
if ($rest == "ぉ"){
$str = "ぉ";
$rest = str_replace("ぉ", "お", $str);
}
if ($rest == "ヵ"){
$str = "ヵ";
$rest = str_replace("ヵ", "か", $str);
}
if ($rest == "ヶ"){
$str = "ヶ";
$rest = str_replace("ヶ", "け", $str);
}
if ($rest == "っ"){
$str = "っ";
$rest = str_replace("っ", "つ", $str);
}
if ($rest == "ゃ"){
$str = "ゃ";
$rest = str_replace("ゃ", "や", $str);
}
if ($rest == "ゅ"){
$str = "ゅ";
$rest = str_replace("ゅ", "ゆ", $str);
}
if ($rest == "ょ"){
$str = "ょ";
$rest = str_replace("ょ", "よ", $str);
}
if ($rest == "ゎ"){
$str = "ゎ";
$rest = str_replace("ゎ", "わ", $str);
}

    $fp5 = fopen("com.dat","w"); // ファイルまたはURLをオープンする
    if($fp5 == FALSE){
        print("ファイルポインタのオープンに失敗しました。<BR>\n");
    unlink("shiritori.dat.loc");    // unlink=ファイルを削除する
        exit;
    }
    flock($fp5, LOCK_EX);    //LOCK_EX=書き込み用排他ロック  flock=汎用のファイルロックを行う

    fputs($fp5,$rest); // fputs=ファイルポインタに書き込む
    flock($fp5, LOCK_UN);        //LOCK_UN=ロック解除  flock=汎用のファイルロックを行う
    fclose($fp5);                // fclose=オープンされたファイルポインタをクローズする
    if (!$fp5) {
        print("ファイルポインタのクローズに失敗しました。<BR>\n");
        unlink("shiritori.dat.loc");    // unlink=ファイルを削除する
        exit;
    }
    unlink("shiritori.dat.loc");    // unlink=ファイルを削除する

// ファイルの存在チェック
$filepath = "shiritori.dat";        // しりとりファイルへのパスを指定
if (!file_exists($filepath)) {        // file_exists=ファイルの存在をチェックする
    print("ファイルがありません。<BR>\n");
    exit;
}
// ファイルに書き込む文字列の作成
    $message = "<TR><TD>$name</TD>";
    $message .= "<TD>$comment</TD>";
    $message .= "<TD>$daytime</TD></TR>\n";
// ファイルオープン1書き込み用排他ロック

    $fp = fopen("shiritori.dat","r+");    // fopen=ファイルまたはURLをオープンする// 'r+'=読みこみ・書きこみ用にオープンします。ファイルポインタを ファイルの先頭に置きます。
    if ($fp == FALSE){
        print("ファイルポインタのオープンに失敗しました。<BR>\n");
        unlink("shiritori.dat.loc");    // unlink=ファイルを削除する
        exit;
    }
    flock($fp, LOCK_EX);        //LOCK_EX=書き込み用排他ロック  flock=汎用のファイルロックを行う

// ファイルオープン2
    $fp2 = fopen("shiritori1.dat","w+"); // fopen=ファイルまたはURLをオープンする// 'w+'=読みこみ・書きこみ用でオープンします。ファイルポインタを ファイルの先頭に置き、ファイルサイズをゼロにします。
    if($fp2 == FALSE){
        print("ファイルポインタのオープンに失敗しました。<BR>\n");
        unlink("shiritori.dat.loc");    // unlink=ファイルを削除する
        exit;
    }

    set_file_buffer($fp, 0); // set_file_buffer=指定したファイルポインタのファイルバッファを設定する
    set_file_buffer($fp2, 0); // 0とした場合、書き込み操作は、 バッファリングされません

// フアイル2に追加書込みを書き込む
    fputs($fp2,$message); // fputs=ファイルポインタに書き込む

// ファイル1からファイル2へ読込み
    $count = 1;                // 最大表示チェック
    while(!feof($fp) && ($count < $count_max)){            // feof=ファイルポインタがファイル終端に達しているかどうか調べる 
        $buffer = fgets($fp,4096);    // fgets=ファイルポインタから1行取得する
        fputs($fp2,$buffer);        // fputs=ファイルポインタに書き込む
        $count++;
    }
    rewind($fp); // rewind=ファイルポインタの位置を先頭に戻す
    rewind($fp2);

// ファイル2からファイル1へ読込み
    while(!feof($fp2)){            // feof=ファイルポインタがファイル終端に達しているかどうか調べる 
        $buffer = fgets($fp2,4096);    // fgets=ファイルポインタから1行取得する
        fputs($fp,$buffer);        // fputs=ファイルポインタに書き込む
    }
    $len = ftell($fp);            // ftell=ファイルポインタから読み書きの位置を取得する=最終的に書き込んだ終端を取得する
    ftruncate($fp,$len);            // ftruncate=ファイルを指定した長さに丸める=余計な分を切り落とす 

// ファイル1をロック解除
    flock($fp, LOCK_UN);        //LOCK_UN=ロック解除  flock=汎用のファイルロックを行う

    fclose($fp);                // fclose=オープンされたファイルポインタをクローズする
    if (!$fp) {
        print("ファイルポインタのクローズに失敗しました。<BR>\n");
        unlink("shiritori.dat.loc");    // unlink=ファイルを削除する
        exit;
    }
    fclose($fp2);
    if (!$fp2) {
        print("ファイルポインタのクローズに失敗しました。<BR>\n");
        unlink("shiritori.dat.loc");    // unlink=ファイルを削除する
        exit;
    }

header("Location: shiritori1.php\n\n");
?>