PHP基于PDO的 mysql 查询工具

单页面实现,将页面放在任意目录即可。

访问用户 admin 密码 password

代码很简单,主要为了在没有phpMyAdmin时方便执行SQL。

效果如下:

代码如下:

 <?php

 // 权限验证
$user_list = [
'admin' => 'password',
]; $user = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW']; if (empty($user_list[$user]) || $user_list[$user] != $pass)
{
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
die ("Not authorized");
} // 参数
$row_limit = @$_GET['row_limit'] ?: 1000; // 显示行数限制
$str_limit = @$_GET['str_limit'] ?: 100; // 显示值长度限制
$db_config = [
'connect' => @$_POST['db_connect'] ?: '',
'user' => @$_POST['db_user'] ?: '',
'password' => @$_POST['db_password'] ?: '',
]; $sql = @$_POST['sql'] ?: ''; // 查询SQL
function runSql($db, $sql)
{
$dt_begin = round(microtime(true) * 1000); $con = new PDO($db['connect'], $db['user'], $db['password'], [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES `utf8`',
PDO::ATTR_PERSISTENT => FALSE,
]); $con -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$con -> setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER); $sql = trim($sql); $sql_type = strtoupper(explode(' ', $sql)[0]); if (strpos($sql, 'INTO OUTFILE') !== FALSE)
{
$sql_type = 'OUTFILE';
} $cmd = $con -> prepare($sql); $cmd -> execute(); $return = NULL;
if ($sql_type == 'SELECT' || $sql_type == 'SHOW' || $sql_type == 'DESC')
{
$return = $cmd -> fetchAll(PDO::FETCH_ASSOC);
}
else if ($sql_type == 'INSERT')
{
$return = $con -> lastInsertId();
}
else
{
$return = $cmd -> rowCount();
} $dt_begin = round(microtime(true) * 1000) - $dt_begin;
$res = [
'use_time' => $dt_begin,
'data' => $return,
]; return $res;
} // 执行SQL
$res = null;
$error = '';
if (!empty($sql))
{
try
{
$res = runSql($db_config, $sql);
}
catch(Exception $ex)
{
$error = $ex;
}
} // 格式化值输出
function f($v)
{
global $str_limit; $row_count = count(explode("\n", $v)); $v = htmlspecialchars($v);
$v = nl2br($v); if (strlen($v) > $str_limit)
{
$v = substr($v, 0, $str_limit) . '...';
} if ($row_count > 1)
{
$v = '<div style="text-align:left;">' . $v . '</div>';
} return $v;
} ?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>DB 查询工具</title>
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<style>
body{
line-height:1.5;
font-family:consolas, Courier New;
}
input[type=text], input[type=password], textarea{
font-family:consolas, Courier New;
padding:3px;
}
</style>
</head>
<body>
<h1 style="margin:5px 0; font-size:16px;">MySql 查询工具</h1>
<form id="frmQuery" method="POST">
<input type="text" name="db_connect" style="width:500px;" value="<?=$db_config['connect'] ?>" placeholder="连接字符串" />
<input type="text" name="db_user" style="width:100px;" value="<?=$db_config['user'] ?>" placeholder="用户名" />
<input type="password" name="db_password" style="width:100px;" value="<?=$db_config['password'] ?>" placeholder="密码" /><br>
<div style="font-size:12px; color:gray;">例如:mysql:host=localhost;port=3306;dbname=test</div>
<textarea name="sql" placeholder="SQL语句" style="color:blue; width:740px; height:150px; font-size:14px;"><?=$sql ?></textarea>
<div>
<button type="submit">执行</button>
&emsp;
<button type="button" onclick="runSql('show tables;'); return false;">所有表</button>
<button type="button" onclick="runSql('show table status;'); return false;">表详情</button>
<button type="button" onclick="runSql('show full processlist;'); return false;">进程</button>
<button type="button" onclick="runSql('show databases;'); return false;">数据库</button>
<button type="button" onclick="runSql('show status;'); return false;">状态</button>
<button type="button" onclick="runSql('show errors;'); return false;">错误</button>
<button type="button" onclick="runSql('show warnings;'); return false;">警告</button>
<button type="button" onclick="runSql('show create table table1;'); return false;">表创建</button>
<button type="button" onclick="runSql('desc table1;'); return false;">表字段</button>
<button type="button" onclick="runSql('show variables;'); return false;">配置</button>
</div>
</form>
<hr>
<?php if (!empty($error)) { ?>
<pre style="color:red; font-size:14px; font-family:consolas, Courier New;"><?= $error ?></pre>
<?php } ?>
<?php if (!empty($res)) { ?>
<span>执行用时:<?= $res['use_time']; ?>ms</span>
<?php if (is_array($res['data'])) { ?>
<style>
.table{
border-spacing: 0;
border-collapse: collapse;
border:solid 2px #aaa;
background:#fff;
font-size:12px;
}
.table th{
font-weight:normal;
}
.table td, .table th{
border:solid 1px #aaa;
padding:3px 5px;
text-align:center;
white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.table thead{border-bottom:solid 2px #aaa; background:#ddd;}
.table tbody tr:hover{background:#eff;}
</style>
<span>共<?= count($res['data']); ?>行</span>
<?php if (count($res['data']) > 0) { ?>
<span>共<?= count(array_keys($res['data'][0])); ?>列</span>
<table class="table">
<thead>
<tr>
<th>#</th>
<?php foreach (array_keys($res['data'][0]) as $r) { ?>
<th><?= f($r); ?></th>
<?php } ?>
</tr>
</thead>
<tbody>
<?php
$i = 0;
foreach ($res['data'] as $r) {
$i++;
if ($i > $row_limit)
{
break;
}
?>
<tr>
<td><?= $i; ?></td>
<?php foreach ($r as $rr) { ?>
<td><?= f($rr); ?></td>
<?php } ?>
</tr>
<?php } ?>
</tbody>
</table>
<?php } ?>
<?php }else{ ?>
<span>影响行数:<?= $res['data']; ?></span>
<?php } ?>
<?php } ?> <script>
function runSql(sql)
{
$('textarea[name=sql]').val(sql);
$('#frmQuery').submit();
} $(function(){
$('#frmQuery').submit(function(){
if (window.localStorage)
{
window.localStorage.setItem('db_connect', $('input[name=db_connect]').val());
window.localStorage.setItem('db_user', $('input[name=db_user]').val());
window.localStorage.setItem('db_password', $('input[name=db_password]').val());
window.localStorage.setItem('db_sql', $('textarea[name=sql]').val());
}
}); if (window.localStorage)
{
var v = null;
v = window.localStorage.getItem('db_connect');
$('input[name=db_connect]').val(v||'');
v = window.localStorage.getItem('db_user');
$('input[name=db_user]').val(v||'');
v = window.localStorage.getItem('db_password');
$('input[name=db_password]').val(v||'');
v = window.localStorage.getItem('db_sql');
$('textarea[name=sql]').val(v||'');
}
});
</script>
</body>
</html>

PHP mysql查询工具的更多相关文章

  1. Mysql编辑工具中使用(Navicat查询结果显示行号)

    Mysql编辑工具中使用(Navicat查询结果显示行号) as rownum,a.roleId ) t where a.roleId='admin';

  2. 三十二. 多表查询 MySQL管理工具 、 用户授权及撤销

    1.MySQL管理工具 部署LAMP+phpMyAdmin平台 安装httpd.mysql.php-mysql及相关包 启动httpd服务程序 解压phpMyAdmin包,部署到网站目录 配置conf ...

  3. Python3实现火车票查询工具

    Python 实现火车票查询工具 一. 实验介绍 通过python3实现一个简单的命令行版本的火车票查询工具,用实际中的例子会更感兴趣,不管怎么样,既练习了又可以自己使用. 1.  知识点: Pyth ...

  4. 15款最佳的MySQL管理工具和应用程序

    工欲善其事,必先利其器.几乎每个开发人员都有最钟爱的 MySQL 管理工具,它帮助开发人员在许多方面支持包括 PostgreSQL,MySQL,SQLite,Redis,MongoDB 等在内的多种数 ...

  5. 最棒的10款MySQL GUI工具

    绝大多数的关系数据库都明显不同于MS Access,它们都有两个截然不同的部分:后端作为数据仓库,前端作为用于数据组件通信的用户界面.这种设计非常巧妙,它并行处理两层编程模型,将数据 层从用户界面中分 ...

  6. Mysql 复制工具(percona-toolkit)

    Mysql 复制工具 1.percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检 ...

  7. MySQL Server类型之MySQL客户端工具的下载、安装和使用

    本博文的主要内容有 .MySQL Server 5.5系列的下载 .MySQL Server 5.5系列的安装 .MySQL Server 5.5系列的使用 .MySQL Server 5.5系列的卸 ...

  8. 强大的数据库查询工具Database.NET 9.4.5018.42

    原文:强大的数据库查询工具Database.NET 9.4.5018.42 强大的数据库查询工具Database.NET 9.4.5018.42 两个工具的下载地址,两个软件都是绿色免安装的,直接双击 ...

  9. Python 实现火车票查询工具

    注意:由于 12306 的接口经常变化,课程内容可能很快过期,如果遇到接口问题,需要根据最新的接口对代码进行适当修改才可以完成实验. 一.实验简介 当你想查询一下火车票信息的时候,你还在上 12306 ...

随机推荐

  1. Sublime Text 3 Build 3065 License key 注册码 秘钥

    -– BEGIN LICENSE -– Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 6C0EEB94 BC99798F ...

  2. python日期格式化操作

    1.将字符串的时间转换为时间戳 方法: a = "2013-10-10 23:40:00" #将其转换为时间数组 import time timeArray = time.strp ...

  3. TestNG失败自动截图

    转自:https://www.cnblogs.com/tobecrazy/p/4814813.html

  4. 使用代码的方式给EntityFramework edmx 创建连接字符串

    在构建上下文的时候动态生成连接字符串: /// <summary> /// 从配置生成连接 /// </summary> private static readonly str ...

  5. 「SDOI2018」物理实验

    题目大意: 这题不好描述,直接看原题吧…… 题解: 很无脑的题……就是卡精度+难写.代码能力还是太差了. 其实可以直接用long double肝过去.但我的代码似乎太丑了,以至于跑得奇慢无比. 代码: ...

  6. BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集

    BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集 Description     农夫约翰有N(2≤N≤40000)个农场,标号1到N,M( ...

  7. 数字证书中读取PublicKey

    1. 读取https签发证书中的key 1) 在下面的代码中,是实现读取证书字符串来读取key的,CERTIFICATE 就是一个证书的字符串, 而方法cf.generateCertificate() ...

  8. Ubuntu 18 安装chrome

    1.下载chrome文件 32位使用如下命令 wget https://dl.google.com/linux/direct/google-chrome-stable_current_i386.deb ...

  9. 实验吧——隐写术之复杂的QR_code

    好久没有更新隐写术方面的题目了,对不起各位小可爱,今天我会多多更新几篇文章,来慰藉你们! 永远爱你们的 ---------新宝宝 1:复杂的QR_code 解题思路:保存图片之后使用在线解码工具,并没 ...

  10. Python + Appium 获取当前屏幕的截图方法的封装

    使用方法:get_screenshot_as_file(filename),来自于selenium\webdriver\remote\webdiver.py def take_screenShot(s ...