2014
5
22

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

遂に完結です!ずっとこの記事ばかり書いてて読んでる方が飽きてないか心配でした…ていうかわたしが飽きてました((└(:3」┌)┘))


関連記事

ご注意

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

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

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

削除ボタンを実装

140522-1

前回、タイムテーブルと共にボタンだけは出力してあると思いますが、まだ押しても何も動かない状態です。ここに処理を実装していきます。

今までこのような形で進めてきて、今回はハイライト部分を書いていく予定なのですが。これの「キーワード有りの削除ボタンがクリックされた場合」のときには、

140522-2

このようなフォームを出したいと思います。そのため、このボタンを押した時の処理も追加しなくちゃいけません。

というわけで、この部分を追加して進めていきます。

キーワード無しのデータ削除

まずここ。第6回の記事で、ボタンを押したら確認のJavaScriptが走るようにしてあるはずなので、この部分は削除するだけです。

WPの場合

WP外の場合(PDO)

削除ボタンのフォームに一緒に設置した hidden(隠し)要素から日付とIDを取得して、日付は上書き、指定IDでDBから情報を削除します。

キーワード有りのデータ削除

次はここ。ここでは削除せずに、削除キーワードを入力してもらうフォームを出力します。せっかくなのでメッセージ枠内に出力しちゃいましょう。$log1に入れていきます。

これで枠内に出力されるはず。

キーワード入力後のデータ削除

最後に、上で作ったフォームのボタンを押された場合。

WPの場合

WP外の場合(PDO)

取得IDの削除キーワードをDBから取り出し、これを取得したキーワードと比べます。一致したら削除、しなければその旨のメッセージを出します。

ハイライト部分は「$ipt_kwd(入力されたキー)が$kwd(抽出されたキー)と同じ、または(||orと同意)、$master_keyと同じならば」という意味で、

ここで$master_keyを設定しておく必要があります。文字列は任意です。

これは、ユーザーが削除キーを忘れてしまった場合に、マスターキーを用意しておくとどんなものでも削除できるよ、という機能のためです。DBを参照すればキーワードは分かるので、不必要な場合は実装しなくて良いと思います。

全ソース

まるっとコピペで動くとは限らないと思うので、お使いの環境に合わせて適宜修正をお願いします。

すっごく長くてカオスです。お好きなところだけ抜き出して部品化するなり、煮るなり焼くなりお好きにつかってください_(:3 」∠)_

2014/9/2追記:予約済みの時間との重複チェックに足りていない条件がありましたので追記しました。コメントで教えていただいた中村さん、ありがとうございました!

あとがき

やっとおわりました…!

正直第1回目の時点で、これWordPressである必要性全く無いよね?って思ってしまい、実稼働でもWPから外してしまい、もうこれ解説記事を書く意味あるのかなぁと、非常に疑問を抱きながらのここまででした。

とはいえ、記事にするため、他人に見られることを意識して書くうちに「ここはもっとスマートに書ける!」「ここの処理いらない!」など、初期のコードよりかなりシュッとして、自分自身にはとても良い勉強になりました。

まるごとお役に立てるかはちょっと微妙だと思うので、スニペットとしてお役立ていただけたら嬉しいです。ここまで読んでくださった方に厚く御礼申し上げます。

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

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


