SQLの窓

2015年08月06日


PHP : PIPES_AS_CONCAT を使用して、CSV 作成処理をサーバの負荷にして高速に WrodPress のデータを Excel で読み込める CSV として保存する処理

まず、set sql_mode = 'PIPES_AS_CONCAT' を同一セッション内で実行しておく事によって、Oracle と同様に文字列連結に || を使用できるようになります。

そこで、CSV としての 文字列の仕様を SELECT 構文上でほぼ完成させておいて、クライアントでは一つの列を取得して、改行コードの処理のみを加えてファイルに出力するようにしています。ファイルの出力も、ここでは file_put_contents を使っている為、効率は良くありません。大量のデータを処理したい場合ならば、ファイルへの出力は一行単位で行うべきです。

この方法は十数年前の Oracle でレスポンスが顕著で、天と地ほどの処理時間の差が出ていました。現在では、クライアントの処理能力も上がったので差は無いかもしれませんが、一つのテクニックとして利用可能だと思います。

出来上がった SQL
select ID||','||post_author||','||'"'||replace(post_date,'"','""')||'"'||','||'"'||replace(post_date_gmt,'"','""')||'"'||','||'"'||replace(post_content,'"','""')||'"'||','||'"'||replace(post_title,'"','""')||'"'||','||'"'||replace(post_excerpt,'"','""')||'"'||','||'"'||replace(post_status,'"','""')||'"'||','||'"'||replace(comment_status,'"','""')||'"'||','||'"'||replace(ping_status,'"','""')||'"'||','||'"'||replace(post_password,'"','""')||'"'||','||'"'||replace(post_name,'"','""')||'"'||','||'"'||replace(to_ping,'"','""')||'"'||','||'"'||replace(pinged,'"','""')||'"'||','||'"'||replace(post_modified,'"','""')||'"'||','||'"'||replace(post_modified_gmt,'"','""')||'"'||','||'"'||replace(post_content_filtered,'"','""')||'"'||','||post_parent||','||'"'||replace(guid,'"','""')||'"'||','||menu_order||','||'"'||replace(post_type,'"','""')||'"'||','||'"'||replace(post_mime_type,'"','""')||'"'||','||comment_count from wp_posts

<?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");

// セッション(接続)中有効
$query = "set sql_mode = 'PIPES_AS_CONCAT'";
// クエリ
$result = $connect->query($query); 
if ( !$result ) {
	die('クエリーに誤りがあります : ' . $connect->error );
}

// **************************************
// 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;

$csv = "";
for( $i = 0; $i < $field_count; $i++ ) {
	if ( $i != 0 ) {
		$csv .= "||','||";
	}
	// 数値型
	// TIMESTAMP型(7) を使用している場合は変更が必要です
	if ( $type[$i] < 10 || $type[$i] == 246 || $type[$i] == 16 ) {
		$csv .= $name[$i];
	}
	else {
		$csv .= "'\"'||replace({$name[$i]},'\"','\"\"')||'\"'";
	}

}

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

file_put_contents("query.txt", $query);

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

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

	// insert としての一行を追加
	$file .= "{$row[0]}\r\n";

}

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

?>



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

2015年08月04日


PHP : WrodPress のデータを insert SQL で保存する処理

前回の Excel とは違い、SQL のクォートがシングルクォーテ−ションなので、データ中の '(シングルクォーテ−ション) は ''(シングルクォーテ−ション2個) に変換しています。キャラクタセットも本来の utf8 を指定していますがこれは省略してもいいでしょう。

実際にローカルの MySQL に wp_posts を作成して 作成された insert 文を2つ実行してみましたが、エラー無く登録されました。
<?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("utf8");

// **************************************
// 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;

$fld_list = "(" . implode(",",$name ) . ")";

$file = "";

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

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

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

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

}

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

?>


関連する記事

参考

MySQL TIMESTAMP / MySQLTutorial



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

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 + データベース | このブログの読者になる | 更新情報をチェックする

2015年07月02日


PHP : JSON 文字列で定義されたフォーマットを元に、そのフォーマットにセットされた配列を使って insert と update の SQL 文を自動作成。

以下のような簡単な定義は、データベースのテーブルの列定義と同期していますが、全ての列を定義する必要はありません。二つ目の定義は、where で使用される条件を作成する為に必要となるので、必ずしも実際の定義上の主キーである必要はありません。

