以下のような簡単な定義は、データベースのテーブルの列定義と同期していますが、全ての列を定義する必要はありません。二つ目の定義は、where で使用される条件を作成する為に必要となるので、必ずしも実際の定義上の主キーである必要はありません。 num は、SQL 内で ' を使用しない事を意味します。よって、num 列の場合はデータベースの関数を直接記述する事ができます。 ' を使用する列では、1文字目に @ を指定すると ' を使いませんので、@関数名() や @null といった文字列が使用できます。 syain.json
{ "社員コード": "", "氏名": "", "フリガナ": "", "所属": "num", "性別": "num", "作成日": "", "更新日": "", "給与": "num", "手当": "num", "管理者": "", "生年月日": "" }
syain_keys.json
{ "所属": "num", "社員コード": "" }
▼ 実行結果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( 関数とテストコード )
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'
<?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 + データベースの最新記事】
- PDO MySQL のバインドを使用した標準的な記述( ロリポップ )
- PHP で MySQLをテストする為のソースコード
- PHP で ODBC 関数を使って MS Access( データベース )にアクセスして結果を JSON 文字列として出力する
- Windows 環境の MySQL + PHP で、ODBC ドライバを使用してデータを取得する場合の3パターン
- PHP : SQLインジェクション対策付きの、MySQL のデータを JSON で返す自家製 API テスト用のテンプレート3パターン
- PHP で 自家製 API を作成して jQuery の簡単なコードで更新処理を行うサンプル
- PHP : PIPES_AS_CONCAT を使用して、CSV 作成処理をサーバの負荷にして高速に WrodPress のデータを Excel で読み込める CSV として保存する処理
- PHP : WrodPress のデータを insert SQL で保存する処理
- PHP : WrodPress のデータを Excel で読み込める CSV として保存する処理
- PHP で MySQLi 使用時の データ型定数( MYSQLI_TYPE_ ) の詳細 ( バックアップ用 insert 文を作る為 )
- PHP から MySQL の簡易的なバックアップを取得する( 但し、DBサーバがディスクへの書き込み権限を持っている必要があります )
- PHP : PDO のエラー処理
- PHPのマニュアルにある、SQLインジェクション攻撃の例
- PHP : SQLite3 を PDO の ODBC 経由で読み込み
- PHP : 5.3 / 5.2.11 用共用 sqlite3(日本語テーブル) 読み込み
- PHP : Oracle を処理する COM を使ったクラス