13件のコメント

  • 中村
    2014年8月31日 8:20 PM

    初めまして、中村と申します。

    wordpressでしかサイトが作れない私のようなものにはとても有益な記事でした。

    有り難うございました。実際に作って勉強したいと思います。

  • 中村
    2014年9月2日 2:37 PM

    いつもお世話になっております。

    予約済み時間との重複フラグを設定のところですが、
    開始時刻 <= 予約済開始時刻 && 予約済終了時刻 <= 終了時刻
    の場合が抜けているようです。
    ご確認を御願いします。

    間違っていたら申し訳ありません。

    • *you
      2014年9月2日 4:28 PM

      中村さん、コメントありがとうございます&まとめてのお返事になってしまってすみません!

      重複フラグ、ご提示の通りです!このままでは抜けが発生してしまいますねΣ(゚д゚lll) 申し訳ございません、ご指摘大変有り難いです。記事内のコードにも修正を加えさせていただきます、ありがとうございますー!

  • ゆうき
    2014年9月6日 11:08 PM

    こんばんは。
    予約表を作るのにとても参考になっています。
    今回、作っているうちに
    Notice: Undefined variable: data_no
    と出てしまう現象にこまっています。
    $data_meta[$value[‘cpt_name’]][$key1] = $data_no;
    部分を指摘されています。
    どのようにすれば直るでしょうか?

    • *you
      2014年9月8日 9:05 AM

      ゆうきさん、コメントありがとうございます。

      申し訳ありません、$data_noとなっているところを$data_nとしていただければ大丈夫ではないかと…!

      当初、変数名を「データナンバー」のつもりで$data_noと書き始めたところ、これじゃあ「ノー」みたいだなーと思って$data_nに書き直したのですが、直し漏れがあったようで、そのため「Undefined variable(未定義の変数ですよー)」というメッセージが出ていたのだと思います。こちらも修正させていただきました、ご指摘ありがとうございました!

  • takuzoh
    2016年6月18日 12:31 AM

    【ド素人でも設置できる方法】9回目を希望!

    全ソースをどう使うと、設置できるのかをお教えください。
    どうすれば「完成図」の様な表示ができるのかご教授ください。

    1)MySQLにDB作成(中身は空)。
    2)「var $tables = array(…’rsv_timetable’)」追加
    3)テーマ「twentytwelve」の下にフォルダ作って、「140522-wp.php」「140522-wpfct.php」「140522-css.css」「140522-js.js」を入れた
    4)固定ページ新規で「テンプレート」で「rsv_timetable」を選択
    5)固定ページをメニューで選択して実行しても、タイムテーブルの枠ダケ表示され、何のボタンも出てきません。

    1)MySQLにDB作成(中身は空)。
    2)「htdocs」フォルダの下にフォルダ作って、「140522-wp.php」「140522-wpfct.php」「140522-css.css」「140522-js.js」を入れた
    3)ブラウザから、「140522-wp.php」を呼び出したが、WPの時と一緒で、タイムテーブルの枠ダケ表示され、何のボタンも出てきません。

    Apache/2.4.17 (Win32) OpenSSL/1.0.2d
    PHP/5.6.14
    mysqlnd 5.0.11-dev – 20120503
    WordPress 4.5.2

    index.phpなど自分で作る必要があるのでしょうか?

    お教えください。

    • *you
      2016年6月20日 5:38 AM

      takuzohさん、お返事遅れてすみません。WPで設置する方法と読み取らせていただきます。

      まず、第二回の記事を参考に、WPが使っているDBに専用テーブルを作って、wp-db.phpのテーブル名の宣言へ「var $tables = array(…’rsv_timetable’)」と追加します。

      次に第三回の記事を参考に、WPの適用テーマ内から固定ページテンプレートpage.phpをダウンロード&コピーして任意の名前(rsv_timetable.phpなど)へ変更し、中身を上記にあるソースの「メイン(WP)」とします。そいつを同じテーマの中(DLしたpage.phpと同じ場所)へアップロードし、適用させたい固定ページのテンプレートを「rsv_timetable」にします。

      残りのソースは、「関数(WP)」は適用テーマのfunctions.phpへ、「CSS」はstyle.cssへ追記します。(差し替えではなく、追記です。)「関数(WP)」をfunctions.phpへ書くときは、先頭行の「< ?php」と最終行の「?>」を抜いたものを追記してください。

      「JavaScript」は、rsv_timetable.phpの中に書いちゃってもいいですし、外部ファイルとして呼び出しても良いです。こちらの記事が参考になります。

      当方ではWP4.0までしか検証しておりませんので、あんまり細かい点まではご容赦ください。

    • takuzoh
      2016年7月4日 1:12 AM

      youさま
      ご丁寧な対応をありがとうございます。

      ご指導の通りに記載しましたら、動きました。

      二点引っかかったので、再度ご教授願います。


      2個目の予約を入れようとすると、SQLエラーと表示され、入りません。


      時間を横軸に「$tbl_flg = true」としてますが、カレンダー三カ月分が、タイムテーブルの下で縦に並んでしまいます。

      ご迷惑をおかけします。よろしくお願いいたします。

    • *you
      2016年7月5日 6:18 AM

      takuzohさん、コメントありがとうございます。

      ①について、申し訳ありませんが現状ではご期待に添える答えを推測することができません。既に入っているデータ、入れたいデータが何か、具体的にどんな操作で何が起こるのか、実際に触って動かしながら細かく検証しないとデバッグは遠隔では非常に困難なのです。悪しからずご理解ください。

      もしも自作テーマやプラグインが動作しているなら何が作用しているかわかりませんので、まずはインストールしただけのWPで試してみてください。

      ②は、サンプルのCSSが縦軸用だからです。table.rsv_calendar{}の中にfloat:left;を入れてみてください。

    • *you
      2016年7月6日 5:56 AM

      takuzohさん、もしかして、と思う事項が出てきましたので追記させていただきます。

      追加したテーブルのid以外の項目が主キーになっていませんか? お使いのDB管理ツールによって違うと思うので一概には言えないのですが、time_sttime_endが主キーになってしまう現象があるようです。このふたつはデータ型をTEXTにしても動くので、もし該当するようならお試し下さい。主キーになるのはidだけです。

      また、手動設定の部分に以下を追記すると、エラーメッセージを表示できます。そこを検証することでデバッグがしやすくなりますので、お試し下さい。

  • takuzoh
    2016年7月7日 1:31 AM

    youさま

    素人に何度もお付き合いいただき、ありがとうございます。

    ②は解決できました!!
     ありがとうございます。
     よく分らないながら、「margin-right:30px;」も入れてみたところ、カレンダーの間隔も空きました。

    ①ですが、
    time_st、time_end の種類を、DATETIMEにすると、「主」と「インデックス」のマークに色が付いてしまいます。
    「id」には、名前のところに、キーのマークが付いてて、「インデックス」マークに色が付いてます。

    time_st、time_end の種類をTEXTにしても、2個目の予約が入りません。「主」と「インデックス」のマークの色は消えます。

    手動設定に「$wpdb->show_errors();」を書きましたところ、
    「 [Duplicate entry ‘0’ for key ‘PRIMARY’]
    INSERT INTO wp_rsv_timetable ( name, sect, notes, time_st, time_end, cpt_name, kwd ) VALUES (xx,xx,xx,xx,xx,xx,xx)」
    となりました。

    ごめんなさい。
    再度ご教授いただけますと幸いです。

    • *you
      2016年7月7日 5:24 AM

      takuzohさん

      エラーメッセージが出たなら、まずはそれを検索してご自分で解決する努力をお願いいたします。ご提示の「Duplicate entry ‘0’ for key ‘PRIMARY’」というエラーは、検索すれば「主キーに’0’という重複したデータを入れようとしている」という意味であることがわかるはずです。

      主キーはidだけのはず(他にもあったら解除してください)で、idはオートインクリメントに設定するため、INSERT文で指定していません(このあたりはすべて第二回で書いています)。それにも関わらず’0’を入れようとしているということは、idにオートインクリメントが設定されていないんじゃないかなという気がします。

  • takuzoh
    2016年7月7日 11:46 PM

    youさま

    仰るとおりです。すみませんでした。
    ②も解決できました。

    ここで勉強させていただいた事を基に、機能追加など努力したいと思います。
    ありがとうございました。

コメントを残す




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


back to top