2014
4
02

PHP+DBでタイムテーブル型予約システムをつくる 第2回「DB」

自作の予約システムをつくるため、まずはWordPressのDBに独自のテーブルを作り、それを読み書きするにはどうしたら、ということについて調べたことをまとめました。


関連記事

ご注意

記事公開当初は「WordPressでタイムテーブル型予約システムをつくる」というタイトルだったのですが、WP4.0まで検証したのち、実装可能ではあるもののやはりWPには不向きだと判断したため記事タイトルを変更しました。

もはや自分でも稼働させていないため、機能追加やバージョンアップ、組み込みサポートのご依頼はお受けしておりませんので、悪しからずご理解ください。

スニペットだけでも何か作る際のお役にたてたら、という気持ちでコードを書き残しておきます。間違いや、お気づきの点がありましたらご指摘下さい。

はじめに

今回作ってみるシステムは、わたしが個人的に(しかも実験的に)実装したものなので、phpMyAdminから手作業でテーブルを追加していたりして、配布目的のプラグインを作りたい方にはあんまり参考にならないかもしれません。(そもそもあんまりWordPress向けの案件ではないという…w)

個人的に何か試すときの参考のひとつになれば、というようなスタンスで見ていただけると有難いです!

プラグインを作りたい方には、こちらが参考になるんじゃないでしょうか。

テーブル設計

まずは構想から。テーブル名はrsv_timetableとし、以下のような8つのフィールド名で設定してみます。

  • id… 登録IDを格納する数値型(主キーにする)
  • name… 名前を格納する文字列型
  • sect… 所属を格納する文字列型
  • notes… 備考を格納する文字列型
  • time_st… 開始日時を格納する日付型
  • time_end… 終了日時を格納する日付型
  • cpt_name… 項目名を格納する文字列型
  • kwd… 削除キーを格納する文字列型

phpMyAdminでテーブル追加

140402-1-1

※クリックで拡大

WordPress(ver3.8.1)をインストールしたばかりのテーブル構造はこんな形になってます。

画面下のほうで新しいテーブルを作成することができるので、他のテーブルと同じ接続子をつけたテーブル名と、フィールドの数を入力して、実行ボタンを押します。

140402-2-1

※クリックで拡大

各フィールドを設定します。idはオートインクリメントとしておくと、自動で連番をつけてくれるので簡単です。(投稿IDとかはオートインクリメントになっています。)属性のUNSIGNEDというのは、「正の値のみを扱う」という意味です。

テーブルのストレートエンジンと照合順序は、他のテーブルに合わせておきます。

140402-3-1

※クリックで拡大

保存すると、このように新しいテーブルができました!

使うための準備

このままではまだ使えません。wp-includes/wp-db.phpの208行目あたりに、

このようにテーブル名を宣言している部分がありますので、

新しく作ったテーブル名を追加してやります。

こちらを参考にさせていただきました!

この方法はwp-includes内のファイルを直接編集しているので、のちのバージョンアップなども考えるとあまりメンテナンス性の良いものではありません。そのため、wp-content内にdb.phpを作るという方法もあるそうです。詳しくはこちらの記事をご参照ください。

SQLの基礎知識

140402-4

テーブルの中身はこのような名称になっていて、読み書きにはSQLという言語を使います。

よく使う構文はこのような形です。さて、ではこれをWordPressから扱ってみます!

WordPressのDBへの読み書き

ここを熟読!

方法は全部こちらに書かれています。以下は、読んでみて、実際に書いてみた上での自分なりの要約というかなんというか、そんな感じとなっております。

$wpdbを使う

WordPress にはデータベースと対話するために設定されたクラスをインスタンス化した $wpdb というグローバル変数があります。常に、このグローバル変数 $wpdb を使うようにしましょう ($wpdb をカスタム関数の中で使う前に、グローバル宣言を忘れないようにしましょう)。

Codexより。すでに用意されているのですね!もし自分で独自に関数を作ってその中で使いたい場合はグローバル宣言をしましょうということですね。

基本形

この書き方で、あらゆるSQLクエリが実行できるとされています。しかしSELECT文ではより明確な関数を使うほうが推奨されておりまして、

このように、目的に合った関数を使って取得します。

また、第三者に入力された値などを使う場合はこのままでは危険なので、prepare()を使ってエスケープ処理しなければなりません。

文字列は%s、整数は%dという文字(プレースホルダーと言うそうです)で置き換えたSQL文を先に書き、その後、そこに代入したい変数や値を順番に指定します。

INSERT文とUPDATE文には、それぞれ$wpdb->insert()$wpdb->update()という書き方もありますので、詳しくは前述のCodexをご参照ください。

例文

決まった値で書く

INSERT文を例にすると、

このように書けます。(読み易くするため改行を入れています。)フィールド1は数値型、フィールド2は文字列型という設定だとすると、値1はそのまま、値2は「’」(シングルクォーテーション)で囲います。

変数を使う

SQL文はひとつの文字列として扱わなければいけないので、値に変数を使いたい場合は、文字列と変数を連結してやらねばなりません。

信頼できない変数を使う

第三者に入力された値などを使う場合。prepare()を使って書いてみます。

クォート文字で囲む必要はないとのことなので、連結させるより楽ですねー。

合否判定

MySQLエラーが発生した場合falseが返ってくるので、

このように処理メッセージを出すことも出来ます。

さっき作ったテーブルを例に

データ挿入

140402-5

idは自動で番号を振ってくれるオートインクリメントにしてあるので、指定する必要はありません。id以外はみんな数値じゃないので、プレースホルダーは%sになります。

UPDATE文は今回使わなかったので割愛しますが、INSERTと似てますね。

DELETE

140402-6

idというフィールドは数値型なので、プレースホルダーは%dを使います。

SELECT

複数行を取得

140402-7

項目名が「会議室A」のものを全て取得して、任意のフィールドを出力するサンプル。レコードが複数なのでforeachを使う必要があります。

SELECTで全てのフィールドを指定したいときは、*を使うと簡単です。

1行を取得

140402-8

指定IDのレコードを取得して、任意のフィールドを出力するサンプル。

列(フィールド)を取得

140402-9

指定IDの1つのフィールドだけ持ってきて出力するサンプル。列を取得するget_col()は配列を返してくるので、ひとつだけ欲しくても[0]ってつけないと出てこないっぽい…。

1つの値だけが欲しい場合はこっちのget_var()のほうが良いのかな。配列じゃなく、ひとつの変数として取得できます。

参考と補足

こちらの記事を参考にさせていただきました。いつも本当にありがとうございます。・゚・(ノД`)・゚・。

WPを使わず MySQL + PHP5.5 以上でDB操作をする場合は、こちらを参考にさせていただきました!

また、今回作るものは、テーブルを1つしか使わないとても簡単なつくりになっています。一般的にデータベースを使うシステムは複数のテーブルを結合して使うことが多いので、もうちょっと複雑なSQL文になります。

過去に書いた他言語(VBA)の記事ですが、複数テーブルを使ったSQLについても触れていますので、もしご参考になれば。

と、こんな感じでしょうか。おかしな点などありましたら是非ご指摘ください!

次回は、どこに何を書く、といったページの全体像について書く予定です。

  • このエントリーをはてなブックマークに追加
  • follow us in feedly 618
  • RSSを登録

公開日:2014/04/02
更新日:2014/05/22


コメントを残す




*印は必須項目です。コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にですがスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)


back to top