SQLiteな休日
1. フォームから挿入書き込みする

FORMから挿入書き込みができるようにします。
POSTされてくるデータのうち、$sort(番目に追加)にさまざまな値が入ってくることが予想されますので処理が煩雑になっています。
素直に半角数字で有効な値を入力してくるとは限りませんので(ミスということもありますし)、
・全角数字が入ってきたら半角数字に変換する。mb_convert_kana
・数字以外の無効な文字列が入っていたら強制的に1だったことにする。preg_match
・最大保存件数以上の数字が入ってきたら最後尾につける。if文による
などの処理をしています。

なお、ソースはファイル構造が以下のようになっている場合のものです。
赤字はパーミッションの例(書き込み許可属性)。
※データベースファイル(sqlitelink.db)はバイナリモードで転送してください。

<?php
mb_language("ja");
mb_internal_encoding("UTF-8");

//設定開始
$filename = "./index.php"; //スクリプト名
$dbname = "./db/sqlitelink.db"; //データベース名
$adpass = "hoge"; //管理者パスワード
$maxline = 10; //最大保存件数
//設定終わり

?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>SQLiteLink</title>
</head>
<body>
<?php
$dline = $maxline--; //自動消去の設定

if ($_GET["edit"]) { //編集画面(Edi クリックで来た場合)
$edit = $_GET["edit"]; //編集行の特定(GETされた id による)
$file = $dbname; //データベースファイル定義
$data = sqlite_open("$file"); //オープン
$query = "select sitename,url,comment,sort from table1 where id='$edit'"; //クエリの定義(value= 用に sitename と url と comment と sort を取り出す)
$result = sqlite_query ($data,$query); //実行
$scan = sqlite_fetch_array ($result); //配列に入れる
sqlite_close($data); //切断
print "<br />¥n";
print "▼編集する<br />¥n";
print "<form method='POST' action='" . $filename . "'>¥n";
print "サイト名<br />¥n";
print "<input type='text' name='sitename' size='50' value='" . $scan[0] . "' /><br />¥n";
print "URL<br />¥n";
print "<input type='text' name='url' size='50' value='" . $scan[1] . "' /><br />¥n";
print "コメント<br />¥n";
$edcomment = str_replace("<br />", "¥n", $scan[2]); //<br />を¥nに変換
print "<textarea name='comment' rows='4' cols='60'>" . $edcomment . "</textarea><br />¥n";
print "パスワード<br />¥n";
print "<input type='password' name='pass' size='20' /><br />¥n";
print "<input name='ediline' type='hidden' value='" . $edit . "' />¥n";
print "<input name='sort' type='hidden' value='" . $scan[3] . "' />¥n";
print "<input type='submit' value='送信' />¥n";
print "</form>¥n";
}

elseif ($_GET["delete"]) { //削除画面(Del クリックで来た場合)
$delete = $_GET["delete"]; //削除行の特定(GETされた id による)
$file = $dbname; //データベースファイル定義
$data = sqlite_open("$file"); //オープン
$query = "select sitename,url,comment,sort from table1 where id='$delete'"; //クエリの定義(sitename と url と comment と sort を取り出す)
$result = sqlite_query ($data,$query); //実行
$scan = sqlite_fetch_array ($result); //配列に入れる
sqlite_close($data); //切断
print "<br />¥n";
print "▼以下の記事を削除する<br />¥n";
print "<form method='POST' action='" . $filename . "'>¥n";
print "【サイト名】<br />¥n";
print $scan[0] . "<br />¥n";
print "【URL】<br />¥n";
print $scan[1] . "<br />¥n";
print "【コメント】<br />¥n";
print $scan[2] . "<br />¥n";
print "【パスワード】<br />¥n";
print "<input type='password' name='pass' size='20' /><br />¥n";
print "<input name='delline' type='hidden' value='" . $delete . "' />¥n";
print "<input name='sort' type='hidden' value='" . $scan[3] . "' />¥n";
print "<input type='submit' value='送信' />¥n";
print "</form>¥n";
}

