SQLの窓

2016年06月18日


MySQL で、主キーの作り変えのプロセス / serial では、自動的に インデックスが作成されます

serial は、自動採番列を作成する為に使いますが、その際列名でユニークインデックスが作成されています。しかし、bigint(20) unsigned NOT NULL AUTO_INCREMENT で作成した場合は何も作成されないので、削除しても動作します。

ストーリー

掲示板テーブルを作成しましたが、主キーを自動採番列としているので、一つの掲示板でしか使用する事が出来ないため、掲示板(スレッド)を区別する為の ID として no 列を追加する事が目的です。

現状確認

show create table board で、MySQL に登録されている create table 文を取得します。この時、UNIQUE KEY `row_no` (`row_no`) が定義されている事が解ります。

列追加

alter table `board` add `no` VARCHAR(20) after `row_no` で、元の主キーである row_no の後ろに no 列を追加します。この時、既にデータが投入されている場合は、no の中は null が設定されます。

主キー削除

主キーを作り変える為に、いったん現在の主キーを alter table board drop primary key で削除します。そして、show create table board で定義の変化を確認します。

主キー作成

既にデータが投入されている場合は、no 列が null の為、主キーが作成できません。なので、全ての列のデータに何かデータをセットします( update board set no = '0' )

その後、alter table board add primary key(`row_no`,`no`) で主キーを作成します。

serial で作成されたユニークキーの削除

特に実行する必要はありませんが、それほど必要なインデックスでは無いので削除する場合は、show index from board でインデックス名を確認して、alter table board drop index row_no で削除します。

データの復帰

既に新しいフォーマットで作成されたデータがある場合は、insert into board select * from board2 という SQL でデータを投入できます。
※ board2 が保存されていた新しいフォーマットのデータ

-- 最初に作成したテーブルのSQL
CREATE TABLE `board` (
  `row_no` serial,
  `body` varchar(1000),
  `subject` varchar(200),
  `from` varchar(20),
  `pdate` datetime,
  `cdate` datetime,
  primary key(`row_no`)
);

show create table board;

