http://osalabs.com
Light standalone PHP script for quick and easy access MySQL databases.
http://phpminiadmin.sourceforge.net
Dual licensed: GPL v2 and MIT, see texts at http://opensource.org/licenses/
*/
$ACCESS_PWD='passw0rd'; #!!!IMPORTANT!!! this is script access password, SET IT if you want to protect you DB from public access
#DEFAULT db connection settings
# --- WARNING! --- if you set defaults - it's recommended to set $ACCESS_PWD to protect your db!
$DBDEF=array(
'user'=>"user42163_onli",#required
'pwd'=>"1W7y2E8u", #required
'db'=>"user42163_onli", #optional, default DB
'host'=>"localhost",#optional
'port'=>"",#optional
'chset'=>"utf8",#optional, default charset
);
$IS_COUNT=false; #set to true if you want to see Total records when pagination occurs (SLOWS down all select queries!)
$DUMP_FILE=dirname(__FILE__).'/pmadump'; #path to file without extension used for server-side exports (timestamp, .sql/.csv/.gz extension added) or imports(.sql)
file_exists($f=dirname(__FILE__) . '/phpminiconfig.php')&&require($f); // Read from config (easier to update)
if (function_exists('date_default_timezone_set')) date_default_timezone_set('UTC');#required by PHP 5.1+
//constants
$VERSION='1.9.161116';
$MAX_ROWS_PER_PAGE=50; #max number of rows in select per one page
$D="\r\n"; #default delimiter for export
$BOM=chr(239).chr(187).chr(191);
$SHOW_D="SHOW DATABASES";
$SHOW_T="SHOW TABLE STATUS";
$DB=array(); #working copy for DB settings
$self=$_SERVER['PHP_SELF'];
session_set_cookie_params(0, null, null, false, true);
session_start();
if (!isset($_SESSION['XSS'])) $_SESSION['XSS']=get_rand_str(16);
$xurl='XSS='.$_SESSION['XSS'];
ini_set('display_errors',0); #turn on to debug db or script issues
error_reporting(E_ALL ^ E_NOTICE);
//strip quotes if they set
if (get_magic_quotes_gpc()){
$_COOKIE=array_map('killmq',$_COOKIE);
$_REQUEST=array_map('killmq',$_REQUEST);
}
if ($_REQUEST['login']){
if ($_REQUEST['pwd']!=$ACCESS_PWD){
$err_msg="Invalid password. Try again";
}else{
$_SESSION['is_logged']=true;
loadcfg();
}
}
if ($_REQUEST['logoff']){
check_xss();
$_SESSION = array();
savecfg();
session_destroy();
$url=$self;
if (!$ACCESS_PWD) $url='/';
header("location: $url");
exit;
}
if (!$_SESSION['is_logged']){
if (!$ACCESS_PWD) {
$_SESSION['is_logged']=true;
loadcfg();
}else{
print_login();
exit;
}
}
if ($_REQUEST['savecfg']){
check_xss();
savecfg();
}
loadsess();
if ($_REQUEST['showcfg']){
print_cfg();
exit;
}
//get initial values
$SQLq=trim(b64d($_REQUEST['q']));
$page=$_REQUEST['p']+0;
if ($_REQUEST['refresh'] && $DB['db'] && preg_match('/^show/',$SQLq) ) $SQLq=$SHOW_T;
if (db_connect('nodie')){
$time_start=microtime_float();
if ($_REQUEST['phpinfo']){
ob_start();phpinfo();$html=ob_get_clean();preg_match("/
]*>(.*?)<\/body>/is",$html,$m);
$sqldr='
'.$m[1].'
';
}else{
if ($DB['db']){
if ($_REQUEST['shex']){
print_export();
}elseif ($_REQUEST['doex']){
check_xss();do_export();
}elseif ($_REQUEST['shim']){
print_import();
}elseif ($_REQUEST['doim']){
check_xss();do_import();
}elseif ($_REQUEST['dosht']){
check_xss();do_sht();
}elseif (!$_REQUEST['refresh'] || preg_match('/^select|show|explain|desc/i',$SQLq) ){
if ($SQLq)check_xss();
do_sql($SQLq);#perform non-select SQL only if not refresh (to avoid dangerous delete/drop)
}
}else{
if ( $_REQUEST['refresh'] ){
check_xss();do_sql($SHOW_D);
}elseif ($_REQUEST['crdb']){
check_xss();do_sql('CREATE DATABASE `'.$_REQUEST['new_db'].'`');do_sql($SHOW_D);
}elseif ( preg_match('/^(?:show\s+(?:databases|status|variables|process)|create\s+database|grant\s+)/i',$SQLq) ){
check_xss();do_sql($SQLq);
}else{
$err_msg="Select Database first";
if (!$SQLq) do_sql($SHOW_D);
}
}
}
$time_all=ceil((microtime_float()-$time_start)*10000)/10000;
print_screen();
}else{
print_cfg();
}
function do_sql($q){
global $dbh,$last_sth,$last_sql,$reccount,$out_message,$SQLq,$SHOW_T;
$SQLq=$q;
if (!do_multi_sql($q)){
$out_message="Error: ".mysqli_error($dbh);
}else{
if ($last_sth && $last_sql){
$SQLq=$last_sql;
if (preg_match("/^select|show|explain|desc/i",$last_sql)) {
if ($q!=$last_sql) $out_message="Results of the last select displayed:";
display_select($last_sth,$last_sql);
} else {
$reccount=mysqli_affected_rows($dbh);
$out_message="Done.";
if (preg_match("/^insert|replace/i",$last_sql)) $out_message.=" Last inserted id=".get_identity();
if (preg_match("/^drop|truncate/i",$last_sql)) do_sql($SHOW_T);
}
}
}
}
function display_select($sth,$q){
global $dbh,$DB,$sqldr,$reccount,$is_sht,$xurl;
$rc=array("o","e");
$dbn=$DB['db'];
$sqldr='';
$is_shd=(preg_match('/^show\s+databases/i',$q));
$is_sht=(preg_match('/^show\s+tables|^SHOW\s+TABLE\s+STATUS/',$q));
$is_show_crt=(preg_match('/^show\s+create\s+table/i',$q));
if ($sth===FALSE or $sth===TRUE) return;#check if $sth is not a mysql resource
$reccount=mysqli_num_rows($sth);
$fields_num=mysqli_field_count($dbh);
$w='';
if ($is_sht || $is_shd) {$w='wa';
$url='?'.$xurl."&db=$dbn";
$sqldr.="
";
}else{
for($i=0;$i<$fields_num;$i++){
$v=$row[$i];
if (is_null($v)) $v="NULL";
elseif (preg_match('/[\x00-\x09\x0B\x0C\x0E-\x1F]+/',$v)) { #all chars <32, except \n\r(0D0A)
$vl=strlen($v);$pf='';
if ($vl>16 && $fields_num>1){#show full dump if just one field
$v=substr($v, 0, 16);$pf='...';
}
$v='BINARY: '.chunk_split(strtoupper(bin2hex($v)),2,' ').$pf;
}else $v=hs($v);
if ($is_show_crt) $v="
$v
";
$sqldr.="
$v".(!strlen($v)?" ":'')."
";
}
}
$sqldr.="
\n";
}
$sqldr.="
\n".$abtn;
}
function print_header(){
global $err_msg,$VERSION,$DB,$dbh,$self,$is_sht,$xurl,$SHOW_T;
$dbn=$DB['db'];
?>
phpMiniAdmin
\n".mysqli_error($dbh1)." \n$sql");
return $sth;
}
function db_array($sql, $dbh1=NULL, $skiperr=0, $isnum=0){#array of rows
$sth=db_query($sql, $dbh1, $skiperr);
if (!$sth) return;
$res=array();
if ($isnum){
while($row=mysqli_fetch_row($sth)) $res[]=$row;
}else{
while($row=mysqli_fetch_assoc($sth)) $res[]=$row;
}
return $res;
}
function db_row($sql){
$sth=db_query($sql);
return mysqli_fetch_assoc($sth);
}
function db_value($sql,$dbh1=NULL,$skiperr=0){
$sth=db_query($sql,$dbh1,$skiperr);
if (!$sth) return;
$row=mysqli_fetch_row($sth);
return $row[0];
}
function get_identity($dbh1=NULL){
$dbh1=db_checkconnect($dbh1);
return mysqli_insert_id($dbh1);
}
function get_db_select($sel=''){
global $DB,$SHOW_D;
if (is_array($_SESSION['sql_sd']) && $_REQUEST['db']!='*'){//check cache
$arr=$_SESSION['sql_sd'];
}else{
$arr=db_array($SHOW_D,NULL,1);
if (!is_array($arr)){
$arr=array( 0 => array('Database' => $DB['db']) );
}
$_SESSION['sql_sd']=$arr;
}
return @sel($arr,'Database',$sel);
}
function chset_select($sel=''){
global $DBDEF;
$result='';
if ($_SESSION['sql_chset']){
$arr=$_SESSION['sql_chset'];
}else{
$arr=db_array("show character set",NULL,1);
if (!is_array($arr)) $arr=array(array('Charset'=>$DBDEF['chset']));
$_SESSION['sql_chset']=$arr;
}
return @sel($arr,'Charset',$sel);
}
function sel($arr,$n,$sel=''){
foreach($arr as $a){
# echo $a[0];
$b=$a[$n];
$res.="";
}
return $res;
}
function microtime_float(){
list($usec,$sec)=explode(" ",microtime());
return ((float)$usec+(float)$sec);
}
/* page nav
$pg=int($_[0]); #current page
$all=int($_[1]); #total number of items
$PP=$_[2]; #number if items Per Page
$ptpl=$_[3]; #page url /ukr/dollar/notes.php?page= for notes.php
$show_all=$_[5]; #print Totals?
*/
function get_nav($pg, $all, $PP, $ptpl, $show_all=''){
$n=' ';
$sep=" $n|$n\n";
if (!$PP) $PP=10;
$allp=floor($all/$PP+0.999999);
$pname='';
$res='';
$w=array('Less','More','Back','Next','First','Total');
$sp=$pg-2;
if($sp<0) $sp=0;
if($allp-$sp<5 && $allp>=5) $sp=$allp-5;
$res="";
if($sp>0){
$pname=pen($sp-1,$ptpl);
$res.="$w[0]";
$res.=$sep;
}
for($p_p=$sp;$p_p<$allp && $p_p<$sp+5;$p_p++){
$first_s=$p_p*$PP+1;
$last_s=($p_p+1)*$PP;
$pname=pen($p_p,$ptpl);
if($last_s>$all){
$last_s=$all;
}
if($p_p==$pg){
$res.="$first_s..$last_s";
}else{
$res.="$first_s..$last_s";
}
if($p_p+1<$allp) $res.=$sep;
}
if($sp+5<$allp){
$pname=pen($sp+5,$ptpl);
$res.="$w[1]";
}
$res.=" \n";
if($pg>0){
$pname=pen($pg-1,$ptpl);
$res.="$w[2] $n|$n ";
$pname=pen(0,$ptpl);
$res.="$w[4]";
}
if($pg>0 && $pg+1<$allp) $res.=$sep;
if($pg+1<$allp){
$pname=pen($pg+1,$ptpl);
$res.="$w[3]";
}
if ($show_all) $res.=" ($w[5] - $all) ";
return $res;
}
function pen($p,$np=''){
return str_replace('%p%',$p, $np);
}
function killmq($value){
return is_array($value)?array_map('killmq',$value):stripslashes($value);
}
function savecfg(){
$v=$_REQUEST['v'];
$_SESSION['DB']=$v;
unset($_SESSION['sql_sd']);
if ($_REQUEST['rmb']){
$tm=time()+60*60*24*30;
newcookie("conn[db]", $v['db'],$tm);
newcookie("conn[user]",$v['user'],$tm);
newcookie("conn[pwd]", $v['pwd'],$tm);
newcookie("conn[host]",$v['host'],$tm);
newcookie("conn[port]",$v['port'],$tm);
newcookie("conn[chset]",$v['chset'],$tm);
}else{
newcookie("conn[db]", FALSE,-1);
newcookie("conn[user]",FALSE,-1);
newcookie("conn[pwd]", FALSE,-1);
newcookie("conn[host]",FALSE,-1);
newcookie("conn[port]",FALSE,-1);
newcookie("conn[chset]",FALSE,-1);
}
}
// Allow httponly cookies, or the password is stored plain text in a cookie
function newcookie($n,$v,$e){$x;return setcookie($n,$v,$e,$x,$x,!!$x,!$x);}
//during login only - from cookies or use defaults;
function loadcfg(){
global $DBDEF;
if( isset($_COOKIE['conn']) ){
$_SESSION['DB']=$_COOKIE['conn'];
}else{
$_SESSION['DB']=$DBDEF;
}
if (!strlen($_SESSION['DB']['chset'])) $_SESSION['DB']['chset']=$DBDEF['chset'];#don't allow empty charset
}
//each time - from session to $DB_*
function loadsess(){
global $DB;
$DB=$_SESSION['DB'];
$rdb=$_REQUEST['db'];
if ($rdb=='*') $rdb='';
if ($rdb) {
$DB['db']=$rdb;
}
}
function print_export(){
global $self,$xurl,$DB,$DUMP_FILE;
$t=$_REQUEST['rt'];
$l=($t)?"Table $t":"whole DB";
print_header();
?>
Export
Structure
Data
(to export as csv - go to 'show tables' and export just ONE table)
"Dump on Server" exports to file:
name).(($i<$fn-1)?",":""));
}
ex_w($D);
while($row=mysqli_fetch_row($sth)) ex_w(to_csv_row($row));
}else{
ex_start('.sql');
ex_hdr($ctp?$ctp:'text/plain',"$DB[db]".(($ct==1&&$t[0])?".$t[0]":(($ct>1)?'.'.$ct.'tables':'')).".sql$aext");
ex_w("-- phpMiniAdmin dump $VERSION$D-- Datetime: ".date('Y-m-d H:i:s')."$D-- Host: $DB[host]$D-- Database: $DB[db]$D$D");
if ($DB['chset']) ex_w("/*!40030 SET NAMES $DB[chset] */;$D");
$ex_super && ex_w("/*!40030 SET GLOBAL max_allowed_packet=16777216 */;$D$D");
ex_w("/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;$D$D");
$sth=db_query("show full tables from `$DB[db]`");
while($row=mysqli_fetch_row($sth)){
if (!$rt||array_key_exists($row[0],$th)) do_export_table($row[0],$row[1],$MAXI);
}
ex_w("/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;$D$D");
ex_w("$D-- phpMiniAdmin dump end$D");
}
ex_end();
if (!$ex_issrv) exit;
$out_message='Export done successfully';
}
function do_export_table($t='',$tt='',$MAXI=838860){
global $D,$ex_issrv;
@set_time_limit(600);
if($_REQUEST['s']){
$sth=db_query("show create table `$t`");
$row=mysqli_fetch_row($sth);
$ct=preg_replace("/\n\r|\r\n|\n|\r/",$D,$row[1]);
ex_w("DROP TABLE IF EXISTS `$t`;$D$ct;$D$D");
}
if ($_REQUEST['d']&&$tt!='VIEW'){//no dump for views
$exsql='';
ex_w("/*!40000 ALTER TABLE `$t` DISABLE KEYS */;$D");
$sth=db_query("select * from `$t`");
while($row=mysqli_fetch_row($sth)){
$values='';
foreach($row as $v) $values.=(($values)?',':'').dbq($v);
$exsql.=(($exsql)?',':'')."(".$values.")";
if (strlen($exsql)>$MAXI) {
ex_w("INSERT INTO `$t` VALUES $exsql;$D");$exsql='';
}
}
if ($exsql) ex_w("INSERT INTO `$t` VALUES $exsql;$D");
ex_w("/*!40000 ALTER TABLE `$t` ENABLE KEYS */;$D$D");
}
if (!$ex_issrv) flush();
}
function ex_hdr($ct,$fn){
global $ex_issrv;
if ($ex_issrv) return;
header("Content-type: $ct");
header("Content-Disposition: attachment; filename=\"$fn\"");
}
function ex_start($ext){
global $ex_isgz,$ex_gz,$ex_tmpf,$ex_issrv,$ex_f,$DUMP_FILE;
if ($ex_isgz){
$ex_tmpf=($ex_issrv?export_fname($DUMP_FILE,true).$ext:tmp_name()).'.gz';
if (!($ex_gz=gzopen($ex_tmpf,'wb9'))) die("Error trying to create gz tmp file");
}else{
if ($ex_issrv) $ex_f=fopen(export_fname($DUMP_FILE,true).$ext,'wb');
}
}
function ex_w($s){
global $ex_isgz,$ex_gz,$ex_issrv,$ex_f;
if ($ex_isgz){
gzwrite($ex_gz,$s,strlen($s));
}else{
if ($ex_issrv){
fwrite($ex_f,$s);
}else{
echo $s;
}
}
}
function ex_end(){
global $ex_isgz,$ex_gz,$ex_tmpf,$ex_issrv,$ex_f;
if ($ex_isgz){
gzclose($ex_gz);
if (!$ex_issrv){
readfile($ex_tmpf);
unlink($ex_tmpf);
}
}else{
if ($ex_issrv) fclose($ex_f);
}
}
function print_import(){
global $self,$xurl,$DB,$DUMP_FILE;
print_header();
?>
Import DB
'(? '(? '\*\/',
'#' => '[\r\n]+',
'--' => '[\r\n]+',
);
if ( $aCLOSE[$ochar] && preg_match("/(".$aCLOSE[$ochar].")/", $str, $m, PREG_OFFSET_CAPTURE, $pos ) ) {
$clchar=$m[1][0];
$clpos=$m[1][1];
$sl=strlen($m[2][0]);
if ($ochar=="'" && $sl){
if ($sl % 2){ #don't count as CLOSE char if number of slashes before ' ODD
list($clchar, $clpos)=get_close_char($str, $clpos+strlen($clchar), $ochar);
}else{
$clpos+=strlen($clchar)-1;$clchar="'";#correction
}
}
}
return array($clchar, $clpos);
}
function do_one_sql($sql){
global $last_sth,$last_sql,$MAX_ROWS_PER_PAGE,$page,$is_limited_sql,$last_count,$IS_COUNT;
$sql=trim($sql);
$sql=preg_replace("/;$/","",$sql);
if ($sql){
$last_sql=$sql;$is_limited_sql=0;
$last_count=NULL;
if (preg_match("/^select/i",$sql) && !preg_match("/limit +\d+/i", $sql)){
if ($IS_COUNT){
#get total count
$sql1='select count(*) from ('.$sql.') ___count_table';
$last_count=db_value($sql1,NULL,'noerr');
}
$offset=$page*$MAX_ROWS_PER_PAGE;
$sql.=" LIMIT $offset,$MAX_ROWS_PER_PAGE";
$is_limited_sql=1;
}
$last_sth=db_query($sql,0,'noerr');
return $last_sth;
}
return 1;
}
function do_sht(){
global $SHOW_T;
$cb=$_REQUEST['cb'];
if (!is_array($cb)) $cb=array();
$sql='';
switch ($_REQUEST['dosht']){
case 'exp':$_REQUEST['t']=join(",",$cb);print_export();exit;
case 'drop':$sq='DROP TABLE';break;
case 'trunc':$sq='TRUNCATE TABLE';break;
case 'opt':$sq='OPTIMIZE TABLE';break;
}
if ($sq){
foreach($cb as $v){
$sql.=$sq." $v;\n";
}
}
if ($sql) do_sql($sql);
do_sql($SHOW_T);
}
function to_csv_row($adata){
global $D;
$r='';
foreach ($adata as $a){
$r.=(($r)?",":"").qstr($a);
}
return $r.$D;
}
function qstr($s){
$s=nl2br($s);
$s=str_replace('"','""',$s);
return '"'.$s.'"';
}
function get_rand_str($len){
$result='';
$chars=preg_split('//','ABCDEFabcdef0123456789');
for($i=0;$i<$len;$i++) $result.=$chars[rand(0,count($chars)-1)];
return $result;
}
function check_xss(){
global $self;
if ($_SESSION['XSS']!=trim($_REQUEST['XSS'])){
unset($_SESSION['XSS']);
header("location: $self");
exit;
}
}
function rw($s){#for debug
echo hs(var_dump($s))." \n";
}
function tmp_name() {
if ( function_exists('sys_get_temp_dir')) return tempnam(sys_get_temp_dir(),'pma');
if( !($temp=getenv('TMP')) )
if( !($temp=getenv('TEMP')) )
if( !($temp=getenv('TMPDIR')) ) {
$temp=tempnam(__FILE__,'');
if (file_exists($temp)) {
unlink($temp);
$temp=dirname($temp);
}
}
return $temp ? tempnam($temp,'pma') : null;
}
function hs($s){
return htmlspecialchars($s, ENT_COMPAT|ENT_HTML401,'UTF-8');
}
function eo($s){//echo+escape
echo hs($s);
}
function b64e($s){
return base64_encode($s);
}
function b64d($s){
return base64_decode($s);
}
?>