Ajaxでデータベース更新

WEBサイトでDBを用いてシステム構築しているケースは多々あります。

使用するテーブルが1つならいいけど複数のテーブルを使用していて、更新の際にすべて変更しなきゃいけないときってめんどくさいですよね。

adminページ的なものを設けてもPHPで更新するとなるとページ遷移が必要になってTable1を更新→遷移→Table2を更新→遷移...みたいな。

というわけでこのページ遷移をなくす方法として非同期通信(Ajax)を使用する方法をあげときます。

一応例として作ったページはこちら

適当にフィールドにデータいれて修正ボタンを押してもらえたらDBの値が更新されます。
更新されたデータはテーブル情報のとこに出力されるようになってます。

まず用意するファイルは4つ

  • index.html
  • jquery.js
  • ajax_revise.js
  • revise.php

jquery.jsはJavaScriptのフレームワークです。 無料配布されてるのでこちらからダウンロードしてきて使用してください。

残りの三つは自分で勝手に作ってください。

ファイルの中身はこんな感じ

index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="ajax_revise.js"></script>
<link rel="stylesheet" href="main.css" type="text/css" />
<title>ajaxでデータベース更新</title>
</head>

<body>
<div id="tableinfo"></div>

<br />

<div>
    <h4>修正フォーム</h4>

    <table>
    <tr>
    <td>field1</td><td><input type="text" width="5" id="data1" /></td>
    </tr>
    <tr>
    <td>field2</td><td><input type="text" width="5" id="data2" /></td>
    </tr>
    </table>

    <br />

    <input type="button" value="修正" id="revise" />

</div>
</body>
</html>

ajax_revise.js

// JavaScript Document
$(function(){
	$.post("revise.php",{},function(res){
		$("#tableinfo").html("テーブル情報<br />field1:"+res.field1+"<br />field2:"+res.field2)
		$("#data1").val(res.field1);
		$("#data2").val(res.field2);
	},"json");
	$("#revise").click(revise);
});

function revise(){
	a = $("#data1").val();
	b = $("#data2").val();

	$.post("revise.php",{field1:a,field2:b},function(res){
		$("#tableinfo").html("テーブル情報<br />field1:"+res.field1+"<br />field2:"+res.field2)
		$("#date1").text(res.field1);
		$("#date2").text(res.field2);
	},"json");
}

revise.php

<?php
$hostname="******";
$username="******";
$password="******";

$dbname="******";

$conn = mysql_connect($hostname, $username, $password) or die(mysql_error());
mysql_select_db($dbname) or die(mysql_error());  

$sql = "SET NAMES utf8";
$res = mysql_query($sql) or die(mysql_error());

if(isset($_POST['field1']) && isset($_POST['field2'])){
	$field1=htmlspecialchars($_POST['field1'],ENT_QUOTES);
	$field2=htmlspecialchars($_POST['field2'],ENT_QUOTES);

	$sql = "update `test20091230` set
		`field1` = '".$field1."' ,
		`field2` = '".$field2."'
	where `no` = '1'";

	$res = mysql_query($sql) or die(mysql_error());
}

$sql = "select * from `test20091230` where `no`='1'";
$res = mysql_query($sql) or die(mysql_error());

$data = mysql_fetch_array($res, MYSQL_ASSOC);

$values = array('field1' => $data['field1'], 'field2' => $data['field2']);

$json = json_encode($values);

mysql_free_result($res);
mysql_close($conn);  

echo $json;

?>

index.html
5~6行目でjQueryとajax_revise.jsを読み込んでいます。

7行目はCSSなのであってもなくてもいいです。 
見栄えが少しマシになります。

12行目はajax_revise.jsからhtmlを流し込むためのDivです。(セレクタは#tableinfo)
21、24行目に修正データを入力するinputタグを配置しています。

30行目でボタンを設置し、このボタンのクリックと同時に修正されるようにします。

ajax_revise.js
2行目の$(function(){ はindex.htmlがすべて読み込まれたあとに実行されることを保証されてる範囲です。

3行目でrevise.phpにPOSTで通信してます。 返された値はjsonでresに格納されます。

4~6行目でresをindex.htmlの各セレクタに流し込みます。

8行目はイベントリスナの登録です。 11行目以降がボタンをクリックされたときの動きになるのですが、こちらは$(function(){の範囲外ですのでindex.htmlが読み込まれる前に実行される可能性があり、#reviseを正常に解釈できない可能性があるので先に登録しておきます。

11行目以降は前述の通り、修正ボタンをクリックされたあとの動きです。

12~13行目で修正フォームに記入された値をとりa,bに格納。
それを引数として15行目でrevise.phpにまた値を送っています。

以下は2行目~の部分と大差ないので省略します。

revise.php
2~6行目にそれぞれ自分のデータベースのデータを入力してください。

8~9行目はmysqlに2~6行目で定めたデータを使ってアクセス。

11~12行目はmysqlのエンコードの設定です。 僕のDBは少し変なことしてしまったのでこれが必要になります。 なくても動く人もいるけどあっても変なことにはならないので触らないのが吉

14~23行目はindex.htmlでボタンをクリックされ、ajax_revise.jsでデータをPOSTで送られてきたときに動くところで、受け取った値でデータベースを更新しています。 ちなみに今回はレコード番号1を更新するという形にしました。

26~27行目で更新後あるいはPOSTでデータが送られていなければそのままのレコードをとってきます。

29行目でレコードのデータを$dataに格納しています。(今回はレコードが1つしかないのが自明なのでそのままの代入でおkです)

31行目でそれを連想配列で保管しています。

33行目でjsonに変換しています。
もともとjsonに変換する関数はPECLにあったんですがPHP5.2以降では標準で存在します。
なので自分のPHPが5.2以降ならこのままでおkです。 以前ならPECLから引っ張てきてください。

35~36行目でmysqlとの通信終了

38行目で生成されたjsonデータを出力

ちゃっちぃプログラムですがこんな感じで非同期通信でのデータベースが可能になります。
ajax_revise.jsで普通にjQuery使っちゃってますが意味不明なかたは日本語リファレンスがあったと思うのでそちらを参照してください。

1 Comment
12月 30, 2009 in PHP, ajax, javascript

WordPress移行

こんにちは なかじです。

新たにWordpressなるものを導入してみました。

MT4からの鞍替えですが設定超楽ですね。

僕の使ってるxreaのサーバーではPHPがセーフモードで動くため.htaccessいじらないと自動アップデートやテーマの追加等で色々こまるみたいですが。

幸いサポートがしっかりしていたのですぐなんとかなりました。

追加した.htaccessは以下 (追加先:wordpress設置ディレクトリ直下)

<Files ~ "^(async-upload|update-core|update|plugins|plugin-install)\.php$">
AddHandler application/x-httpd-phpcgi .php
</Files>

正規表現でcgiとして動作させる必要のあるファイルだけひろって変更しています。
xreaセーフモードには度々泣かされてるけど今回はすんなりいってラッキーだった。

追加したプラグイン一覧

  • Syntax Highlighter for WordPress
  • WP-Slimbox2
  • Insights
  • WP-PageNavi
  • Google Analytics for WordPress
  • WPtouch iPhone Theme
  • Ktai Style
  • Twitter Tools
  • Akismet

用途が気になる方はぐぐってください(おい

No Comments
12月 29, 2009 in WordPress