SQLの窓

2015年08月03日


PHP : WrodPress のデータを Excel で読み込める CSV として保存する処理

結果の確認として、Excel が簡単なので、SHIFT_JIS その他を最適化していますが、利用先に合わせて変更すればいいと思います。最初1行目に列名リストを出力していたのですが、Excel の仕様で最初に ID という文字があるとエラーになるので省いています。
<?php
// **************************************
// MIME と キャラクタセットを設定
// **************************************
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 = 'データベースサーバー';
$db_name = 'データーベース';
$user = 'ユーザー';
$password = 'パスワード';

print "処理開始<br>";
// **************************************
// データベース接続
// **************************************
$connect = @ new mysqli($server, $user, $password, $db_name);
if ($connect->connect_error) {
	die('Connect Error (' . $connect->connect_errno . ') '
	. $connect->connect_error);
}

// **************************************
// クライアントのキャラクタセット
// **************************************
$connect->set_charset("cp932");

// **************************************
// WordPress の投稿データ
// **************************************
$query = "select * from wp_posts";
// クエリ
$result = $connect->query($query); 
if ( !$result ) {
	die('クエリーに誤りがあります : ' . $connect->error );
}

// **************************************
// 列名とデータ型を取得
// **************************************
$finfo = $result->fetch_fields();

$name = array();
$type = array();
foreach ($finfo as $val) {
	$name[] = $val->name;
	$type[] = $val->type;
}

// **************************************
// フィールド数
// **************************************
$field_count = $connect->field_count;

$file = "";

while ($row = $result->fetch_array(MYSQLI_BOTH)) {

	// CSV の一行の作成
	$csv = "";
	for( $i = 0; $i < $field_count; $i++ ) {
		if ( $csv != "" ) {
			$csv .= ",";
		}
		// 数値型
		// TIMESTAMP型(7) を使用している場合は変更が必要です
		if ( $type[$i] < 10 || $type[$i] == 246 || $type[$i] == 16 ) {
			$csv .= $row[$i];
		}
		else {
			// データ内のダブルクォートとフィールドを囲むダブルクォート
			$csv .= "\"" . str_replace('"', '""',"$row[$i]") . "\"";
		}
	}

	// データ内の改行コード
	$csv = str_replace("\r\n", "\\r\\n", $csv);
	$csv = str_replace("\r", "\\r", $csv);
	$csv = str_replace("\n", "\\n", $csv);

	// CSV としての一行を追加
	$file .= "{$csv}\r\n";

}

// **************************************
// ファイルに出力
// **************************************
file_put_contents("table.csv", $file);

?>


関連する記事

参考

MySQL TIMESTAMP / MySQLTutorial



posted by lightbox at 2015-08-03 20:41 | PHP + データベース | このブログの読者になる | 更新情報をチェックする

PHP で MySQLi 使用時の データ型定数( MYSQLI_TYPE_ ) の詳細 ( バックアップ用 insert 文を作る為 )

テーブルのデータから insert 文を自動的に作成する場合、列が数値かそれ以外かで処理を分ける必要がありますが、データ型は数値で取得されるので、定数の意味を確認する必要があります。

その結果、基本的には 0 〜 9 が数値型であり(6と7は特殊なので対応が必要です)、MySQL 5.0.3 以降という条件付で 246 と 16 が数値として扱われます。
※ 6 は DEFAULT NULL と言う意味として書かれていますが、だとしたら使われる事は無いはずです。
※ 7 は TIMESTAMP なので、INSERT の時は再現必要で、DATETIME と同様に扱うべきものと思われます。

BIT 型は特殊ですが、値のセット方法としては数値でいいようです

▼ PHP マニュアルの参照リンク

定義済み定数
mysqli_result::fetch_field_direct
mysqli_result::fetch_fields

▼ 定数の実際の値と意味
DECIMAL 0
NEWDECIMAL 246 DECIMAL or NUMERIC(MySQL 5.0.3 以降)
BIT 16 (MySQL 5.0.3 以降)
TINY 1 TINYINT
SHORT 2 SMALLINT
LONG 3 INT
FLOAT 4
DOUBLE 5
NULL 6
TIMESTAMP 7
LONGLONG 8 BIGINT
INT24 9 MEDIUMINT
DATE 10
TIME 11
DATETIME 12
YEAR 13
NEWDATE 14 DATE
INTERVAL 247
ENUM 247
SET 248
TINY_BLOB 249
MEDIUM_BLOB 250
LONG_BLOB 251
BLOB 252
VAR_STRING 253 VARCHAR or BINARY
STRING 254
CHAR 1 TINYINT
GEOMETRY 255

関連する記事

参考

MySQL TIMESTAMP / MySQLTutorial



タグ:PHP MySQL
posted by lightbox at 2015-08-03 10:12 | PHP + データベース | このブログの読者になる | 更新情報をチェックする

2015年08月01日


PHP から MySQL の簡易的なバックアップを取得する( 但し、DBサーバがディスクへの書き込み権限を持っている必要があります )

実際には、ローカルの MySQL にしか使えなさそうですが、ビューとテーブルの CREATE 文を取得して、TABLE からは CSV 形式のデータを取るコードです。
<?php
// **************************************
// MIME と キャラクタセットを設定
// **************************************
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 = 'データベースサーバー';
$db_name = 'データベース名';
$user = 'ユーザ名';
$password = 'パスワード';

print "処理開始<br>";
// ***********************************************
// データベース接続
// ***********************************************
$connect = @ new mysqli($server, $user, $password, $db_name);
if ($connect->connect_error) {
	die('Connect Error (' . $connect->connect_errno . ') '
	. $connect->connect_error);
}


