#PHPアドベントカレンダー6日目です。
##やっと常識的な時間に戻ってまいりました。
今回の話題はPHPのデータベース関連でやっておくと楽になることです。
##毎回接続部を書くのめんどくさいと思う人いませんか。
これ実はOJTに一緒に行った相方からしつこく言われたことですが。
私自身はそれが常識だからいいんじゃないっと言ってました。
ですが、同士得てもカプセル化して設置したらそのままつながってSQLを叩けるようにしてほしいと言われたので作ってみました。
実はこれはGithubの自分のリポジトリにもあるので見ておいてほしいと思いますがあえて今回は書きます。
<?php
//----------------------------------------------------------------------------
// データベースへの接続用
// (DB変更時には、ユーザー名等適宜書き換え)
//----------------------------------------------------------------------------
// connect to the database
$dbhost = 'ホスト名';
$dbuser = 'ユーザ名';
$dbpassword = 'パスワード';
$database = 'データベース名';
$db = mysql_connect($dbhost, $dbuser, $dbpassword) or die("Connection Error: " . mysql_error());
//これがあると、文字化けせずにデータベースに読み書きできる。
mysql_query("SET NAMES utf8");
//database指定
mysql_select_db($database) or die("Error conecting to db.");
?>
実はこの手を思いついたのはなぜだったのかと言うとデータベースの読み書き更新を別のライブラリを作って使いかったからです。
それをしておくことにより実はより簡単にデータベースのプログラムを書くために自分が作った考え方でした。
永続ログインもカプセル化も行いました。
実際にはこの必要も本来はないと思われますがコードを書くのを簡易化したいことから作りました。
<?php
//ログインの確認
if(isset($_COOKIE["user_id"])){
$_SESSION['user_id'] = $_COOKIE['user_id'];
}else if(!isset($_SESSION["user_id"])){
$str="Refresh:5; URL=http://localhost/mini_blog/";
header("Content-Type: text/html; charset=utf-8");
header($str);
exit('<h2>ログインされていません。ログインフォームへ移動します。</h2>');
}
?>
この部分はログインの永続化の方法です。
実はこの部分はオリジナルはO'Reillyの紫本から発展させて作りました。
実際に実装した例がこれです。
今回はインサートに関しての部分だけ上げておきます。
今日上げたの全ソースに関してはhiro-matsuno/mini_blogにあります。
<?php
session_start();
//----------------------------------------------------------------------------
// データベースへの接続
//----------------------------------------------------------------------------
require_once('../includes/db_connection.php');
//----------------------------------------------------------------------------
// ログイン制御
//----------------------------------------------------------------------------
require_once('../includes/login_confirm.php');
//値の取得
$date = isset($_REQUEST['date'])? mysql_real_escape_string(trim($_REQUEST['date'])):"";
$title = isset($_REQUEST['title'])? mysql_real_escape_string(trim($_REQUEST['title'])):"";
$id = isset($_REQUEST['id'])? mysql_real_escape_string(trim($_REQUEST['id'])):"";
$contents = isset($_REQUEST['contents'])? mysql_real_escape_string(trim($_REQUEST['contents'])):"";
$userId = isset($_SESSION['user_id'])? $_SESSION['user_id']:"";
$userName = isset($_SESSION['name'])? $_SESSION['name']:"";
//データ確認
$sql = "select blogId from t_blog where blogId='" . $id . "'";
//クエリー実行後結果を取得
$result = mysql_query($sql);
//取得変数の初期化
$id2 = "";
//データの取得
while($row = mysql_fetch_array($result)){
$id2 = isset($row['blogId'])? $row['blogId']:"";
}
//データ登録か更新かを判断しSQL文を生成
if(empty($id2)){
$sql = "insert into t_blog(blogId,blogDate,blogTitle,blogContent,id,name) value (";
$sql .= "'" . $id . "'";
$sql .= ",'" . $date . "'";
$sql .= ",'" . $title ."'";
$sql .= ",'" . $contents . "'";
$sql .= ",'" . $userId . "'";
$sql .= ",'" . $userName . "')" ;
}else{
$sql = "update t_blog set ";
$sql .= "blogId='" . $id . "'";
$sql .= ", blogDate='" . $date . "'";
$sql .= ", blogTitle='" . $title . "'";
$sql .= ", blogCotent='" . $contents . "'";
$sql .= ", id='" . $userId . "'";
$sql .= ", name='" . $userName . "'";
$sql .= " where blogId='" . $id . "'";
}
//クエリの実行
mysql_query($sql);
//データの確認
$sql = "select blogId from t_blog where blogId='" . $id . "'";
//結果の取得
$result = mysql_query($sql);
//取得変数の初期化
$id2 = "";
$insertResult = false;
//データの取得
while($row = mysql_fetch_array($result)){
$id2 = isset($row['blogId'])? $row['blogId']:"";
}
if(!empty($id2)){
$insertResult = true;
}else if(empty($id2)){
$insertResult = false;
}
echo $insertResult;
?>
のように素直にデータベース接続するプログラムが書けます。
これにつなぐJSはどうなっているかと言うと
/**
*
*/
//ブログ入力画面
//作成者:松野弘法
//使用モジュール:jquery-2.1.1
//ページの初期化
$(function(){
//各項目の初期化
$('#blog_title').val('');
$('#blog_contents').val('');
//IDの生成
id = thisYMDHM();
//日付の取得
date = thisYMD();
//日付の表示
$('#blog_YMD').text(date);
//IDの付与
$('#blog_id').val(id);
});
//現在の日付を取得する
function thisYMD(){
//現在日付
nowDate = new Date();
//年月日を取得
nowYear = nowDate.getFullYear();
nowMonth = nowDate.getMonth() + 1;
nowDay = nowDate.getDate();
//形に整形
nowThisDate = nowYear + '年' + nowMonth + '月' + nowDay + '日';
nowThisDate2 = nowYear + '-' + nowMonth + '-' + nowDay;
//localStorageにマウント
localStorage.setItem('nowDate',nowThisDate2);
//値を返す
return nowThisDate;
}
//ID生成
function thisYMDHM(){
//現在日付の取得
nowDate = new Date();
//年月日の取得
//年の取得
nowYear = nowDate.getFullYear();
//月の取得
nowMonth = nowDate.getMonth() + 1;
if(nowMonth >= 1 && nowMonth <= 9){
nowMonth = '0' + nowMonth;
}
//日の取得
nowDay = nowDate.getDate();
if(nowDay >= 1 && nowDay <= 9){
nowDay = '0' + nowDay;
}
//時間の取得
nowHM = new Date();
//時間の取得
nowHour = nowHM.getHours();
if(nowHour >= 0 && nowHour <= 9){
nowHour = '0' + nowHour;
}
//分の取得
nowMinute = nowHM.getMinutes();
if(nowMinute >= 0 && nowMinute <= 9){
nowMinute = '0' + nowMinute;
}
//IDの生成
thisID = nowYear + nowMonth + nowDay + nowHour + nowMinute;
//値を返す
return thisID;
}
//データの登録
function blog_insert(){
//データの取得
date = localStorage.getItem('nowDate');
title = $('#blog_title').val();
id = $('#blog_id').val();
contents = $('#blog_contents').val();
// userId = $.cookie('user_id');
// userName = $.cookie('name');
//送信用データの生成
data = {'date':date,'title':title,'id':id,'contents':contents};
//データを送信し登録する
//データベースへの問い合わせ
$.ajax({
url:'./php/blog_insert.php',
type:'get',
cache: false,
dataType:'text',
data:data,
success:function(mydata){
if(mydata == 1){
alert('データ登録終了しました。');
//各項目の初期化
$('#blog_title').val('');
$('#blog_contents').val('');
//IDの生成
id = thisYMDHM();
//日付の取得
date = thisYMD();
//日付の表示
$('#blog_YMD').text(date);
//IDの付与
$('#blog_id').val(id);
}else if(mydata == 0){
alert('データ登録失敗しました。');
}
},
error:function(){
}
});
}
//クリアボタンの動作
function blog_cancel(){
//各項目の初期化
$('#blog_title').val('');
$('#blog_contents').val('');
//IDの生成
id = thisYMDHM();
//日付の取得
date = thisYMD();
//日付の表示
$('#blog_YMD').text(date);
//IDの付与
$('#blog_id').val(id);
}
//閉じるボタンの動作
function blog_insert_close(){
//document.location = "./blog_manage.html";
}
実際のところ要所要所で昨日分割をしたことにより素直にJavascriptもかけています。
実際のところ言えることは使うところに合わせてバックエンドであるPHPを書くとこの上なく強いといった部分があります。
PHPはとっつくにくい所も多いですが。
なれてしまえば簡単にかけます。
実はこの前フロントエンドのプログラミングを書いていたのですがデータベースの接続するためのコードがまだJavaでプログラミング中だったためダミーで接続するためのプログラムをサクッとPHPで書いてしまったことがあります。
Javaも実際には良い言語ですが中間言語を作っているので実際サーバ上で動かすとなると重たくなることが多いですが。
PHPは一般的な言語なので率直にかけます。
最近はPHPのC++化が始まっているようです。
P++といった話もよく出てきています。
実は最近自分はPythonを書いてますが。
PHPと共生したいなぁと思っています。
できればスクレイピングはPython、重たい処理系はPHPと使い分けをすることを今後は考えています。
さぁ、みんなも怖がらずPHPerしましょう。