num は、SQL 内で ' を使用しない事を意味します。よって、num 列の場合はデータベースの関数を直接記述する事ができます。

' を使用する列では、1文字目に @ を指定すると ' を使いませんので、@関数名() や @null といった文字列が使用できます。

syain.json
{
    "社員コード": "",
    "氏名": "",
    "フリガナ": "",
    "所属": "num",
    "性別": "num",
    "作成日": "",
    "更新日": "",
    "給与": "num",
    "手当": "num",
    "管理者": "",
    "生年月日": ""
}

syain_keys.json
{
    "所属": "num",
    "社員コード": ""
}

▼ 実行結果

insert into 社員マスタ (社員コード,氏名,フリガナ,所属,性別,作成日,更新日,給与,手当,管理者,生年月日) values('0001','山田 太郎',null,1,null,null,NOW(),null,null,null,null)
update 社員マスタ set 氏名 = '山田 太郎',フリガナ = null,性別 = null,作成日 = null,更新日 = NOW(),給与 = null,手当 = null,管理者 = null,生年月日 = null where 所属 = 1 and 社員コード = '0001'
insert into 社員マスタ (社員コード,氏名,所属) values('0001','山田 太郎',1)
update 社員マスタ set 氏名 = '山田 太郎' where 所属 = 1 and 社員コード = '0001'
所属 = 1 and 社員コード = '0001'
Run code で実行 type が 1、2 または 3 の場合、第三引数になんらかの配列データが無い場合は、内部で type = 0 で配列を取得して使うようにしました type = 0 : JSON 上で定義されたフォーマットを全て持つ連想配列の取得です。 つまり、全ての列での insert や update を作成する時に使用します。部分的ならば、キー列を含んだ列名の一致する連想配列で問題ありません。 type = 0 を使用せずとも、MySQL であれば、$result->fetch_array(MYSQLI_ASSOC) の結果の連想配列をそのまま使用できます。( 但し、フォーマットとデータ型や列名やキーが一致している必要はあります ) type = 1 : insert を作成します。 type = 2 : update を作成します。 type = 3 : 条件部分のみ取得します。 get_sql.php( 関数とテストコード )
<?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" );



// **************************************
// 列一覧配列の取得
// **************************************
$row = build_sql( 0, "syain" );
// 値のセット
$row["所属"] = 1;
$row["社員コード"] = "0001";
$row["氏名"] = "山田 太郎";
$row["更新日"] = "@NOW()";

print "<hr>";
// insert 取得
print build_sql( 1, "syain", $row, "社員マスタ" );

print "<hr>";
// update 取得
print build_sql( 2, "syain", $row, "社員マスタ" );


// **************************************
// 必要な列だけの処理
// **************************************
$row = array();
$row["所属"] = 1;
$row["社員コード"] = "0001";
$row["氏名"] = "山田 太郎";

print "<hr>";
// insert 取得
print build_sql( 1, "syain", $row, "社員マスタ" );

print "<hr>";
// update 取得
print build_sql( 2, "syain", $row, "社員マスタ" );


// **************************************
// 条件のみ
// **************************************
print "<hr>";
print build_sql( 3, "syain", $row );