CREATE TABLE `board` (
  `row_no` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `body` varchar(1000) DEFAULT NULL,
  `subject` varchar(200) DEFAULT NULL,
  `from` varchar(20) DEFAULT NULL,
  `pdate` datetime DEFAULT NULL,
  `cdate` datetime DEFAULT NULL,
  PRIMARY KEY (`row_no`),
  UNIQUE KEY `row_no` (`row_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 主キーに掲示板IDを追加する為に、no 列を row_no の後に追加
alter table `board` add `no` VARCHAR(20) after `row_no`;

-- 主キーの削除
alter table board drop primary key;

show create table board;

CREATE TABLE `board` (
  `row_no` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `no` varchar(20) DEFAULT NULL,
  `body` varchar(1000) DEFAULT NULL,
  `subject` varchar(200) DEFAULT NULL,
  `from` varchar(20) DEFAULT NULL,
  `pdate` datetime DEFAULT NULL,
  `cdate` datetime DEFAULT NULL,
  UNIQUE KEY `row_no` (`row_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--※ すでにデータがある場合( no にセットするのは適当な文字列 )
update board set no = '0';

-- 主キー作成
alter table board add primary key(`row_no`,`no`);

show create table board;

CREATE TABLE `board` (
  `row_no` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `no` varchar(20) NOT NULL DEFAULT '',
  `body` varchar(1000) DEFAULT NULL,
  `subject` varchar(200) DEFAULT NULL,
  `from` varchar(20) DEFAULT NULL,
  `pdate` datetime DEFAULT NULL,
  `cdate` datetime DEFAULT NULL,
  PRIMARY KEY (`row_no`,`no`),
  UNIQUE KEY `row_no` (`row_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- インデックスの確認
show index from board;

-- インデックスの削除( ここは内容確認の為 )
alter table board drop index row_no;

CREATE TABLE `board` (
  `row_no` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `no` varchar(20) NOT NULL DEFAULT '',
  `body` varchar(1000) DEFAULT NULL,
  `subject` varchar(200) DEFAULT NULL,
  `from` varchar(20) DEFAULT NULL,
  `pdate` datetime DEFAULT NULL,
  `cdate` datetime DEFAULT NULL,
  PRIMARY KEY (`row_no`,`no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

-- 保存していたデータの復帰
insert into board select * from board2;




タグ:SQL
posted by lightbox at 2016-06-18 13:38 | Comment(0) | MySQL | このブログの読者になる | 更新情報をチェックする

2016年05月31日


DB のデータを簡単に沢山作る方法は inner join

ページ処理のテストを行う為に、元を 7 件として、56 件のデータに増やす方法です。それぞれの SQL は、RDBMS 毎に動作するように書き換えれば実行可能です。

元のテーブル

既に 7 件のテストデータがあり、phpMyAdmin でエクスポートしています。phpMyAdmin はたいていのレンタルサーバで用意されていると思いますし、最新(4.6.2/php5.5以上)をダウンロードして解凍してアップロードするだけで動作します( PHP6 の場合は、最新の phpMyAdmin は動作しないようでした。Windows PC でも普通に動きます )
CREATE TABLE IF NOT EXISTS `board` (
  `row_no` serial,
  `body` varchar(1000),
  `subject` varchar(200),
  `from` varchar(20),
  `pdate` datetime,
  `cdate` datetime,
  primary key(`row_no`)
)

※ row_no は自動採番列です

データ

以下はエクスポートしたデータです。
-- phpMyAdmin SQL Dump
-- version 4.4.15.5
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: 2016 年 5 月 28 日 13:26
-- サーバのバージョン: 5.6.17
-- PHP Version: 5.4.13

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `lightbox`
--

--
-- 挿入前にテーブルを空にする `board`
--

TRUNCATE TABLE `board`;
--
-- テーブルのデータのダンプ `board`
--

INSERT INTO `board` (`row_no`, `body`, `subject`, `from`, `pdate`, `cdate`) VALUES
(3, '「日本と米国が力を合わせて、世界の人々に希望を生み出すともしびとなる」。安倍晋三首相は27日、オバマ米大統領とともに訪れた広島市の平和記念公園で、強固な日米同盟をアピールした。昨年4月、米上下両院合同会議での演説で先の大戦への「痛切な反省」を表明した首相からは、今回のオバマ氏の広島訪問を、日米関係を新たな段階に進める節目にしたい思惑が透けて見える。', '<伊勢志摩サミット>閉幕 親密な日米 首相腐心', '毎日新聞', '2016-05-28 13:15:04', '2016-05-09 11:52:51'),
(10, '電子コミック販売サイト「漫画onWeb」や電子書籍取次サービス「電書バト」などを運営する漫画家の佐藤秀峰さんは、2月に伝書バトが実施した、電子コミック131冊を各11円で販売するセールの効果で、2月の売り上げ総額が3億円を超えたことを明らかにした。売り上げトップだった佐藤さん本人には、1億3000万円以上の印税が入ったという。', '電子コミック「11円」セールで売り上げ3億円超 トップ作家に印税1億3000万円 「常識打ち破る数字」', 'ITmedia ニュース', '2016-05-28 13:22:37', '2016-05-14 20:07:14'),
(11, 'タカタ製エアバッグの欠陥問題で、国土交通省は27日、火薬の劣化を防ぐ乾燥剤が入っていないエアバッグについて、新たに約700万台がリコール(回収・無償修理)対象になると明らかにした。\r\n\r\nメーカー各社に順次リコールを求め、2018年度末までに改修を済ませたいとしている。\r\n\r\n一連の問題では、国内で延べ約1259万台がリコールされており、対象は2000万台規模に達することになる。\r\n', 'リコール2000万台規模に=新たに700万台、タカタ製エアバッグ', '時事通信', '2016-05-28 13:18:36', '2016-05-14 20:08:07'),
(12, '酒の行き過ぎた安売りに待ったをかける規制は、大手スーパーやディスカウント店などの安値攻勢で経営が苦しくなった「町の酒屋さん」を救済する狙いがある。だが、厳しい罰則を恐れて、業者が萎縮し、健全な価格競争まで妨げてしまうリスクもはらんでいる。', '改正酒税法成立 量販店萎縮、価格形成ゆがみも', '産経新聞', '2016-05-28 13:17:26', '2016-05-14 20:08:11'),
(14, '広島の原爆資料館はオバマ米大統領が訪れた後の27日夜に記者会見し、オバマ氏が佐々木禎子さんの折り鶴や資料などを見て、自身も4羽の折り鶴を資料館に寄贈したと説明した。佐々木禎子さんは、原爆症で12歳で亡くなり、「原爆の子の像」のモデルとして知られている。政府関係者によると、大統領が自ら折ったもので、小中学生に手渡したという。志賀賢治館長は「感慨深げな表情で、岸田文雄外相の説明を聞いていた。視察時間は短く残念だったが、伝えたかったことを伝えられたのではないか」と語った。', '<米大統領広島訪問>オバマ氏、4羽の折り鶴 その思いは…', '毎日新聞', '2016-05-28 13:16:09', '2016-05-09 11:52:51'),
(21, '日立製作所は27日、中国・広州市の高層ビル「広州周大福金融中心」向けに受注したエレベーターが分速1200メートル(時速72キロ)を記録し、世界最高速度を達成したと発表した。14日に行った走行試験で世界最高速度を達成。今秋の稼働に向け、据え付けや調整作業を進めている。', '日立、エレベーターの最高速度達成', 'SankeiBiz', '2016-05-28 13:19:27', '2016-05-14 20:08:07'),
(22, 'レンタルビデオ店「TSUTAYA(ツタヤ)」を運営するカルチュア・コンビニエンス・クラブ(CCC)と民泊仲介サイト世界最大手の米Airbnb(エアビーアンドビー)が27日、事業提携を発表した。訪日観光客の増加で宿泊ニーズが高まる中、「ツタヤ」や「Tポイント」を展開するCCCのノウハウで日本市場を開拓し、一般住宅に有償で客を泊める民泊サービスの定着を目指す。', '米民泊サイト最大手が日本進出でツタヤと提携 外国人の訪日客に照準', '産経新聞', '2016-05-28 13:20:24', '2016-05-28 13:20:24');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


inner join で増殖して追加

inner join で条件を書かなければ、n 行あれば、n x n 行の結果を返します。その際、同じ表を a と b で別名定義して自己結合させます。

結果の行は、board の 定義に合わせて a 表のみから取得して、row_no は 自動採番なので null as row_no として先頭に作成します。

その結果をさらに board に insert する事によって、row_no は、新しく自動採番された行として挿入されます。その結果 a( 最初の行数 ) + n( 元の行数 ) * n( 元の行数 ) の行を登録する事になります。
insert into board
select
	null as row_no,a.body,a.subject,a.from,a.pdate,a.cdate
	from board a
inner join `board` b
もう一回すると 3192 件になるので、これ以上は注意して実行する必要があります。

乱数関数で日付データのみ、ばらつかせる

ここではさほど厳密にバラつかせる必要は無かったので、時間部分に適用しています。
※ PIPES_AS_CONCAT は、文字列結合に Oracle と同じ || を使用可能にする設定です。
SET sql_mode='PIPES_AS_CONCAT';

update board set pdate = cast('2016/05/28 0' || truncate(Rand()*10,0) || ':00' as datetime)



posted by lightbox at 2016-05-31 19:36 | Comment(0) | MySQL | このブログの読者になる | 更新情報をチェックする

2015年08月03日


MySQLの日本語オンラインマニュアル、4.1 と 5.1 と 5.6

▼ こちらから、4.1 と 5.1 の日本語マニュアルが参照できます
http://mysql.stu.edu.tw/doc/index.html
※ ここは、台湾ドメインですが、中国の教育省管轄のようです。


▼ アーカイブ


オンラインは最新が 5.7 で、英文のみですが、5.6 は日本語版があります

▼ よく使うセクション
第13章 SQL ステートメントの構文

※ こちらも重要なので
4.5.1. mysql − MySQL コマンド行ツール

▼ Windows の 5.6 のコマンドラインオプションです
http://winofsql.jp/mysqlhelp.txt

▼ Windows の コマンドプロンプトで、SHIFT_JIS(cp932) に設定されている事を確認した処理です



どうしても当時のオリジナルを確認したい場合

WEB アーカイブより http://dev.mysql.com/doc/refman/5.1/ja/ で確認できます( 2014/7/3 ぶんより )



posted by lightbox at 2015-08-03 10:28 | MySQL | このブログの読者になる | 更新情報をチェックする

2014年11月13日


MySQL 5.6 (Generally Available (GA) Releases) インストール

phpMyAdmin 4.2.11 で表示すると以下のようになります


※ 5.6.11 と 5.6.17 を利用しましたが、手順は同じです ( 2013-05-05 )。
( 5.6.17 で、ODBC ドライバがインストールされなかったので、単体でインストールしました )

▼ ダウンロード
Download MySQL Community Server( 最新 )
MySQL Community Server (Archived Versions)


もう二度ほどインストール(5.6.11)していますし、学生に同時に20台くらいインストールさせました。殆ど選択肢は無く、途中で root のパスワードを入力するぐらいです。アプリケーション側で SHIFT_JIS しか対応していない場合は、同時にインストールされる ODBC ドライバの設定で sjis を選択してやれば良いです。( cp932 のほうがいいかもしれません )
関連する記事

MySQL 5.6.11 : テストデータ自動作成スクリプト

ODBC 接続テストの DB は mysql で、登録したパスワードを root と入力すればコンボボックスに DB がいくつか表示されますので選択します。二つほどサンプル DB が登録済みですが全て英文です。 Windows インストーラの但し書き
MySQLのインストーラは32ビットですが、 32ビットと64ビットの両方のバイナリがインストールされます。
なので、32ビットを今からインストールしますが、あとから 64ビットの PC でもインストールして動作確認する予定です。 mysql-installer-community-5.6.11.0.msi ❶ この次はお決まりのライセンスのアクセプトなので、チェックして次へ。 ❷ 次は Exexute をクリックすると勝手にチェックして『次へ』となるのでそれから次へ ▼ 結局こうなる。 ❸ 選択肢が出ますが、プログラマのテスト用だと普通はこのままで。 ❹ 必要なものが揃っているか確認が出ます。 ※ これを調整するには戻って『カスタム』で行います ❺ ここは、最終的にインストールされるものの一覧なので『Execute』します ❻ 問題無い場合は以下のようにインストールが完了しますので『次へ』 ❼ ここ以降で初期設定ですが、パスワード以外は特別なものはありません。 ▼ クリックすると大きく表示します 『パスワードが弱い』とか怒られますが、気にしないで次へ。 ▼ クリックすると大きく表示します どうしてもサービス名を変えたい場合は、ここで変更。チェックボックスは後からサービスの設定で『手動』にするので、ここでチェックを外さなくてもいいですが、ここでは外してみました。 ▼ クリックすると大きく表示します この後全てインストールされて、MySQL Workbench CE 5.2.47 が起動されますが、これを使うほどの事は通常しないので、終了させて下さい。 MySQL56 は『手動』で『開始』されますので、既存のソフトで接続すればすぐ使えます。ODBC アドミニストレータには、ODBC ドライバが登録されているので MySQL として DSN を作成します。( 通常のクライアントアプリならば、ユーザ DSN でかまいませんが、システム DSN に作っても動作します ) コマンドプロンプトでの確認 mysql.exe でログイン( mysql -u root -p )して、show variables like 'character\_set\_%' を実行すると以下のように表示され、コマンドプロンプトではクライアントが CP932(SHIFT_JIS) である事が解ります。 mysql.exe の インストールパス例 => "C:\Program Files\MySQL\MySQL Server 5.6\bin\mysql.exe" mysql -u root --default-character-set=utf8 -p でログインしてやると、上の cp932 は utf8 に変わります。 SQLの窓 Build C++ で動作確認 ダウンロード 解凍して、WinOfSql.exe を実行して下さい。M ボタンから DSN と mysql と root と パスワード を入力すると、とりあえずテーブルの一覧が出て動作確認になります。 メニューからデータベース一覧を実行すると、下段に一覧が表示されるので、ダブルクリックすると DB 名がクリップボードにコピーされるのでその DB で接続してみると、サンプル DB の中身が見れます。 sakila データベースに接続 テーブルをダブルクリックすると、行データが表示されます。 actor テーブルは、主キーを持っているので、そのままデータを更新できます。メニューの『編集』から『更新』を選択すると更新されます。 DSN で sjis を設定しているので、日本語の列名を使用できます。 下段で、右クリックして『列追加』で追加できます。 関連する記事

posted by lightbox at 2014-11-13 18:19 | MySQL | このブログの読者になる | 更新情報をチェックする

2014年10月29日


MySQL : 引数の無い LAST_INSERT_ID() と 引数のある LAST_INSERT_ID( n ) の使用方法

引数の無い使用方法
select LAST_INSERT_ID()
MySQL の LAST_INSERT_ID 関数は、select LAST_INSERT_ID() として同一接続内で、最後に更新された AUTO_INCREMENT オプションを持つ列に対する最後の更新結果の値を戻します。

返される値は、同一接続内でひとつなので、直前に更新された表が保持していた値に依存します。

但し、単一の INSERT 文を使用して複数の行をインサートする場合、LAST_INSERT_ID() は、最初の インサートされた行のみに対して生成された値を戻します。これは、他のサーバに対して同じ INSERT 文を簡単に再現できるようにするためです。
引数のある使用方法
update コントロールマスタ
   set 売上伝票 = LAST_INSERT_ID( 売上伝票+1 )
where キー = '1'
update 文で LAST_INSERT_ID( 列名+1 ) を使って、整数型の列をカウントアップします。これによって、現在の『整数型の列の値』を取得する事ができます。( select LAST_INSERT_ID() で取得します )

これらは、更新と取得が同時にシステム側で行われる事になるので、テーブルをロックして更新と取得とロック開放という通常の処理の代替として簡単に処理ができます。

関連する記事

MySQL における AUTO_INCREMENT 列の設定および詳細


posted by lightbox at 2014-10-29 15:41 | MySQL | このブログの読者になる | 更新情報をチェックする

MySQL における AUTO_INCREMENT 列の設定および詳細

以下は一般的なテーブル作成で、列のオプションとして AUTO_INCREMENT を指定し、表のオプションとして AUTO_INCREMENT の初期値を設定しています。
CREATE TABLE `自動主キー` (
	`コード` INT AUTO_INCREMENT
	,`メッセージ` VARCHAR(100)
	,PRIMARY KEY(`コード`)
) AUTO_INCREMENT = 1000

● AUTO_INCREMENT は整数タイプにのみ対応します
● インデックスされた AUTO_INCREMENT カラムに NULL (推奨) か 0 の値を挿入すると、カラムは次のシーケンス値に設定されます
● 行の挿入後に AUTO_INCREMENT 値を取得するには、 LAST_INSERT_ID() SQL 機能を使用します
● 各テーブルに AUTO_INCREMENT カラムは1つだけ存在する事ができます
● インデックスされる必要があります
● DEFAULT 値を持つ事はできません
● AUTO_INCREMENT カラムは正数のみを含んでいる時だけ正しく機能します
● SERIAL 属性は BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE のエイリアスです
● AUTO_INCREMENT 値をリセットする為に ALTER TABLE tbl_name AUTO_INCREMENT = n を実行しますが、その値は、現在カラム内にある最大値よりも小さく設定する事はできません
● AUTO_INCREMENT カラムを追加する為には、以下のような SQL を実行します
ALTER TABLE テーブル名
	ADD 列名 INT UNSIGNED NOT NULL AUTO_INCREMENT
	,ADD PRIMARY KEY( 列名 )
● 他の属性列を変更する事もできます
ALTER TABLE テーブル名
	CHANGE COLUMN 列名
	列名 INT UNSIGNED NOT NULL AUTO_INCREMENT
	,ADD INDEX ( 列名 )


posted by lightbox at 2014-10-29 13:24 | MySQL | このブログの読者になる | 更新情報をチェックする

2014年10月12日


MySQL のプログラムからの経過時間の表現方法( CAST, STR_TO_DATE, GET_FORMAT, DATE_FORMAT, TIMEDIFF )

MySQL で datetime 型に入っているデータを使って、24時間未満の経過時間を取得するのには、TIMEDIFF 関数を使います。

MySQL で出退勤の列を datetime 型で持った場合、列を使用して DATEDIFF と TIMEDIFF で直接計算

しかし、プログラマから実際に渡すのは文字列である事が殆どなので、TIMEDIFF を使う前提条件として、CAST, STR_TO_DATE, GET_FORMAT, DATE_FORMAT 関数が必要になります。

MySQL 5.1 リファレンスマニュアル :: 11.5 日付時刻関数

CAST と STR_TO_DATE は、'(シングルクォート)で表現された日付データを実際の日付データとして MySQL に認識させる為に使用します。STR_TO_DATE 関数を使用する場合は、文字列のフォーマットに合わせてフォーマット文字列を用意する必要があります。また、その文字列をある程度自動で取得する方法が、GET_FORMAT 関数です( 使える場面は限定的ですが )。そして、TIMEDIFF の結果として意味のある部分は時刻部分なので、DATE_FORMAT 関数で時刻部分のみを取り出すようにしいます。
select
   DATE_FORMAT(
     TIMEDIFF(
        STR_TO_DATE('2014/10/12 16:27:43', '%Y/%m/%d %H:%i:%s'),
        STR_TO_DATE('2014/10/11 16:27:44', '%Y/%m/%d %H:%i:%s')
     ), '%H:%i:%s' ) as 経過時間1,

   GET_FORMAT(DATETIME,'JIS') as 標準フォーマット,

   DATE_FORMAT(
      TIMEDIFF(
         STR_TO_DATE('2014-10-12 16:27:43', GET_FORMAT(DATETIME,'JIS')),
         STR_TO_DATE('2014-10-11 16:27:44', GET_FORMAT(DATETIME,'JIS'))
    ), '%H:%i:%s' ) as 経過時間2,

   DATE_FORMAT(
      TIMEDIFF(
         CAST('2014-10-12 16:27:43' as datetime),
         CAST('2014-10-11 16:27:44' as datetime)
    ), '%H:%i:%s' ) as 経過時間3


上の SQL の実行結果は以下のようになります





タグ:MySQL
posted by lightbox at 2014-10-12 16:31 | MySQL | このブログの読者になる | 更新情報をチェックする

2014年10月11日


MySQL で出退勤の列を datetime 型で持った場合、列を使用して DATEDIFF と TIMEDIFF で直接計算

以下のような単純な表を考えた場合、当日の勤務時間の計算としては、TIMEDIFF 関数を使います
create table `出退勤トラン` (
	`社員コード` varchar(4)
	,`日時` date
	,`出勤` datetime
	,`退勤` datetime
	,primary key(`社員コード`)
)

TIMEDIFF と DATEDIFF は、それぞれ時間と日付に対して演算を行います。結果として TIMEDIFF は、時刻表示で経過時間をあらわすため、23:59:59 より大きい経過を実行しようとするとエラーになります。
DATEDIFF は経過日数を整数で表すのですが、日付部分が変わると、経過時間が 1 秒でも 1 日を返します
select 
	社員コード,
	退勤,
	出勤,
	TIMEDIFF(退勤,出勤) as 経過時間,
	DATEDIFF(退勤,出勤) as 経過日数
 from 出退勤トラン

▼ SQL 実行の結果
社員コード 退勤 出勤 経過時間 経過日数
0001 2014/10/12 16:27:44 2014/10/11 16:27:45 2014/10/11 23:59:59 1
0002 2014/10/11 16:27:46 2014/10/11 16:27:45 2014/10/11 0:00:01 0
0003 2014/10/12 0:00:01 2014/10/11 16:27:45 2014/10/11 7:32:16 1
0004 2014/10/11 23:59:59 2014/10/11 16:27:45 2014/10/11 7:32:14 0
0005 2014/10/12 2014/10/11 23:59:59 2014/10/11 0:00:01 1
※ 経過時間の日付部分は、SQLを実行した日の日付です


タグ:MySQL
posted by lightbox at 2014-10-11 17:26 | MySQL | このブログの読者になる | 更新情報をチェックする

2014年05月10日


MySQL を UTF-8 環境で作成して、mysqldump.exe でバックアップするバッチファイルのサンプル

Windows では、MySQL は UTF-8 環境で作成されますが(MySQL 5.6 (Generally Available (GA) Releases) インストール)、クライアントを cp932(shift_jis) としてテーブルを作成し(MySQL 5.6 : テストデータ自動作成スクリプト)、mysqldump.exe で shift_jis のテーブル名を指定して実行すると、そのままでは認識してくれません。

--default-character-set=cp932 をコマンドラインに追加すると、テーブル名を認識してくれますが、出力されたデータは SHIFT_JIS と UTF-8 が混在になっています。( データ部分は SHIFT_JIS で、CREATE 文部分は UTF-8 )

エディタで、個別に該当のキャラクタセットで表示してやるとどちらも使えますが、--default-character-set=cp932 を指定せずに、テーブル指定無しで全て出力してやると、出力されたデータは全て UTF-8 になります。

※ cp932 にしないと、いくつかの文字が正しく変換されずに ? と表示されます( sjis だとそうなります )
setlocal
set run_path=C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqldump.exe
set save_path=%temp%\mysqldump.sql
set save_path_table=%temp%\mysqldump_table.sql
set save_tables=商品マスタ 社員マスタ

REM 全てのテーブルとビュー( 全て、UTF-8 で書き込まれます )
"%run_path%" --host=localhost --user=root --password=trustno1 --add-drop-table --force --quote-names lightbox > "%save_path%" & explorer /select,"%save_path%"

REM テーブル指定( CREATE 文部分のみが、UTF-8 で書き込まれます )
"%run_path%" --host=localhost --user=root --password=trustno1 --add-drop-table --force --quote-names --default-character-set=cp932 lightbox %save_tables% > "%save_path_table%" & explorer /select,"%save_path_table%"


▼ SHIFT_JIS 環境のエディタ内で、UTF-8 として表示された CREATE 文
--
-- Table structure for table `商品マスタ`
--

DROP TABLE IF EXISTS `商品マスタ`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `蝠・刀繝槭せ繧ソ` (
  `蝠・刀繧ウ繝シ繝荏 varchar(4) NOT NULL DEFAULT '',
  `蝠・刀蜷港 varchar(50) DEFAULT NULL,
  `蝨ィ蠎ォ隧穂セ。蜊倅セ。` int(11) DEFAULT NULL,
  `雋ゥ螢イ蜊倅セ。` int(11) DEFAULT NULL,
  `蝠・刀蛻・。杼 varchar(3) DEFAULT NULL,
  `蝠・刀蛹コ蛻・ varchar(1) DEFAULT NULL,
  `菴懈・譌・` datetime DEFAULT NULL,
  `譖エ譁ー譌・` datetime DEFAULT NULL,
  PRIMARY KEY (`蝠・刀繧ウ繝シ繝荏)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;




posted by lightbox at 2014-05-10 16:29 | MySQL | このブログの読者になる | 更新情報をチェックする

2014年05月09日


MySQL 5.6 : テストデータ自動作成スクリプト

2014/05/10 : DROP TABLE IF EXISTS 構文を追加し、charset に cp932をセットしました
2014/05/09 : ダイアログのラベル表記を XN Resource Editor(日本語版)で変更しました

※ MySQL のインストールと動作確認は、以下を参照して下さい。

MySQL 5.6.11(Generally Available (GA) Releases) インストール

スクリプトパッケージは以下になります
( mysql-installer-community-5.6.17.0.msi でテスト済みです )

ダウンロード


事前にデータベースを作成しておく必要がありますが、既存の一般データベースでもかまいません。
( ※再作成する場合は、ビューを全て削除し、テーブルを全て削除して下さい )

前述のリンク先の『動作確認』で使用した『SQLの窓 Build C++』で mysql に接続して、右のテキストエリアで create database lightbox と入力して『act』ボタンをクリックすると lightbox データベースが作成されます。( データベース名は 英字で適当に命名して下さい )



createHanbaiB.bat を実行するだけですが、MySQL ODBC 5.2w Driver MySQL ODBC 5.3 Unicode Driver がインストールされている必要があります( 前述のリンク先の内容でインストールするとインストールされます )

※ 現在 MySQL ODBC 5.3 Unicode Driver が最新です(mysql-connector-odbc-5.3.2-win32.msi)
ドライバ名が異なる場合は、process.wsf の 74 行目の "{MySQL ODBC 5.3 Unicode Driver}" を変更して下さい。
( レジストリの HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI に正しい文字列でツリーがあります )

関連する記事

MySQL のインストールと Windows7 64ビットの ODBC と 32ビットの ODBC

名前は組み合わせでランダムで作成しているので、スクリプト内を変更するとバリエーションをカスタマイズ可能です。 ▼ コマンドプロンプトで実行 charset は、SQLの窓 Build C++ の内部が SHIFT_JIS なので必要です。内部表現が Unicode のアプリケーションでは必要ありません( MySQL が utf-8 の場合 ) 関連する記事



posted by lightbox at 2014-05-09 21:29 | MySQL | このブログの読者になる | 更新情報をチェックする

2014年04月14日


PHP + MySQL : Windows の COM を使った ODBC 経由での接続とデータの取得(SELECT)

extension=php_com_dotnet.dll によって、Windows では、PHP が COM を使えるようになります。他の ODBC 経由と同じく、SHIFT_JIS 前提となりますが、本来の Fields コレクションの文字列での参照がうまく行かないので、連想配列を作成して利用の準備をしています。

PHP で COM を使うような状況は、VBScript のような Windows 純正のスクリプトを使う代わりに、PHP を Windows の保守に使うという選択肢です。そうすると、COM と PHP の関数群の両方が使えるようになります。
<?php
header( "Content-Type: text/html; Charset=shift_jis" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// 日本語設定
mb_language( "ja" );
// 内部エンコード
mb_internal_encoding("UTF-8");

// 接続オブジェクト
$cn = new COM( "ADODB.Connection" );
// レコードセットオブジェクト
$rs = new COM( "ADODB.Recordset" );

$server = 'localhost';
$db_name = 'lightbox';
$user = 'root';
$password = 'パスワード';

// 接続文字列作成
$connect_string = "Provider=MSDASQL;";
$connect_string .= "Driver={MySQL ODBC 5.3 Unicode Driver};";
$connect_string .= "Server={$server};";
$connect_string .= "DATABASE={$db_name};";
$connect_string .= "UID={$user};";
$connect_string .= "PWD={$password};";
$connect_string .= "charset=cp932;";

// 接続
try {
	$cn->Open( $connect_string );
}
catch ( Exception $ex ) {
	die( '{"error": "接続できませんでした: ' . $ex->getMessage() . '"}' );
}


$query = "select * from 社員マスタ";

try {
	// レコードセット取得
	$rs->Open( $query, $cn );
}
catch ( Exception $ex ) {
	die( '{"error":' . $ex->getMessage() . '"}' );
}

// 列数
$field_count = $rs->Fields->Count;
$count = 0;

?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<style>
* {
	font-family: "メイリオ", Meiryo, "MS Pゴシック", sans-serif;
	font-size: 12px;
}
table {
	border-collapse: collapse;
	border-style: solid;
	border-color: #c0c0c0;
	border-width: 1px;
	background-color: #FFFFFF;
}
td {
	padding: 5px;
	border-style: solid;
	border-color: #c0c0c0;
	border-width: 1px;
}
</style>
</head>
<body>

<?php
$log_file = "rowdata_006.log";

file_put_contents( $log_file,"" );

print "<table>\n";
while (!$rs->EOF) {
	print "<tr>\n";
	print "\t<td>" . ($count + 1) . "</td>\n";
	for( $i = 0; $i < $field_count; $i++ ) {
		$wk = $rs->Fields[$i]->value."";
		print "\t<td>{$wk}</td>\n";

		// 連想配列作成
		$field[$rs->Fields[$i]->name] = $rs->Fields[$i]->value."";
	}
	print "</tr>\n";
	$count++;

	file_put_contents( $log_file, print_r($field,true), FILE_APPEND );
	$rs->MoveNext();
}
print "</table>";

// レコードセットを閉じる
$rs->Close();

// 接続解除
@$cn->Close();
?>

<br>
出力件数 : <?= $count ?>



関連する記事

posted by lightbox at 2014-04-14 23:33 | MySQL | このブログの読者になる | 更新情報をチェックする

VBScript + MySQL : ADO( ODBC ) による接続とデータの取得(SELECT)

VBScript の形態は、大きく分けて3つあり、一つは単純な一枚のテキストに全てのスクリプトを書いて実行する拡張子が .vbs のもの。さらに、外部にスクリプトソースを分割する事ができる本格的なプログラミングをする人の為にある拡張子 .wsf のもの。そして、ここでは紹介しませんが、HTML で画面を作成し、ブラウザの中での動きと同じような環境で作成する拡張子 .hta の HTMLアプリケーションがあります。

MySQL に接続して csv ファイルを書き出すだけの処理を .vbs と .wsf で書いています。.wsf で特別な事をしていないのでここではどちらがという事がありませんが、.wsf のほうがいろいろ作法があり、複雑なことが可能になっています。

ADO は VBScript からアクセス可能な、主にデータベースを扱う為にあるオブジェクトです。通常、データーベースへのアクセスは、ADODB.ConnectionADODB.Recordset でほとんどの事を実行する事ができます。

VBScript で記述する場合の最大特徴は、エラー処理で、on error resume next と on error goto 0 の間でエラーが発生した場合に強制終了を回避できるようになっています。

※ Scripting.FileSystemObject は、テキストファイルを扱う為のオブジェクトです

ado_std.vbs
Set Cn = CreateObject( "ADODB.Connection" )
Set Rs = CreateObject( "ADODB.Recordset" )
Set Fs = CreateObject( "Scripting.FileSystemObject" )

strDriver = "{MySQL ODBC 5.3 Unicode Driver}"
strServer = "localhost"
strDb = "lightbox"
strUser = "root"
strPass =  "パスワード"

ConnectionString = _
	"Provider=MSDASQL" & _
	";Driver=" & strDriver
ConnectionString = ConnectionString & ";Server=" & strServer
ConnectionString = ConnectionString & ";Database=" & strDb
ConnectionString = ConnectionString & ";UID=" & strUser
ConnectionString = ConnectionString & ";PWD=" & strPass
ConnectionString = ConnectionString & ";"

' **********************************************************
' 接続
' **********************************************************
on error resume next
Cn.Open ConnectionString
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

' **********************************************************
' クエリー
' **********************************************************
Query = "select * from 社員マスタ"

on error resume next
Rs.Open Query, Cn
if Err.Number <> 0 then
	Cn.Close
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

' **********************************************************
' 出力ファイルオープン
' **********************************************************
Set Csv = Fs.CreateTextFile( "ado_std.csv", True )

' **********************************************************
' データ出力
' **********************************************************
Do While not Rs.EOF
	Buffer = ""
	For i = 0 to Rs.Fields.Count - 1
		if Buffer <> "" then
			Buffer = Buffer & ","
		end if
		Buffer = Buffer & """" & Rs.Fields(i).Value & """"
	Next
	Csv.WriteLine Buffer
	Rs.MoveNext
Loop

' **********************************************************
' ファイルクローズ
' **********************************************************
Csv.Close

' **********************************************************
' レコードセットクローズ
' **********************************************************
Rs.Close

' **********************************************************
' 接続解除
' **********************************************************
Cn.Close

Wscript.Echo "処理が終了しました"


ado_pro.wsf
<JOB>
<COMMENT>
************************************************************
■著作権その他

このプログラムはフリーです。どうぞ自由に御使用ください。
著作権は作者である私(lightbox)が保有しています。
また、本ソフトを運用した結果については、作者は一切責任を
負えせんのでご了承ください。
************************************************************
</COMMENT>

<OBJECT id="Cn" progid="ADODB.Connection" />
<OBJECT id="Rs" progid="ADODB.Recordset" />
<OBJECT id="Fs" progid="Scripting.FileSystemObject" />

<SCRIPT language="VBScript">

strDriver = "{MySQL ODBC 5.3 Unicode Driver}"
strServer = "localhost"
strDb = "lightbox"
strUser = "root"
strPass =  "パスワード"

ConnectionString = _
	"Provider=MSDASQL" & _
	";Driver=" & strDriver
ConnectionString = ConnectionString & ";Server=" & strServer
ConnectionString = ConnectionString & ";Database=" & strDb
ConnectionString = ConnectionString & ";UID=" & strUser
ConnectionString = ConnectionString & ";PWD=" & strPass
ConnectionString = ConnectionString & ";"

' **********************************************************
' 接続
' **********************************************************
on error resume next
Cn.Open ConnectionString
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

' **********************************************************
' クエリー
' **********************************************************
Query = "select * from 社員マスタ"

on error resume next
Rs.Open Query, Cn
if Err.Number <> 0 then
	Cn.Close
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

' **********************************************************
' 出力ファイルオープン
' **********************************************************
Set Csv = Fs.CreateTextFile( "ado_pro.csv", True )

' **********************************************************
' データ出力
' **********************************************************
Do While not Rs.EOF
	Buffer = ""
	For i = 0 to Rs.Fields.Count - 1
		if Buffer <> "" then
			Buffer = Buffer & ","
		end if
		Buffer = Buffer & """" & Rs.Fields(i).Value & """"
	Next
	Csv.WriteLine Buffer
	Rs.MoveNext
Loop

' **********************************************************
' ファイルクローズ
' **********************************************************
Csv.Close

' **********************************************************
' レコードセットクローズ
' **********************************************************
Rs.Close

' **********************************************************
' 接続解除
' **********************************************************
Cn.Close

Wscript.Echo "処理が終了しました"

</SCRIPT>
</JOB>

現在、VBScript の進化は Microsoft 内では止まって(終わって)おり、後継としては、Framework の使える PowerShell になっていますが、かなり敷居の高いものとなっているため、今でも VBScript の範囲でできる事が多いせいもあって、VBScript が使われているところは多いと思います。



関連する記事

posted by lightbox at 2014-04-14 22:43 | MySQL | このブログの読者になる | 更新情報をチェックする

2014年04月13日


PHP + MySQL : Windows における ODBC 経由での接続とデータの取得(SELECT)

MySQL の Windows における ODBC ドライバは、既存の SHIFT_JIS ベースの古いアプリケーシヨンの為に、charset 変更できるのがデータ部分だけとなっていました。こちらから送る SQL 内のキャラクタセットは 日本語環境においては SHIFT_JIS でやりとりするような前提で設計されているようです。

ですから、PHP で利用するとなると、ソースコードを SHIFT_JIS として、ドライバの charset を cp932 にすると全て日本語環境でうまくいくようになっています。もし、UTF-8 ベースで PHP のコードを書く必要がある場合は、charset を utf8 にすると、データは正しく utf8 で読み込めます。ただ、SQL を SHIFT_JIS で書く必要がありますし、列名(連想配列内)は SHIFT_JIS なので、mb_convert_encoding で変換する必要があります。

PDO_ODBC > ODBC 関数

ODBC 関数は、古くからある関数で、他の MySQL 関数に比べると実装(機能)が分散されていて、同じ処理をする場合にコード量が増えてしまいます。しかし、SQLServer に接続して処理を行う場合は信頼性が高いようです。( SQLServer 用の ODBC ドライバは選択肢としてとても有効だと思います )

ただ、MySQL をターゲットとする場合は、わさわざ ODBC を選ぶ必要はほとんどありません。

ODBC 関数
<?php
header( "Content-Type: text/html; Charset=shift_jis" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

$server = 'localhost';
$db_name = 'lightbox';
$user = 'root';
$password = 'パスワード';

$connect_string = "Provider=MSDASQL;";
$connect_string .= "Driver={MySQL ODBC 5.3 Unicode Driver};";
$connect_string .= "Server={$server};";
$connect_string .= "DATABASE={$db_name};";
$connect_string .= "UID={$user};";
$connect_string .= "PWD={$password};";
$connect_string .= "charset=cp932;";
// このキャラクタ設定は、サーバーからのキャラクタセット
// クライアントは SHIFT_JIS が前提で、インストールされた PCに依存しているようです。

// 接続
$connect = @odbc_connect($connect_string, "", "");
if ( !$connect ) {
	die("接続エラーです : " . odbc_errormsg() );
}

// クエリ
$result = @odbc_exec($connect,"select * from 社員マスタ");
if ( !$result ) {
	die('クエリーに誤りがあります : ' . odbc_errormsg() );
}

// 列数
$field_count = odbc_num_fields( $result );
$count = 0;

?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<style>
* {
	font-family: "メイリオ", Meiryo, "MS Pゴシック", sans-serif;
	font-size: 12px;
}
table {
	border-collapse: collapse;
	border-style: solid;
	border-color: #c0c0c0;
	border-width: 1px;
	background-color: #FFFFFF;
}
td {
	padding: 5px;
	border-style: solid;
	border-color: #c0c0c0;
	border-width: 1px;
}
</style>
</head>
<body>

<?php
print $connect_string;

$log_file = "rowdata_003.log";

file_put_contents( $log_file,"" );

print "<table>\n";
while (odbc_fetch_into($result,$row)) {
	print "<tr>\n";
	print "\t<td>" . ($count + 1) . "</td>\n";
	for( $i = 0; $i < $field_count; $i++ ) {
		print "\t<td>{$row[$i]}</td>\n";
	}
	print "</tr>\n";
	$count++;
	file_put_contents( $log_file, print_r($row,true), FILE_APPEND );
}
print "</table>";

// メモリを開放ですが、通常は必要ありません
odbc_free_result($result);

// 接続解除
odbc_close($connect);
?>

<br>
出力件数 : <?= $count ?>


PDO_ODBC
<?php
header( "Content-Type: text/html; Charset=shift_jis" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

$conf = array(
	"driver" => "{MySQL ODBC 5.3 Unicode Driver}",
	"server" => "localhost",
	"db" => "lightbox",
	"user" => "root",
	"pass" => "パスワード",
	"charset" => "cp932"
);

// **********************************************************
// 接続
// **********************************************************
try {
	$connect = new PDO(
		"odbc:Driver={$conf['driver']};Server={$conf['server']};" .
		"Database={$conf['db']};Uid={$conf['user']};Pwd={$conf['pass']};".
		"charset={$conf['charset']}");
}
catch ( Exception $ex ) {
	die( '{"error": "接続できませんでした: ' . $ex->getMessage() . '"}' );
}

// **********************************************************
// 結果セット
// **********************************************************
$rs = $connect->query( "select * from 社員マスタ" );
if ( $rs === false ) {
	$er = $connect->errorInfo();
	die('{ "error" : "' . $er[2] . '" }');
}

// フィールド数
$field_count = $rs->columnCount();
$count = 0;

?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<style>
* {
	font-family: "メイリオ", Meiryo, "MS Pゴシック", sans-serif;
	font-size: 12px;
}
table {
	border-collapse: collapse;
	border-style: solid;
	border-color: #c0c0c0;
	border-width: 1px;
	background-color: #FFFFFF;
}
td {
	padding: 5px;
	border-style: solid;
	border-color: #c0c0c0;
	border-width: 1px;
}
</style>
</head>
<body>

<?php
print $connect_string;

$log_file = "rowdata_004.log";

file_put_contents( $log_file,"" );

print "<table>\n";
while ($row = $rs->fetch(PDO::FETCH_BOTH)) {
	print "<tr>\n";
	print "\t<td>" . ($count + 1) . "</td>\n";
	for( $i = 0; $i < $field_count; $i++ ) {
		print "\t<td>{$row[$i]}</td>\n";
	}
	print "</tr>\n";
	$count++;
	file_put_contents( $log_file, print_r($row,true), FILE_APPEND );
}
print "</table>";

$rs->closeCursor();
?>

<br>
出力件数 : <?= $count ?>



関連する記事

posted by lightbox at 2014-04-13 17:03 | MySQL | このブログの読者になる | 更新情報をチェックする

PHP + MySQL : PDO_MySQL での接続とデータの取得(SELECT)

mysqli は、手続き型もあり、クラスとして利用はできますが、立ち位置としては中間的な存在でした。しかし、PDO では、多くのデータベースに対して同じ処理を実現する(インターフェイス)為に作成されたものですから、本来の『オブジェクト指向型』として利用するといいと思います。

コンストラクタの実行で、PDO は、指定されたデータベースへの接続に失敗した場合、 PDOException を投げます。( ここでは、Exception として一般的に使用しています )

closeCursor メソッドは、カーソルを閉じてステートメントを再実行できるようにするもので、多くの処理を実行する時に必要になって来るものです。

また、接続を閉じる処理はメソッドとして存在しておらず、インスタンスに NULL をセットするようマニュアルで明示されています
接続を閉じるには、他から 参照されていないことを保障することでオブジェクトを破棄する 必要があります。それには、オブジェクトを保持している変数に対して NULL を代入します
▼ この接続でのキャラクタセットの情報
character_set_clientutf8
character_set_connectionutf8
character_set_databaseutf8
character_set_filesystembinary
character_set_resultsutf8
character_set_serverutf8
character_set_systemutf8
<?php
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

$conf = array(
	"server" => "localhost",
	"db" => "lightbox",
	"user" => "root",
	"pass" => "パスワード"
);

// **********************************************************
// 接続
// **********************************************************
try {
	$connect = new PDO("mysql:host={$conf['server']};dbname={$conf['db']}",
		$conf['user'], $conf['pass'] );
}
catch ( Exception $ex ) {
	die( '{"error": "接続できませんでした: ' . $ex->getMessage() . '"}' );
}

// **********************************************************
// 結果セット
// **********************************************************
$rs = $connect->query( "select * from 社員マスタ" );
if ( $rs === false ) {
	$er = $connect->errorInfo();
	die('{ "error" : "' . $er[2] . '" }');
}

// フィールド数
$field_count = $rs->columnCount();
$count = 0;

?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>
* {
	font-family: "メイリオ", Meiryo, "MS Pゴシック", sans-serif;
	font-size: 12px;
}
table {
	border-collapse: collapse;
	border-style: solid;
	border-color: #c0c0c0;
	border-width: 1px;
	background-color: #FFFFFF;
}
td {
	padding: 5px;
	border-style: solid;
	border-color: #c0c0c0;
	border-width: 1px;
}
</style>
</head>
<body>

<?php
print $connect_string;

$log_file = "rowdata_005.log";

file_put_contents( $log_file,"" );

print "<table>\n";
while ($row = $rs->fetch(PDO::FETCH_BOTH)) {
	print "<tr>\n";
	print "\t<td>" . ($count + 1) . "</td>\n";
	for( $i = 0; $i < $field_count; $i++ ) {
		print "\t<td>{$row[$i]}</td>\n";
	}
	print "</tr>\n";
	$count++;
	file_put_contents( $log_file, print_r($row,true), FILE_APPEND );
}
print "</table>";

$rs->closeCursor();
?>

<br>
出力件数 : <?= $count ?>



関連する記事

posted by lightbox at 2014-04-13 02:12 | MySQL | このブログの読者になる | 更新情報をチェックする

PHP + MySQL : MySQL 改良版拡張モジュール mysqli クラスでの接続とデータの取得(SELECT)

マニュアル上は、『新しくコードを書くときには mysqli や PDO_MySQL を使うべきです。』とあります。基本的な部分は MySQL 関数とさほど変わり無く、非常に使いやすいクラスです。( 手続き型も存在しますが、PDO と比較する意味でも、オブジェクト指向型のほうが自然です )

コンストラクタに、データベース名も指定するので、MySQL 関数 より接続部分だけを取ってもシンプルに変化します。

結果のログも utf8n で出力され、MySQL 関数の結果と同じです。

fetch_array メソッドは、省略すると第二引数は MYSQLI_BOTH を指定した事になりますが、ここでは明示しています。( MYSQLI_ASSOC、 MYSQLI_NUM あるいは MYSQLI_BOTH. のいずれかを指定できます )

▼ この接続でのキャラクタセットの情報
character_set_clientutf8
character_set_connectionutf8
character_set_databaseutf8
character_set_filesystembinary
character_set_resultsutf8
character_set_serverutf8
character_set_systemutf8
<?php
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

$server = 'localhost';
$db_name = 'lightbox';
$user = 'root';
$password = 'パスワード';

// 接続
$connect = @ new mysqli($server, $user, $password, $db_name);
if ($connect->connect_error) {
	die('Connect Error (' . $connect->connect_errno . ') '
	. $connect->connect_error);
}

// クエリ
$result = $connect->query("select * from 社員マスタ"); 
if ( !$result ) {
	die('クエリーに誤りがあります : ' . $connect->error );
}

// 列数
$field_count = $connect->field_count;
$count = 0;

?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>
* {
	font-family: "メイリオ", Meiryo, "MS Pゴシック", sans-serif;
	font-size: 12px;
}
table {
	border-collapse: collapse;
	border-style: solid;
	border-color: #c0c0c0;
	border-width: 1px;
	background-color: #FFFFFF;
}
td {
	padding: 5px;
	border-style: solid;
	border-color: #c0c0c0;
	border-width: 1px;
}
</style>
</head>
<body>

<?php

$log_file = "rowdata_002.log";

file_put_contents( $log_file,"" );

print "<table>\n";
while ($row = $result->fetch_array(MYSQLI_BOTH)) {
	print "<tr>\n";
	print "\t<td>" . ($count + 1) . "</td>\n";
	for( $i = 0; $i < $field_count; $i++ ) {
		print "\t<td>{$row[$i]}</td>\n";
	}
	print "</TR>\n";
	$count++;
	file_put_contents( $log_file, print_r($row,true), FILE_APPEND );
}
print "</table>";

// 開放
$result->close();

// 接続解除
$connect->close();

?>

<br>
出力件数 : <?= $count ?>



関連する記事

posted by lightbox at 2014-04-13 01:37 | MySQL | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します


Windows
container 終わり

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

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