SQLの窓

2009年10月24日


PHP : PDO : SQLExpress(SQLServer)の読み込みと同時更新

前提条件
Visual Studio をインストール時にインストールされた SQLExpress の
設定は以下を参考にして下さい
SQLExpress 2005 の接続設定

単独でダウンロードしてインストールした場合は、上記ページと以下を参考にして下さい
SQLExpress 2005 のインストールから最速設定 

その上で以下よりデータとスクリプトをダウンロードしてテーブルを作成して下さい
VBS : SQLExpress(SQLServer) に 販売管理B を作成する 

上記販売管理Bの社員マスタには、生年月日が無いので以下の SQL を実行して下さい
alter table [社員マスタ] add 
	[生年月日] DATETIME

概要
PHP でデータベースにアクセスする場合、PDO を使用すると接続部分を変更するだけで、
一般的な処理ならば他のDBでも同じコードで済むというメリットがあります。
ただ、PHP は フリーソフトなので、データベースに対する対応については、利用する側
が十分に考察する必要があります。

PDO の SQLServer に対する見解として、オンラインマニュアルで以下のような記述を
見る事ができます
Windows では、Microsoft SQL Server や Sybase データベースにアクセスする際には
PDO_ODBC ドライバを使用すべきです。 Windows 版のネイティブの DB-LIB は時代遅れになっており、
スレッドセーフではない上に Microsoft にもサポートされていません。
要するに、PDO で SQLExpress で接続する場合は ODBC を使えという事です。
実際問題として、Windows では COM を使っても十分動きますし、SQLServer 特有の
処理は、おそらく SQL-DMO を COM 経由で処理すると動くと思いますし、一般的
な処理であれば、ODBC を使うのが最も安全でしょう
<?
$strDriver = "{SQL Native Client}";
$strTarget = "NIGHT_TCP";	// 別名
$strDB = "lightbox";
$strUser = "sa";
$strPass = "passwordpassword";

// **********************************************************
// Windows 用動的ロード
// **********************************************************
if ( !extension_loaded( "pdo" ) ) {
	dl("php_pdo.dll");
}
if ( !extension_loaded( "pdo_odbc" ) ) {
	dl("php_pdo_odbc.dll");
}

// **********************************************************
// 接続
// **********************************************************
$Cn = new PDO(
	"odbc:Driver=$strDriver;Server=$strTarget;" .
	"Database=$strDB;Uid=$strUser;Pwd=$strPass;");
$Cn2 = new PDO(
	"odbc:Driver=$strDriver;Server=$strTarget;" .
	"Database=$strDB;Uid=$strUser;Pwd=$strPass;");


$Query = "select * from [社員マスタ]";

// **********************************************************
// レコードセット
// ※ メタデータは取得できませんでした
// **********************************************************
$handle = fopen( ".\\社員マスタ.csv", "w" );

$Rs = $Cn->Query( $Query );

$nFields = $Rs->columnCount();
$hbuffer = "";
$update_cnt = 0;
while( $result = $Rs->fetch(PDO::FETCH_ASSOC) ) {
	if ( $hbuffer == "" ) {
		$field_names = array_keys($result);
		for( $i = 0; $i < $nFields; $i++ ) {
			if ( $hbuffer != "" ) {
				$hbuffer .= ",";
			}
			$hbuffer .= $field_names[$i];
		}
		fwrite( $handle, $hbuffer . "\n" );
	}

	$buffer = "";
	for( $i = 0; $i < $nFields; $i++ ) {
		if ( $buffer != "" ) {
			$buffer .= ",";
		}
		$buffer .= $result[$field_names[$i]];
	}
	fwrite( $handle, $buffer . "\n" );

	// 更新( 別接続 )
	$day = ($update_cnt % 5) + 1;
	$Query = "update [社員マスタ] set [生年月日] = '2005/01/0$day'";
	$Query .= " where [社員コード] = '{$result['社員コード']}'";
	$Cn2->exec( $Query );
	// false がエラーです。 0 は、実行が成功しても対象が無かった場合に返ってきます
	// ですから、if ( !$ret ) は正しくありません
	if ($ret===false) {
		print_r( $Cn->errorInfo() );
	}

	$update_cnt++;

}

// **********************************************************
// ファイルクローズ
// **********************************************************
fclose( $handle );
// **********************************************************
// 接続解除
// **********************************************************
$Cn2 = null;
$Cn = null;
?>

【SQLExpressの最新記事】
posted by lightbox at 2009-10-24 23:11 | SQLExpress | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり