以下のような簡単な定義は、データベースのテーブルの列定義と同期していますが、全ての列を定義する必要はありません。二つ目の定義は、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 によるオブジェクトのプロパティの削除と配列の要素の削除の検証