else { //編集画面・削除確認画面以外

if ($_POST["pass"] == $adpass) { //パスワードが正しければ
if ($_POST["sort"]) {
$sort = $_POST["sort"];
$sort = mb_convert_kana($sort, "a"); //全角を半角に
$sort = htmlspecialchars ($sort); //HTMLタグ禁止
if( get_magic_quotes_gpc() ) { $sort = stripslashes("$sort"); } //クォートをエスケープする
$sort = mb_strimwidth ($sort, 0, 5, "", "UTF-8"); //長いデータを5バイトでカット
}
else {
$sort = 1;
}
$sortmax = 0; //$sort の値を決める
$file = $dbname; //データベースファイル定義
$data = sqlite_open("$file"); //オープン
$query = "select * from table1"; //クエリの定義(SelectAll)
$result = sqlite_query ($data,$query); //実行

$i = 0;
while ($scan[$i] = sqlite_fetch_array ($result)) { //全ての行(レコード)を配列に入れる
if ($scan[$i][4] > $sortmax) {
$sortmax = $scan[$i][4]; //最大値
}
$i++;
}
$sortmax++; //最大値+1
if ($sort < 1) {
$sort = 1;
}
else {
if ($sort > $sortmax) {
$sort = $sortmax;
}
if (!preg_match("/^[0-9]+$/",$sort)) { //半角数字でない
$sort = 1;
}
sqlite_close($data); //切断
if ($_POST["sitename"] != "") { //サイト名に入力があれば
$sitename = $_POST["sitename"]; //POSTのデータを変数$sitenameに格納
$sitename = htmlspecialchars ($sitename); //HTMLタグ禁止
if( get_magic_quotes_gpc() ) { $sitename = stripslashes("$sitename"); } //クォートをエスケープする
$sitename = mb_strimwidth ($sitename, 0, 20, "", "UTF-8"); //長いデータを20バイトでカット

$url = $_POST["url"]; //POSTのデータを変数$urlに格納
$url = htmlspecialchars ($url); //HTMLタグ禁止
if( get_magic_quotes_gpc() ) { $url = stripslashes("$url"); } //クォートをエスケープする
$url = mb_strimwidth ($url, 0, 50, "", "UTF-8"); //長いデータを50バイトでカット

$comment = $_POST["comment"]; //POSTのデータを変数$commentに格納
$comment = htmlspecialchars ($comment); //HTMLタグ禁止
$comment = str_replace("¥r¥n", "¥r", $comment); //Windowsの改行コードを置き換え
$comment = str_replace("¥r¥n", "¥r", $comment); //Windowsの改行コードを置き換え
$comment = str_replace("¥r", "¥n", $comment); //Machintoshの改行コードを置き換え
$comment = str_replace("¥n", "<br />", $comment); //¥nを<br />に変換(保存・表示用)
if( get_magic_quotes_gpc() ) { $url = stripslashes("$url"); } //クォートをエスケープする
$comment = mb_strimwidth ($comment, 0, 200, "", "UTF-8"); //長いデータを200バイトでカット

}

if ($_POST["delline"]) { //削除処理
$delline = $_POST["delline"]; //削除行の特定(GETされた id による)
$file = $dbname; //データベースファイル定義
$data = sqlite_open("$file"); //オープン
//削除に伴う sort の書き替え
$query = "select * from table1"; //クエリの定義(SelectAll)
$result = sqlite_query ($data,$query); //実行
$i = 0;
while ($scan[$i] = sqlite_fetch_array ($result)) {
$i++;
}
for($i=0; $i<count($scan); $i++) { //1行づつ走査しながら表示
if ($scan[$i][4] > $sort) {
$id = $scan[$i][0];
$oldsort = $scan[$i][4];
$newsort = $oldsort - 1;
$query = "update table1 set sort='$newsort' where id='$id'"; //クエリの定義(update による更新)
$result = sqlite_query ($data,$query); //実行
}
}
$query_del = "delete from table1 where id='$delline'"; //クエリの定義(削除)
$result_del = sqlite_query ($data,$query_del); //実行
sqlite_close($data); //切断
}

elseif ($_POST["ediline"]) { //編集処理
$ediline = $_POST["ediline"]; //編集行の特定(GETされた id による)
$file = $dbname; //データベースファイル定義
$data = sqlite_open("$file"); //オープン
$query = "update table1 set sitename='$sitename',url='$url',comment='$comment',sort='$sort' where id='$ediline'"; //クエリの定義(update による更新)
$result = sqlite_query ($data,$query); //実行
sqlite_close($data); //切断
}

else { //新規投稿処理
$sortm = $sort-1;
$file = $dbname; //データベースファイル定義
$data = sqlite_open("$file"); //オープン
//回しながら sort の+1
$query = "select * from table1"; //クエリの定義(SelectAll)
$result = sqlite_query ($data,$query); //実行
$i = 0;
while ($scan[$i] = sqlite_fetch_array ($result)) { //全ての行(レコード)を配列に入れる
$id = $scan[$i][0];
$newsort = $scan[$i][4];
if ($newsort > $sortm) {;
$newsort++;
if ($newsort > $dline) { //貯めるのは(最大保存件数)行
$query_del = "delete from table1 where id='$id'"; //クエリの定義(削除)
$result_del = sqlite_query ($data,$query_del); //実行
}
else {
$query_up = "update table1 set sort='$newsort' where id='$id'"; //クエリの定義(update による更新)
$result_up = sqlite_query ($data,$query_up); //実行
}
}
$i++;
}
$id = $scan[$i][0];
$query = "insert into table1 values(null,'$sitename','$url','$comment','$sort')"; //クエリの定義(レコード追加)
$result = sqlite_query ($data,$query); //実行
sqlite_close($data); //切断
}
}
}

$file = $dbname; //表示(データベースファイル定義)
$data = sqlite_open("$file"); //オープン
$query = "select * from table1 order by sort"; //クエリの定義(sort の値順でソート)
$result = sqlite_query ($data,$query); //実行
$i = 0;
while ($scan[$i] = sqlite_fetch_array ($result)) { //全ての行(レコード)を配列に入れる
$i++;
}
$count = $i;
print "<table border='1' cellspacing='0' cellpadding='4'>¥n";
print "<tr><td>id</td><td>sitename</td><td>comment</td><td>sort</td><td>&nbsp;</td><td>&nbsp;</td></tr>¥n";
for($i=0; $i<$count; $i++) { //1行づつ走査しながら表示します
print "<tr><td>" . $scan[$i][0] . "</td><td><a href='" . $scan[$i][2] . "' target='_blank'>" . $scan[$i][1] . "</a></td><td>" . $scan[$i][3] . "</td><td>" . $scan[$i][4] . "</td><td><a href='" . $filename . "?edit=" . $scan[$i][0] . "'>Edi</a></td><td><a href='" . $filename . "?delete=" . $scan[$i][0] . "'>Del</a></td></tr>¥n";
}
print "</table>¥n";
sqlite_close($data); //切断
?>
<br />
<br />
<form method="POST" action="<?php print $filename; ?> ">
▼ <input type="text" name="sort" size="3" /> 番目に追加する<br />
サイト名<br />
<input type="text" name="sitename" size="50" /><br />
URL<br />
<input type="text" name="url" size="50" /><br />
コメント<br />
<textarea name='comment' rows='4' cols='60'></textarea><br />
パスワード<br />
<input type="password" name="pass" size="20" /><br />
<input type="submit" value="送信" />
</form>
<?php
} //編集画面以外 終わり
?>
</body>
</html>

実行

うまくスクリプトが書けない方、すぐには環境(エディタなど)が整わない方、とにかく設置して動作を見たい方のために こちら からzip形式をダウンロードできるようにしました。

2014.2.4 last edit

Produced by haku