$query = "show full tables";
// クエリ
$result = $connect->query($query); 
if ( !$result ) {
	die('クエリーに誤りがあります : ' . $connect->error );
}

$table = array();
$view = array();

while ($row = $result->fetch_array(MYSQLI_BOTH)) {
	if ( $row[1] == "BASE TABLE" ) {
		$table[] = $row[0];
	}
	if ( $row[1] == "VIEW" ) {
		$view[] = $row[0];
	}
}

$create_view = "";

for( $i = 0; $i < count( $view ); $i++ ) {
	$query = "show create view {$view[$i]}";
	$result = $connect->query($query);
	while ($row = $result->fetch_array(MYSQLI_BOTH)) {
		$create_view .= $row[1] . ";\n\n";
	}
}

print "view 定義出力<br>";
file_put_contents("./create_view.sql", $create_view );


$create_table = "";

for( $i = 0; $i < count( $table ); $i++ ) {
	$query = "show create table {$table[$i]}";
	$result = $connect->query($query);
	while ($row = $result->fetch_array(MYSQLI_BOTH)) {
		$create_table .= "// [{$i}] {$table[$i]}" . "\n";
		$create_table .= $row[1] . ";\n\n";
	}
}

print "table 定義出力<br>";
file_put_contents("./create_table.sql", $create_table );


print "データ出力開始<br>";
for( $i = 0; $i < count( $table ); $i++ ) {
	$path = realpath("./");
	$path .= DIRECTORY_SEPARATOR ."file_{$i}.csv";
	@unlink($path);
	$path = str_replace("\\", "\\\\", $path );
	$query = "SELECT * INTO OUTFILE '{$path}' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\\n' FROM `{$table[$i]}`";
	$connect->query($query);

}
print "データ出力終了<br>";

?>

レンタルサーバでは、phpmyadmin をインストールしたほうが速いですね。(実際そうしました)

ただ、phpmyadmin は、最新では PHP 5.3+ を要求するので注意です。

インストールと言うほどの処理は無く、アップロードして config フォルダを作って、setup フォルダにアクセスして特別な設定があればそこで入力して設定ファイルを作成し、ファイルを phpmyadmin があるフォルダに移動して config フォルダを削除すれば出来上がりです。


関連する記事



posted by lightbox at 2015-08-01 22:15 | PHP + データベース | このブログの読者になる | 更新情報をチェックする

テーブルのセルをクリックして背景色を rgb(0,0,0) から #000000 の変換で、eval を使う事の考察

ちょっとした文字列処理でいろいろな解法があると思うのですが、eval 使うと一番簡単に作れると思います。rgb と言う関数を用意しておいて、eval( "rgb(0,0,0)" ) で rgb 関数の戻り値が eval メソッドの戻り値として返って来ます。もし、rgb という関数名にはちょっと違和感感じるのであれば、"rgb(0,0,0)".replace("rgb","関数名") で関数名は好きにできます。

ですが、無条件に eval 使うのはあまり良く無いので、引数部分だけ取り出して eval してみました。引数部分ならば、処理は必ず自分の関数内で行われるので、問題を排除するのは容易だと思います。

ただ、ここまでするのであれば、eval を使う意味もあまり無いのも事実ですが、処理分割がとてもはっきりされた上に、やっている事の内容が解りやすいコードになったと思います。

1) 正規表現で、rgb( n,n,n ) の引数部分である "n,n,n" を取得
2) 新たに関数部分を付加して eval で実行
3) 処理関数( a, b, c ) で個別の処理を記述する

3) は、いきなり eval で使える関数です
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
function __myrgb1(a){
	var str  = "__myrgb2("+a+")";
	return eval(str);
}
function __myrgb2(a,b,c){
	return	"#"+(
		((a<16)?"0":"")+
		a.toString(16)+
		((b<16)?"0":"")+
		b.toString(16)+
		((c<16)?"0":"")+
		c.toString(16)
	).toUpperCase();
}
$(function(){
	$("td").click(function(){
		a = $(this).css("background-color");
		a.match(/rgb\((.+?)\)/);
		alert( __myrgb1(RegExp.$1) );

	});
});
</script>



white black whitesmoke yellowgreen
aliceblue antiquewhite aqua aquamarine
azure beige bisque yellow
blanchedalmond blue blueviolet brown
burlywood cadetblue chartreuse chocolate
coral cornflower cornsilk crimson
cyan darkblue darkcyan darkgoldenrod
darkgray darkgreen darkkhaki darkmagenta
darkolivegreen darkorange darkorchid darkred
darksalmon darkseagreen darkslateblue darkslategray
darkturquoise darkviolet deeppink deepskyblue
dimgray dodgerblue firebrick floralwhite
forestgreen fuchia gainsboro ghostwhite
gold goldenrod gray green
greenyellow honeydew hotpink indianred
indigo ivory khaki lavender
lavenderblush lawngreen lemonchiffon lightblue
lightcoral lightcyan lightgoldenrodyellow lightgreen
lightgrey lightpink lightsalmon lightseagreen
lightskyblue lightslategray lightsteelblue lightyellow
lime limegreen linen magenta
maroon mediumaquamarine mediumblue mediumorchid
mediumpurple mediumseagreen mediumslateblue mediumspringgreen
mediumturquoise mediumvioletred midnightblue mintcream
mistyrose moccasin navajowhite navy
oldlace olive olivedrab orange
orangered orchid palegoldenrod palegreen
paleturquoise palevioletred papayawhip peachpuff
peru pink plum powderblue
purple red rosybrown royalblue
saddlebrown salmon sandybrown seagreen
seashell sienna silver skyblue
slateblue slategray snow springgreen
steelblue tan teal thistle
tomato turquoise violet wheat


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

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

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

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

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


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

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

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

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

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



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

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり