SQLiteな休日
1. 新しい行を挿入するには

すでに書き込んである下記のようなデータベース(sqlite.db)があり、

idsitenameurl
1phpな休日http://p-ho.net/
2phpな猫の森http://p-ho.net/photolog/

1行目と2行目の間に新しい行を追加したい場合、追加書き込みする場所は一番下でよいのですが、 “表示順” を変更できるようにしてみます。
現状では表示順の目安になる項目がないので、新たに作成します。
出来ればそーゆーことの無いように最初の設計をきちんとすべきですが、ここはあえてソートの学習も兼ねて。

idsitenameurlsort
1phpな休日http://p-ho.net/1
3SQLiteな休日http://p-ho.net/sqlite/2
2phpな猫の森http://p-ho.net/photolog/3

最終的に上記のように表示出来るようにしていきます。

2. 新しい項目(列・カラム)を追加する

現在のテーブルに存在する項目 id sitename url に sort を追加して、id sitename url sort という構成に変更します。
手順としては
1. 現在の table1 をコピーした table1_tmp というテーブルを作成します。
2. 現在の table1 を削除します。
3. 新しくカラムの定義をした table1 を作成します。
4. table1_tmp にあるデータを table1 にコピーします。
5. table1_tmp を削除します。
以上、煩雑ですね。

<?php
$file = "./sqlite.db"; //データベースファイル定義
$data = sqlite_open("$file"); //オープン
$query = "select * from table1"; //クエリの定義
$result = sqlite_query ($data,$query); //実行

$query = "create temporary table table1_tmp (id INTEGER PRIMARY KEY,sitename VARCHAR(50),url VARCHAR(50))"; //クエリの定義(テーブル table1_tmp を作成)
$result = sqlite_query ($data,$query); //実行

$query = "insert into table1_tmp select * from table1"; //クエリの定義(データをコピー)
$result = sqlite_query ($data,$query); //実行

$query = "drop table table1"; //クエリの定義(テーブル削除)
$result = sqlite_query ($data,$query); //実行

$query = "create table table1 (id INTEGER PRIMARY KEY,sitename VARCHAR(50),url VARCHAR(50),sort INTEGER(10))"; //クエリの定義(カラム sort を追加)
$result = sqlite_query ($data,$query); //実行

$query = "insert into table1 select *,null from table1_tmp"; //クエリの定義(データをコピー)
$result = sqlite_query ($data,$query); //実行

$query = "drop table table1_tmp"; //クエリの定義(テーブル削除)
$result = sqlite_query ($data,$query); //実行

$query = "select * from table1"; //クエリの定義
$result = sqlite_query ($data,$query); //実行

print "<table border='1' cellspacing='0' cellpadding='4'>¥n";
print "<tr><td>id</td><td>sitename</td><td>url</td><td>sort</td></tr>¥n";
while ($scan = sqlite_fetch_array ($result)) {
print "<tr><td>" . $scan["id"] . "</td><td>" . $scan["sitename"] . "</td><td>" . $scan["url"] . "</td><td>" . $scan["sort"] . "</td></tr>¥n";
}
print "</table>¥n";
sqlite_close($data); //切断
?>

表示

空のカラム(sort) に値を入れます。

<?php
$file = "./sqlite.db"; //データベースファイル定義
$data = sqlite_open("$file"); //オープン

$query = "update table1 set sort='1' where id=1"; //クエリの定義(update による更新)
$result = sqlite_query ($data,$query); //実行

$query = "update table1 set sort='2' where id=2"; //クエリの定義(update による更新)
$result = sqlite_query ($data,$query); //実行

sqlite_close($data); //切断
?>

表示
3. 挿入場所以降の sort を書きかえ(+1)た後、一行追加する

sort の値を 2 にしたいので、既存の 2 以上の値に対して ++ 処理していきます。
今回の場合、該当するのはひとつだけですが。

<?php
$file = "./sqlite.db"; //データベースファイル定義
$data = sqlite_open("$file"); //オープン

$query = "select * from table1"; //クエリの定義(SelectAll)
$result = sqlite_query ($data,$query); //実行
while ($scan = sqlite_fetch_array ($result)) {
if ($scan["sort"] > 1) {;
$sort = $scan["sort"];
$sort++;
$query = "update table1 set sort='" . $sort . "' where id=" . $scan["id"] . ""; //クエリの定義(update による更新)
$result = sqlite_query ($data,$query); //実行
}
}

$query = "insert into table1 values(null,'SQLiteな休日','http://p-ho.net/sqlite/','2')"; //クエリの定義
$result = sqlite_query ($data,$query); //実行
sqlite_close($data); //切断
?>

表示
4. ソートして表示する

それでは項目 sort の値を頼りにソートして表示します。

<?php
$file = "./sqlite.db"; //データベースファイル定義
$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>url</td><td>sort</td></tr>¥n";

for($i=0; $i<$count; $i++) { //1行づつ走査しながら表示します
print "<tr><td>" . $scan[$i][0] . "</td><td>" . $scan[$i][1] . "</td><td>" . $scan[$i][2] . "</td><td>" . $scan[$i][3] . "</td></tr>¥n";
}

print "</table>¥n";
sqlite_close($data); //切断
?>

表示
2014.2.4 last edit

Produced by haku