// **************************************
// SQL更新文字列 ビルド関数
// **************************************
function build_sql( $type, $file_name, $row=null, $table_name="" ) {

	global $build_sql_error;

	// 更新列一覧情報の取得
	$format1 = @file_get_contents( "{$file_name}.json " );
	if ( $format1 === false ) {
		$build_sql_error = "{$file_name}.json not found.";
		return false;
	}

	$format2 = @file_get_contents( "{$file_name}_keys.json " );
	if ( $format2 === false ) {
		$build_sql_error = "{$file_name}_keys.json not found.";
		return false;
	}

	// insert sql 文字列作成
	if ( $type == 1 ) {
		if ( $row == null || !is_array( $row ) || count($row) == 0 ) {
			$row = build_sql( 0, $file_name );
		}

		$obj1 = json_decode($format1);
		$array1 = get_object_vars( $obj1 );
		$insert = "insert into @TABLE (@FIELDS) values(@VALUES)";

		$fields = "";
		foreach( $array1 as $k => $v ) {
			if ( array_key_exists($k,$row) ) {
				if ( $fields != "" ) {
					$fields .= ",";
				}
				$fields .= $k;
			}
		}
		$insert = str_replace("@FIELDS", $fields, $insert );

		$values = "";
		foreach( $array1 as $k => $v ) {

			if ( array_key_exists($k,$row) ) {
				if ( $values != "" ) {
					$values .= ",";
				}
				if ( $row[$k] == NULL ) {
						$values .= "null";
				}
				else {
					if ( $v == "num" ) {
						$values .= $row[$k];
					}
					else {
						if ( substr( $row[$k], 0, 1 ) == "@" ) {
							$values .= str_replace( "@", "", $row[$k] );
						}
						else {
							$values .= "'{$row[$k]}'";
						}
					}
				}
			}

		}
		$insert = str_replace("@VALUES", $values, $insert );
		$insert = str_replace("@TABLE", $table_name, $insert );
		return $insert;
	}

	// update sql 文字列作成
	if ( $type == 2 ) {
		if ( $row == null || !is_array( $row ) || count($row) == 0 ) {
			$row = build_sql( 0, $file_name );
		}

		$obj1 = json_decode($format1);
		$array1 = get_object_vars( $obj1 );
		$obj2 = json_decode($format2);
		$array2 = get_object_vars( $obj2 );

		$update = "update @TABLE set @SETS where @KEYS";
		$sets = "";
		foreach( $array1 as $k => $v ) {

			if ( array_key_exists($k,$row) ) {
				// キー項目以外の代入を作成します
				if ( !array_key_exists($k,$array2) ) {

					if ( $sets != "" ) {
						$sets .= ",";
					}

					if ( $row[$k] == NULL ) {
							$sets .= "{$k} = null";
					}
					else {
						if ( $v == "num" ) {
							$sets .= "{$k} = {$row[$k]}";
						}
						else {
							if ( substr( $row[$k], 0, 1 ) == "@" ) {
								$sets .= "{$k} = " . str_replace( "@", "", $row[$k] );
							}
							else {
								$sets .= "{$k} = '{$row[$k]}'";
							}
						}
					}

				}
			}

		}

		// where 以降の条件を作成します
		$update = str_replace("@SETS", $sets, $update );
		$keys = "";
		foreach( $array2 as $k => $v ) {

			if ( $keys != "" ) {
				$keys .= " and ";
			}
			if ( $v == "num" ) {
				$keys .= "{$k} = {$row[$k]}";
			}
			else {
				if ( substr( $row[$k], 0, 1 ) == "@" ) {
					$keys .= "{$k} = " . str_replace( "@", "", $row[$k] );
				}
				else {
					$keys .= "{$k} = '{$row[$k]}'";
				}
			}

		}

		$update = str_replace("@KEYS", $keys, $update );
		$update = str_replace("@TABLE", $table_name, $update );
		return $update;
	}

	// where 以降のみ作成
	if ( $type == 3 ) {
		if ( $row == null || !is_array( $row ) || count($row) == 0 ) {
			$row = build_sql( 0, $file_name );
		}

		$obj2 = json_decode($format2);
		$array2 = get_object_vars( $obj2 );

		$keys = "";
		foreach( $array2 as $k => $v ) {

			if ( $keys != "" ) {
				$keys .= " and ";
			}
			if ( $v == "num" ) {
				$keys .= "{$k} = {$row[$k]}";
			}
			else {
				if ( substr( $row[$k], 0, 1 ) == "@" ) {
					$keys .= "{$k} = " . str_replace( "@", "", $row[$k] );
				}
				else {
					$keys .= "{$k} = '{$row[$k]}'";
				}
			}

		}

		return $keys;
	}


	// 一覧より $row の作成
	if ( $type == 0 ) {
		$obj1 = json_decode($format1);
		$array1 = get_object_vars( $obj1 );
		$obj2 = json_decode($format2);
		$array2 = get_object_vars( $obj2 );
		foreach( $array1 as $k => $v ) {
			$array1[$k] = null;
			if ( array_key_exists($k,$array2) ) {
				$array1[$k] = "key";
			}
		}

		return $array1;
	}

}

?>


関連する記事

PHP : unset によるオブジェクトのプロパティの削除と配列の要素の削除の検証


タグ:PHP SQL JSON
posted by lightbox at 2015-07-02 18:31 | PHP + データベース | このブログの読者になる | 更新情報をチェックする
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 終わり