connect_errno ) { die($mysqli->connect_errno . ' : ' . $mysqli->connect_error); } // 文字セットの指定 if (isset($_REQUEST['s'])) { $mysqli->query('SET NAMES utf8'); } // レスポンス処理 HTML_Begin(); DoSqlScript( $mysqli, $sql_array ); HTML_End(); // データベースの切断 $mysqli->close(); /** * SQLスクリプトの実行 * @param mysqli $mysqli MySQLiオブジェクト * @param string[] $sql_text SQL文の配列 */ function DoSqlScript( mysqli $mysqli, array $sql_text ) { if (empty($sql_text)) return; $sqltime = 0; foreach( $sql_text as $sql ) { if ( !$sql || $sql[0]=='#' ) $sql=''; // 先頭の#は改行 // SQL文表示 print HTML_Escape(strlen($sql)<80 ? $sql : substr($sql,0,80)." ..."); print "
\n"; ob_flush(); flush(); if ( !$sql ) continue; # 空行 // 特別なEVAL文の実行 if ( preg_match( "/^eval\s+(.+)/i", $sql, $reg ) ) { eval("{$reg[1]};"); continue; } // SELECT文と非SELECT文で処理を分ける $time1 = microtime_as_float(); if (preg_match("/^(select|show)\s/i", $sql)) { if (!DoSelect($mysqli, $sql)) break; } else { $res = $mysqli->query($sql); if($res===false) { SqlError("DoSqlScript", $mysqli->error); break; } } $time2 = microtime_as_float(); $sqltime += ($time2-$time1); ob_flush(); flush(); } print "exec time: ".sprintf('%01.03f', $sqltime)." [sec]
\n"; } /** * SELECT文の実行 * @param mysqli $mysqli MySQLiオブジェクト * @param string $sql SQL文 * @return boolean 成功でTrueを返す */ function DoSelect( mysqli $mysqli, string $sql ) { // 検索実行 $res = $mysqli->query($sql); if($res===false) { SqlError("DoSelect", $mysqli->error); return false; } // カラム名の表示 if ($rows = $res->fetch_all(MYSQLI_ASSOC)) { print "\n"; print "\n"; foreach( $rows[0] as $key => $value ) { print "\n"; } print "\n"; } else { print "No results found.
\n"; return true; } // 行の表示 foreach( $rows as $row ) { print "\n"; foreach( $row as $value ) { $value = HTML_Escape($value); print "\n"; } print "\n"; } print "
$key
$value

\n"; return true; } /** * SQLテキストの取得 * @param string $text SQLテキスト * @return string[] SQL文の配列 */ function GetSqlText( string $text ) { $text = str_replace(["\r\n","\r"], "\n", $text); // Remove comment $text = preg_replace("/\/\*.*?\*\//s", '', $text); $text = preg_replace("/--.*?$/m", '', $text); // Split SQL text $sql = preg_split("/\s*;\s*/", $text); array_walk($sql, function(&$item){ $item = trim($item); }); $sql = array_filter($sql, function($val){ return !empty(trim($val)); }); return $sql; } /** * SQLスクリプトファイルの読み込み * @param string $sql_file ファイル名 * @return string SQLテキスト */ function ReadScriptFile( string $sql_file ) { if (!preg_match("/^[^\.].*\.sql/",$sql_file)) { SqlError("URL","Illegal script file name."); } if(($text=@file_get_contents($sql_file))===false) { SqlError("open","Can't file open $sql_file."); } return $text; } /** * マイクロ秒取得 * @return float */ function microtime_as_float() { list($usec, $sec) = explode(' ', microtime()); return ((float)$sec + (float)$usec); } /** * HTML エスケープ * @param string $str * @return string */ function HTML_Escape( string $str ) { return htmlentities( $str, ENT_QUOTES, "utf-8" ); } /** * HTML エスケープ(FORM用) * @param string $str * @return string */ function FORM_Escape( string $str ) { return htmlspecialchars( $str, ENT_QUOTES, "utf-8" ); } /** * HTMLの開始処理 */ function HTML_Begin() { header('Content-type: text/html; charset=utf8'); print << \n EOF; } /** * HTMLの終了処理 */ function HTML_End(){ print "\n"; } /** * エラーメッセージ表示 * @param string $title タイトル * @param string $msg メッセージ */ function SqlError($title, $msg) { print "[Error]$title: $msg
\n"; }