最近は週末に光が丘公園のジョギングコースでジョギングするようにしている。だいたい3kmのコースになっていて、ヘタレなので20分弱で1周して40分強休憩するみたいなペースで3周くらい走って帰る感じ。コースは緑が豊かで、走っていて気持ちいい。途中バーベキュー場の横を通るところがあって、そこに差し掛かると心が折れそうになる。
最新3件を表示します。このリソース群の時系列順リスト、タイトルリスト、またこのリソースのAtom表現とRSS1.0表現も参照できます。
らーめん大練馬店が開店して、通常600円のラーメンが100円で食べられるとのことでアホみたいな行列になっている。開店直後でも80人以上並んでいたりする。そりゃ100円は安いけど、高々500円引きですよ。吉野家コピペでは150円引きのために普段来ていない吉野家に家族連れで来ている半可通が揶揄されているが、500円のために数時間並ぶというのも同様に揶揄されてしかるべきだ。
たとえば、行列をスキップしていきなり専用席に座れる権利を500円で用意して、最後尾グループに数枚配布するとする。この権利は自由に売買できて、値段も自由に決められるとする。どう値段が変化してどう売買されるのだろうか。
まず、このチケットを受け取った人は、そもそもラーメンを食べに来ているので早速権利を行使するだろう。しかし、周りの人も同じくラーメンが食べたいはずなので、もしかしたら600円とか1000円とかで買いたいと思うかもしれない。でも良く考えるとそれ買っちゃうと定価より高いし、かといって何時間も並ぶのやだし…みたいな葛藤が飛び交うようになって、観察する分にはおもしろいかもしれない。そこから適切な値段とかも見えてくるだろうしね。実際どうなるんだろう。
普通にMysqliを使ってみます。特別なネタがあるわけではありません。リファレンスが分かりにくいという声を近くで聞いたので、まあだいたいこんな風にすれば良いんじゃない? というのをメモとして残しておきます。
個人ユースのデータベースといえばやはり住所録ということで、これにデータを出し入れする部分だけMysqliを使って書いてみます。住所録のデータスキームはこんな感じ:
create table addresses(
id int unsigned not null primary key auto_increment,
name varchar(32) not null,
kana varchar(64) not null,
zipcode char(8) not null,
address1 varchar(64) not null,
address2 varchar(64) not null,
tel char(13) not null,
email varchar(255) not null,
index(kana)
);
IDを指定してデータを取得する関数は、だいたいこんな感じに書ける (実際はもっとまじめにエラー処理とかすべき):
// インスタンス変数として$con = new Mysqli("ホスト名", "ユーザ名", "パスワード", "データベース名");が存在することを前提としている。以下同様
function getAddressById($id) {
$result = array();
$sql = "select name, kana, zipcode, address1, address2, tel, email from addresses where id = ?";
$stmt = $this->con->prepare($sql);
$stmt->bind_param("i", $id);
$stmt->execute();
$stmt->bind_result($name, $kana, $zipcode, $address1, $address2, $tel, $email);
if($stmt->fetch()) {
$result = compact("id", "name", "kana", "zipcode", "address1", "address2", "tel", "email");
}
$stmt->close();
return $result;
}
1ページに20件表示させるとして、その20件分を持ってくる関数はこんな感じに書ける:
// $page: ページ数。最初のページは1
function getAddresses($page, $limit = 20) {
$result = array();
$sql = "select id, name, kana, zipcode, address1, address2, tel, email from addresses order by kana limit ?, ?";
$offset = ($page - 1) * $limit;
$stmt = $this->con->prepare($sql);
$stmt->bind_param("ii", $offset, $limit);
$stmt->execute();
$stmt->bind_result($id, $name, $kana, $zipcode, $address1, $address2, $tel, $email);
while($stmt->fetch()) {
$result[] = compact("id", "name", "kana", "zipcode", "address1", "address2", "tel", "email");
}
$stmt->close();
return $result;
}
指定したカナに前方一致するものを取得したいならこんな感じ:
function getAddressesByKana($kana, $page, $limit = 20) {
$result = array();
$sql = "select id, name, kana, zipcode, address1, address2, tel, email from addresses where kana like ? order by kana limit ?, ?";
$offset = ($page - 1) * $limit;
$like = "{$kana}%";
$stmt = $this->con->prepare($sql);
$stmt->bind_param("sii", $like, $offset, $limit);
$stmt->execute();
$stmt->bind_result($id, $name, $kana, $zipcode, $address1, $address2, $tel, $email);
while($stmt->fetch()) {
$result[] = compact("id", "name", "kana", "zipcode", "address1", "address2", "tel", "email");
}
$stmt->close();
return $result;
}
新しいエントリを挿入するのはこんな感じ:
// $addressはnameやkanaなどのキーがある連想配列
function insert($address) {
$result = 0;
$sql = "insert into addresses(name, kana, zipcode, address1, address2, tel, email) values(?,?,?,?,?,?,?)";
$stmt = $this->con->prepare($sql);
$stmt->bind_param("sssssss", $name, $kana, $zipcode, $address1, $address2, $tel, $email);
extract($address, EXTR_OVERWRITE);
$stmt->execute();
$result = $this->con->insert_id;
$stmt->close();
return $result;
}
まとめて挿入するなら:
// $addressesはnameやkanaなどのキーがある連想配列の配列
function insertAll($addresses) {
$result = array();
$sql = "insert into addresses(name, kana, zipcode, address1, address2, tel, email) values(?,?,?,?,?,?,?)";
$stmt = $this->con->prepare($sql);
$stmt->bind_param("sssssss", $name, $kana, $zipcode, $address1, $address2, $tel, $email);
foreach($addresses as $address) {
extract($address, EXTR_OVERWRITE);
$stmt->execute();
$result[] = $this->con->insert_id;
}
$stmt->close();
return $result;
}
更新するなら:
function update($address) {
$sql = "update addresses set name = ?, kana = ?, zipcode = ?, address1 = ?, address2 = ?, tel = ?, email = ? where id = ?";
$stmt = $this->con->prepare($sql);
$stmt->bind_param("sssssssi", $name, $kana, $zipcode, $address1, $address2, $tel, $email, $id);
extract($address, EXTR_OVERWRITE);
$stmt->execute();
$stmt->close();
}
ついでに削除:
function delete($id) {
$sql = "delete from addresses where id = ?";
$stmt = $this->con->prepare($sql);
$stmt->bind_param("i", $id);
$stmt->execute();
$stmt->close();
}
function deleteAll($id_list) {
$sql = "delete from addresses where id = ?";
$stmt = $this->con->prepare($sql);
$stmt->bind_param("i", $id);
foreach($id_list as $id) {
$stmt->execute();
}
$stmt->close();
}
実際はフレームワークとかでささっとやってしまう部分かもしれませんが、あえてフルスクラッチするならこんな感じでしょうか。