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. 深入理解HashMap上篇

    前言: HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型.随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化, ...

  2. QM3_Statistics Concepts and Market Returns

    Basic Concepts Terms Descriptive Statistics Describes the important aspects of large data sets. 统计 概 ...

  3. Integer的疑惑

    1.Integer m =200; Integer n =200; System.out.println(m==n); 输出falseInteger x =6; Integer y=6; System ...

  4. 将函数声明为Static的作用

    表示静态函数,它为所有类共有的.调用该函数直接使用类名加上修饰符,如:Windows win;Windows::W_SIZE();而不是:win.W_SIZE();静态函数只能处理静态数据成员,不能处 ...

  5. 为什么说JAVA中要慎重使用继承

    JAVA中使用到继承就会有两个无法回避的缺点: 打破了封装性,迫使开发者去了解超类的实现细节,子类和超类耦合. 超类更新后可能会导致错误. 继承打破了封装性 关于这一点,下面是一个详细的例子(来源于E ...

  6. 阿里巴巴Java开发程序猿年薪40W是什么水平?

    对于年薪40万的程序员,不只是技术过硬,还有一个原因是他们所在的公司福利高,或者会直接持股.在BAT中就是一个很好的案例,例如阿里巴巴P7,P8级别的员工不仅是年薪30到80万不等,还有更多股票持有. ...

  7. vue2.0 axios封装、vuex介绍

    一.前言 博主也是vue道路上的行者,道行不深,希望自己的东西能对大家有所帮助.这篇博客针对 了解过vue基础,但是没有做过vue项目的童鞋.如果想看基础指令,可以看我之前的一篇博客,请点击  跳转, ...

  8. jdk源码阅读笔记-LinkedHashMap

    Map是Java collection framework 中重要的组成部分,特别是HashMap是在我们在日常的开发的过程中使用的最多的一个集合.但是遗憾的是,存放在HashMap中元素都是无序的, ...

  9. 如何将markdown转换为wxml

    话说我要为技术博客写一个小程序版,我的博客解决方案是 hexo + github-page,格式当然是技术控们喜欢的 markdown 了 .但小程序使用的却是独有的模版语言 WXML.我总不能把之前 ...

  10. 分布式团队中沟通引发的问题, itest 解决之道

    导读: 从问题场景和 itest 优雅解决办法及示例2部分来阐述 1.问题场景: 研发团队是分散在几地的分布式团队,经常会因沟通引来一些问题.如下三图是开发觉得测试进度太慢,一番对话之后, 接下来他们 ...