[PHP] 05 MySQLアプリ作成 全テーブル検索

[M1 Mac, Big Sur 11.7.2, PHP 8.2.1, MySQL 8.0.31]

データベース、カラム名、検索語を入力して全テーブル検索できるようにしました。

Pythonとは勝手が違うため、半日以上悪戦苦闘でした。

スクリプトの構成は以下の様になります。
1) mysql_main.php (前回記事と内容は同じ)
2) input.php
3) output.php

PHPはPythonのように配列を丸ごと出力することができないようです。Pythonの使いやすさを再認識しました。

これから実装したい機能は以下の通りです。
1)検索中断ボタン
2)プログレスバー(検索進行度表示)
3)検索結果CSVファイル化
4)検索時間測定

<html>
<?php
header('Cache-Control: no-store, no-cache, must-revalidate');


# MySQLにログイン
$conn = new mysqli('localhost', 'root');
if (!$conn){
	die("MySQL接続に失敗しました");
} else {
	// print 'MySQL接続に成功しました';
}

$dbs_query = $conn->query('show databases;');
$dbs = $dbs_query->fetch_all(MYSQLI_ASSOC);

$dbs_count = count($dbs);

?>
<head>
	<title>MySQL LPW</title>
</head>
<body>
データベース、カラム、検索語を入力してください
<form action="output.php" method="post">
	<table border="1">
		<tr>
			<td>DB</td>
			<td><input type="text" name="db"></td>
		</tr>
	</table>
	<tr>
	<?php
	$num = 0;
	foreach ($dbs as $db) {
		if ($num == 0){
			echo "DB : ";
		}
		echo implode($db);
		if ($num != $dbs_count - 1){
			echo ", ";
		}
		$num = $num + 1;
		
	}
	?>
	</tr>
	<table border="1">
		<tr>
			<td>COL</td>
			<td><input type="text" name="col"></td>
		</tr>

	</table>
	<table border="1">
		<tr>
			<td><input type="text" name="key"></td>
			<td colspan="2" align="center">
			<input type="submit" value="検索">
			</td>
		</tr>
	</table>
</form>
</body>
</html>
<html>
<?php
header('Cache-Control: no-store, no-cache, must-revalidate');
?>
<head>
    <title>MySQL LPW</title>
</head>
<body>
    <?php
    include_once'input.php';

    $db = $_POST['db'];
    printf("DB : %s\n", $db);
    $col = $_POST['col'];
    printf("COL : %s\n", $col);
    $key = $_POST['key'];
    printf("検索語 : %s\n", $key);

    # データベース選択
    $select_db = sprintf("use %s", $db);
    $select = $conn->query($select_db);

    # 全テーブル取得
    $tbls_query = $conn->query('show tables;');
    $tbls = $tbls_query->fetch_all(MYSQLI_ASSOC);

    $counts = 0;
    foreach ($tbls as $tbl) {
        $query = sprintf("SELECT * FROM `%s` WHERE `%s` LIKE '%%%s%%'", implode($tbl), $col, $key);
        $result = $conn->query($query);
        $rows = $result->fetch_all(MYSQLI_ASSOC);
        $count = count($rows);
        $counts = $counts + $count;
    }

    $conn->close();
    exec('mysql.server stop');

    ?>
    <table border="2">
    <tbody>
        <tr>
            <td>件数</td>
            <td width="180"><?php echo $counts; ?></td>
        </tr>
        </tbody>
    </table>
</body>
</html>