SELECT結果を複数確認できる仕組みをつくった
SELECTを複数実行して結果を見たいことはないでしょうか?
高級なデータベース開発ツールだとできますが、使えない現場もあります。
特にPostgreSQLで、そういうことをやろうとするのは難しいです。
この問題を解決するため、JavaScript上にSQLを記述してPHPからPostgreSQLに接続して結果を表示する仕組みを作りました。
これを表示するためのHTMLは以下のようになります。
<!DOCTYPE HTML> <html> <head> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/handsontable/0.20.0/handsontable.full.min.js"></script> <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/handsontable/0.20.0/handsontable.full.min.css"> <title>dbgrid</title> </head> <body> </body> </html> <script type="text/javascript"> var sql = (function () {/* -- ここからSQLを記述します SELECT * FROM dtb_test ORDER BY member_id DESC; SELECT * FROM dtb_test ORDER BY member_id ASC; -- ここまでSQLを記述できます */}).toString().match(/(?:\/\*(?:[\s\S]*?)\*\/)/).pop().replace(/^\/\*/, "").replace(/\*\/$/, ""); var sql_list = sql.split(';'); for (var i = 0; i < sql_list.length; i++) { var grid_id = "grid" + (i + 1); $('body').append("<div id='" + grid_id + "' style='font-family: monospace; margin-bottom: 10px; clear:both;'></div>"); $.ajax({ type: "POST", url: "get_data.php", data: "grid_id=" + grid_id + "&sql=" + sql_list[i], success: function (data) { var obj = $.parseJSON(data); if (obj.field.length) { var container = $('#' + obj.grid_id).get(0); var hot = new Handsontable(container, { data: obj.data, rowHeaders: true, colHeaders: obj.field, maxCols: 0, maxRows: 0 }); } } }); } </script>
記述したSQLの件数分、グリッドが生成されるようになっています。
残念ながらJavaScriptから直接データベースは操作できないので、PHP側が必要になります。
<?php $grid_id = $_POST["grid_id"]; $conn = pg_connect("host=localhost dbname=postgres user=postgres password=password"); $result = pg_query_params($conn, $_POST["sql"], array()); $field_list = array(); $data_list = array(); if ($result == FALSE) { array_push($field_list, "エラーメッセージ"); $row_data = array(); array_push($row_data , pg_last_error($conn)); array_push($data_list, $row_data); } $col_count = pg_num_fields($result); for ($i = 0; $i < $col_count; $i++) { array_push($field_list, pg_field_name($result, $i)); } for ($i = 0 ; $i < pg_num_rows($result) ; $i++){ $row_data = array(); $rows = pg_fetch_array($result); foreach ($field_list as $field) { array_push($row_data, $rows[$field]); } array_push($data_list, $row_data); } pg_close($conn); echo json_encode(array("grid_id"=>$grid_id, "field"=>$field_list, "data"=>$data_list)); ?>
PostgreSQLの場合は、こんな感じです。
割とシンプルで使いまわせる仕組みなので、よかったら是非応用してみてください。
ローカルで動作させることしか考えていないので、間違っても公開サーバには上げないでください。