<?php //exit(); /* PHP Mini MySQL Admin (c) 2004-2016 Oleg Savchuk <osalabs@gmail.com> 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[^>]*>(.*?)<\/body>/is",$html,$m); $sqldr='<div class="pi">'.$m[1].'</div>'; }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.="<div class='dot'> MySQL Server: · <a href='$url&q=".b64e("show variables")."'>Show Configuration Variables</a> · <a href='$url&q=".b64e("show status")."'>Show Statistics</a> · <a href='$url&q=".b64e("show processlist")."'>Show Processlist</a> "; if ($is_shd) $sqldr.="· <label>Create new database: <input type='text' name='new_db' placeholder='type db name here'></label> <input type='submit' name='crdb' value='Create'>"; $sqldr.="<br>"; if ($is_sht) $sqldr.="Database: · <a href='$url&q=".b64e("show table status")."'>Show Table Status</a>"; $sqldr.="</div>"; } if ($is_sht){ $abtn="<div><input type='submit' value='Export' onclick=\"sht('exp')\"> <input type='submit' value='Drop' onclick=\"if(ays()){sht('drop')}else{return false}\"> <input type='submit' value='Truncate' onclick=\"if(ays()){sht('trunc')}else{return false}\"> <input type='submit' value='Optimize' onclick=\"sht('opt')\"> <b>selected tables</b></div>"; $sqldr.=$abtn."<input type='hidden' name='dosht' value=''>"; } $sqldr.="<div><table class='res $w'>"; $headers="<tr class='h'>"; if ($is_sht) $headers.="<td><input type='checkbox' name='cball' value='' onclick='chkall(this)'></td>"; for($i=0;$i<$fields_num;$i++){ if ($is_sht && $i>0) break; $meta=mysqli_fetch_field($sth); $headers.="<th>".$meta->name."</th>"; } if ($is_shd) $headers.="<th>show create database</th><th>show table status</th><th>show triggers</th>"; if ($is_sht) $headers.="<th>engine</th><th>~rows</th><th>data size</th><th>index size</th><th>show create table</th><th>explain</th><th>indexes</th><th>export</th><th>drop</th><th>truncate</th><th>optimize</th><th>repair</th><th>comment</th>"; $headers.="</tr>\n"; $sqldr.=$headers; $swapper=false; while($row=mysqli_fetch_row($sth)){ $sqldr.="<tr class='".$rc[$swp=!$swp]."' onclick='tc(this)'>"; $v=$row[0]; if ($is_sht){ $vq='`'.$v.'`'; $url='?'.$xurl."&db=$dbn&t=".b64e($v); $v="<input type='checkbox' name='cb[]' value=\"$vq\"></td>" ."<td><a href=\"$url&q=".b64e("select * from $vq")."\">$v</a></td>" ."<td>".$row[1]."</td>" ."<td align='right'>".$row[4]."</td>" ."<td align='right'>".$row[6]."</td>" ."<td align='right'>".$row[8]."</td>" ."<td>·<a href=\"$url&q=".b64e("show create table $vq")."\">sct</a></td>" ."<td>·<a href=\"$url&q=".b64e("explain $vq")."\">exp</a></td>" ."<td>·<a href=\"$url&q=".b64e("show index from $vq")."\">ind</a></td>" ."<td>·<a href=\"$url&shex=1&rt=$vq\">export</a></td>" ."<td>·<a href=\"$url&q=".b64e("drop table $vq")."\" onclick='return ays()'>dr</a></td>" ."<td>·<a href=\"$url&q=".b64e("truncate table $vq")."\" onclick='return ays()'>tr</a></td>" ."<td>·<a href=\"$url&q=".b64e("optimize table $vq")."\" onclick='return ays()'>opt</a></td>" ."<td>·<a href=\"$url&q=".b64e("repair table $vq")."\" onclick='return ays()'>rpr</a></td>" ."<td>".hs($row[$fields_num-1]); $sqldr.="<td>$v</td>"; }elseif ($is_shd){ $url='?'.$xurl."&db=$v"; $v="<a href=\"$url&q=".b64e("SHOW TABLE STATUS")."\">$v</a></td>" ."<td><a href=\"$url&q=".b64e("show create database `$v`")."\">scd</a></td>" ."<td><a href=\"$url&q=".b64e("show table status")."\">status</a></td>" ."<td><a href=\"$url&q=".b64e("show triggers")."\">trig</a>"; $sqldr.="<td>$v</td>"; }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="<pre>$v</pre>"; $sqldr.="<td>$v".(!strlen($v)?"<br>":'')."</td>"; } } $sqldr.="</tr>\n"; } $sqldr.="</table></div>\n".$abtn; } function print_header(){ global $err_msg,$VERSION,$DB,$dbh,$self,$is_sht,$xurl,$SHOW_T; $dbn=$DB['db']; ?> <!DOCTYPE html> <html> <head><title>phpMiniAdmin</title> <meta charset="utf-8"> <style type="text/css"> *{box-sizing:border-box;} body{font-family:Arial,sans-serif;font-size:80%;padding:0;margin:0} div{padding:3px} pre{font-size:125%} textarea{width:100%} .nav{text-align:center} .ft{text-align:right;margin-top:20px;font-size:smaller} .inv{background-color:#069;color:#FFF} .inv a{color:#FFF} table{border-collapse:collapse} table.res{width:100%} table.wa{width:auto} table.res th,table.res td{padding:2px;border:1px solid #fff;vertical-align:top} table.restr{vertical-align:top} tr.e{background-color:#CCC} tr.o{background-color:#EEE} tr.e:hover, tr.o:hover{background-color:#FF9} tr.h{background-color:#99C} tr.s{background-color:#FF9} .err{color:#F33;font-weight:bold;text-align:center} .frm{width:400px;border:1px solid #999;background-color:#eee;text-align:left} .frm label .l{width:100px;float:left} .dot{border-bottom:1px dotted #000} .ajax{text-decoration:none;border-bottom: 1px dashed} .qnav{width:30px} .sbtn{width:100px} .clear{clear:both;height:0;display:block} .pi a{text-decoration:none} .pi hr{display:none} .pi img{float:right} .pi .center{text-align:center} .pi table{margin:0 auto} .pi table td, .pi table th{border:1px solid #000000;text-align:left;vertical-align:baseline} .pi table .e{background-color:#ccccff;font-weight:bold} .pi table .v{background-color:#cccccc} </style> <script type="text/javascript"> var LSK='pma_',LSKX=LSK+'max',LSKM=LSK+'min',qcur=0,LSMAX=32; function $(i){return document.getElementById(i)} function frefresh(){ var F=document.DF; F.method='get'; F.refresh.value="1"; F.GoSQL.click(); } function go(p,sql){ var F=document.DF; F.p.value=p; if(sql)F.q.value=sql; F.GoSQL.click(); } function ays(){ return confirm('Are you sure to continue?'); } function chksql(){ var F=document.DF,v=F.qraw.value; if(/^\s*(?:delete|drop|truncate|alter)/.test(v)) if(!ays())return false; if(lschk(1)){ var lsm=lsmax()+1,ls=localStorage; ls[LSK+lsm]=v; ls[LSKX]=lsm; //keep just last LSMAX queries in log if(!ls[LSKM])ls[LSKM]=1; var lsmin=parseInt(ls[LSKM]); if((lsm-lsmin+1)>LSMAX){ lsclean(lsmin,lsm-LSMAX); } } return true; } function tc(tr){ if (tr.className=='s'){ tr.className=tr.classNameX; }else{ tr.classNameX=tr.className; tr.className='s'; } } function lschk(skip){ if (!localStorage || !skip && !localStorage[LSKX]) return false; return true; } function lsmax(){ var ls=localStorage; if(!lschk() || !ls[LSKX])return 0; return parseInt(ls[LSKX]); } function lsclean(from,to){ ls=localStorage; for(var i=from;i<=to;i++){ delete ls[LSK+i];ls[LSKM]=i+1; } } function q_prev(){ var ls=localStorage; if(!lschk())return; qcur--; var x=parseInt(ls[LSKM]); if(qcur<x)qcur=x; $('qraw').value=ls[LSK+qcur]; } function q_next(){ var ls=localStorage; if(!lschk())return; qcur++; var x=parseInt(ls[LSKX]); if(qcur>x)qcur=x; $('qraw').value=ls[LSK+qcur]; } function after_load(){ var F=document.DF; var p=F['v[pwd]']; if (p) p.focus(); qcur=lsmax(); F.addEventListener('submit',function(e){ if(!F.qraw)return; if(!chksql()){e.preventDefault();return} $('q').value=btoa(encodeURIComponent($('qraw').value).replace(/%([0-9A-F]{2})/g,function(m,p){return String.fromCharCode('0x'+p)})); }); } function logoff(){ if(lschk()){ var ls=localStorage; var from=parseInt(ls[LSKM]),to=parseInt(ls[LSKX]); for(var i=from;i<=to;i++){ delete ls[LSK+i]; } delete ls[LSKM];delete ls[LSKX]; } } function cfg_toggle(){ var e=$('cfg-adv'); e.style.display=e.style.display=='none'?'':'none'; } function qtpl(s){ $('qraw').value=s.replace(/%T/g,'`<?php echo $_REQUEST['t']?b64d($_REQUEST['t']):'tablename'?>`'); } <?php if($is_sht){?> function chkall(cab){ var e=document.DF.elements; if (e!=null){ var cl=e.length; for (i=0;i<cl;i++){var m=e[i];if(m.checked!=null && m.type=="checkbox"){m.checked=cab.checked}} } } function sht(f){ document.DF.dosht.value=f; } <?php }?> </script> </head> <body onload="after_load()"> <form method="post" name="DF" id="DF" action="<?php eo($self)?>" enctype="multipart/form-data"> <input type="hidden" name="XSS" value="<?php eo($_SESSION['XSS'])?>"> <input type="hidden" name="refresh" value=""> <input type="hidden" name="p" value=""> <div class="inv"> <a href="http://phpminiadmin.sourceforge.net/" target="_blank"><b>phpMiniAdmin <?php eo($VERSION)?></b></a> <?php if ($_SESSION['is_logged'] && $dbh){ ?> | <a href="?<?php eo($xurl)?>&q=<?=b64e("show databases");?>">Databases</a>: <select name="db" onChange="frefresh()"><option value='*'> - select/refresh -</option><option value=''> - show all -</option> <?php echo get_db_select($dbn)?></select> <?php if($dbn){ $z=" · <a href='".hs($self."?$xurl&db=$dbn"); ?> <?php echo $z.'&q='.b64e($SHOW_T)?>'>show tables</a> <?php echo $z?>&shex=1'>export</a> <?php echo $z?>&shim=1'>import</a> <?php } ?> | <a href="?showcfg=1">Settings</a> <?php } ?> <?php if ($_SESSION['is_logged']){?> | <a href="?<?php eo($xurl)?>&logoff=1" onclick="logoff()">Logoff</a> <?php }?> | <a href="?phpinfo=1">phpinfo</a> </div> <div class="err"><?php eo($err_msg)?></div> <?php } function print_screen(){ global $out_message, $SQLq, $err_msg, $reccount, $time_all, $sqldr, $page, $MAX_ROWS_PER_PAGE, $is_limited_sql, $last_count; $nav=''; if ($is_limited_sql && ($page || $reccount>=$MAX_ROWS_PER_PAGE) ){ $nav="<div class='nav'>".get_nav($page, 10000, $MAX_ROWS_PER_PAGE, "javascript:go(%p%)")."</div>"; } print_header(); ?> <div class="dot" style="padding:3px 20px"> <label for="qraw">SQL-query (or multiple queries separated by ";"):</label> <button type="button" class="qnav" onclick="q_prev()"><</button><button type="button" class="qnav" onclick="q_next()">></button><br> <textarea id="qraw" cols="70" rows="10"><?php eo($SQLq)?></textarea><br> <input type="hidden" name="q" id="q" value="<?php b64e($SQLq);?>"> <input type="submit" name="GoSQL" value="Go" class="sbtn"> <input type="button" name="Clear" value=" Clear " onclick="$('qraw').value='';" style="width:100px"> <?php if(!empty($_REQUEST['db'])){ ?> <div style="float:right"> <input type="button" value="Select" class="sbtn" onclick="qtpl('SELECT *\nFROM %T\nWHERE 1')"> <input type="button" value="Insert" class="sbtn" onclick="qtpl('INSERT INTO %T (`column`, `column`)\nVALUES (\'value\', \'value\')')"> <input type="button" value="Update" class="sbtn" onclick="qtpl('UPDATE %T\nSET `column`=\'value\'\nWHERE 1=0')"> <input type="button" value="Delete" class="sbtn" onclick="qtpl('DELETE FROM %T\nWHERE 1=0')"> </div><br class="clear"> <?php } ?> </div> <div class="dot"> Records: <b><?php eo($reccount); if(!is_null($last_count) && $reccount<$last_count){eo(' out of '.$last_count);}?></b> in <b><?php eo($time_all)?></b> sec<br> <b><?php eo($out_message)?></b> </div> <?php echo $nav.$sqldr.$nav; ?> <?php print_footer(); } function print_footer(){ ?> </form> <div class="ft">© 2004-2016 <a href="http://osalabs.com" target="_blank">Oleg Savchuk</a></div> </body></html> <?php } function print_login(){ print_header(); ?> <center> <h3>Access protected by password</h3> <div style="width:400px;border:1px solid #999999;background-color:#eeeeee"> <label>Password: <input type="password" name="pwd" value=""></label> <input type="hidden" name="login" value="1"> <input type="submit" value=" Login "> </div> </center> <?php print_footer(); } function print_cfg(){ global $DB,$err_msg,$self; print_header(); ?> <center> <h3>DB Connection Settings</h3> <div class="frm"> <label><div class="l">DB user name:</div><input type="text" name="v[user]" value="<?php eo($DB['user'])?>"></label><br> <label><div class="l">Password:</div><input type="password" name="v[pwd]" value=""></label><br> <div style="text-align:right"><a href="#" class="ajax" onclick="cfg_toggle()">advanced settings</a></div> <div id="cfg-adv" style="display:none;"> <label><div class="l">DB name:</div><input type="text" name="v[db]" value="<?php eo($DB['db'])?>"></label><br> <label><div class="l">MySQL host:</div><input type="text" name="v[host]" value="<?php eo($DB['host'])?>"></label> <label>port: <input type="text" name="v[port]" value="<?php eo($DB['port'])?>" size="4"></label><br> <label><div class="l">Charset:</div><select name="v[chset]"><option value="">- default -</option><?php echo chset_select($DB['chset'])?></select></label><br> <br><label for ="rmb"><input type="checkbox" name="rmb" id="rmb" value="1" checked> Remember in cookies for 30 days or until Logoff</label> </div> <center> <input type="hidden" name="savecfg" value="1"> <input type="submit" value=" Apply "><input type="button" value=" Cancel " onclick="window.location='<?php eo($self)?>'"> </center> </div> </center> <?php print_footer(); } //* utilities function db_connect($nodie=0){ global $dbh,$DB,$err_msg; if ($DB['port']) { $dbh=mysqli_connect($DB['host'],$DB['user'],$DB['pwd'],'',(int)$DB['port']); } else { $dbh=mysqli_connect($DB['host'],$DB['user'],$DB['pwd']); } if (!$dbh) { $err_msg='Cannot connect to the database because: '.mysqli_connect_error(); if (!$nodie) die($err_msg); } if ($dbh && $DB['db']) { $res=mysqli_select_db($dbh, $DB['db']); if (!$res) { $err_msg='Cannot select db because: '.mysqli_error($dbh); if (!$nodie) die($err_msg); }else{ if ($DB['chset']) db_query("SET NAMES ".$DB['chset']); } } return $dbh; } function db_checkconnect($dbh1=NULL, $skiperr=0){ global $dbh; if (!$dbh1) $dbh1=&$dbh; if (!$dbh1 or !mysqli_ping($dbh1)) { db_connect($skiperr); $dbh1=&$dbh; } return $dbh1; } function db_disconnect(){ global $dbh; mysqli_close($dbh); } function dbq($s){ global $dbh; if (is_null($s)) return "NULL"; return "'".mysqli_real_escape_string($dbh,$s)."'"; } function db_query($sql, $dbh1=NULL, $skiperr=0){ $dbh1=db_checkconnect($dbh1, $skiperr); $sth=mysqli_query($dbh1, $sql); if (!$sth && $skiperr) return; if (!$sth) die("Error in DB operation:<br>\n".mysqli_error($dbh1)."<br>\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.="<option value='$b' ".($sel && $sel==$b?'selected':'').">$b</option>"; } 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.="<a href='$pname'>$w[0]</a>"; $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.="<b>$first_s..$last_s</b>"; }else{ $res.="<a href='$pname'>$first_s..$last_s</a>"; } if($p_p+1<$allp) $res.=$sep; } if($sp+5<$allp){ $pname=pen($sp+5,$ptpl); $res.="<a href='$pname'>$w[1]</a>"; } $res.=" <br>\n"; if($pg>0){ $pname=pen($pg-1,$ptpl); $res.="<a href='$pname'>$w[2]</a> $n|$n "; $pname=pen(0,$ptpl); $res.="<a href='$pname'>$w[4]</a>"; } if($pg>0 && $pg+1<$allp) $res.=$sep; if($pg+1<$allp){ $pname=pen($pg+1,$ptpl); $res.="<a href='$pname'>$w[3]</a>"; } if ($show_all) $res.=" <b>($w[5] - $all)</b> "; 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(); ?> <center> <h3>Export <?php eo($l)?></h3> <div class="frm"> <input type="checkbox" name="s" value="1" checked> Structure<br> <input type="checkbox" name="d" value="1" checked> Data<br><br> <div><label><input type="radio" name="et" value="" checked> .sql</label> </div> <div> <?php if ($t && !strpos($t,',')){?> <label><input type="radio" name="et" value="csv"> .csv (Excel style, data only and for one table only)</label> <?php }else{?> <label> ( ) .csv</label> <small>(to export as csv - go to 'show tables' and export just ONE table)</small> <?php }?> </div> <br> <div><label><input type="checkbox" name="sp" value="1"> import has super privileges</label></div> <div><label><input type="checkbox" name="gz" value="1"> compress as .gz</label></div> <br> <input type="hidden" name="doex" value="1"> <input type="hidden" name="rt" value="<?php eo($t)?>"> <input type="submit" value=" Download "> <input type="submit" name="srv" value=" Dump on Server "> <input type="button" value=" Cancel " onclick="window.location='<?php eo($self.'?'.$xurl.'&db='.$DB['db'])?>'"> <p><small>"Dump on Server" exports to file:<br><?php eo(export_fname($DUMP_FILE).'.sql')?></small></p> </div> </center> <?php print_footer(); exit; } function export_fname($f,$ist=false){ $t=$ist?date('Y-m-d-His'):'YYYY-MM-DD-HHMMSS'; return $f.$t; } function do_export(){ global $DB,$VERSION,$D,$BOM,$ex_isgz,$ex_issrv,$dbh,$out_message; $rt=str_replace('`','',$_REQUEST['rt']); $t=explode(",",$rt); $th=array_flip($t); $ct=count($t); $z=db_row("show variables like 'max_allowed_packet'"); $MAXI=floor($z['Value']*0.8); if(!$MAXI)$MAXI=838860; $aext='';$ctp=''; $ex_super=($_REQUEST['sp'])?1:0; $ex_isgz=($_REQUEST['gz'])?1:0; if ($ex_isgz) { $aext='.gz';$ctp='application/x-gzip'; } $ex_issrv=($_REQUEST['srv'])?1:0; if ($ct==1&&$_REQUEST['et']=='csv'){ ex_start('.csv'); ex_hdr($ctp?$ctp:'text/csv',"$t[0].csv$aext"); if ($DB['chset']=='utf8') ex_w($BOM); $sth=db_query("select * from `$t[0]`"); $fn=mysqli_field_count($dbh); for($i=0;$i<$fn;$i++){ $m=mysqli_fetch_field($sth); ex_w(qstr($m->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(); ?> <center> <h3>Import DB</h3> <div class="frm"> <div><label><input type="radio" name="it" value="" checked> import by uploading <b>.sql</b> or <b>.gz</b> file:</label> <input type="file" name="file1" value="" size=40><br> </div> <div><label><input type="radio" name="it" value="sql"> import from file on server:<br> <?php eo($DUMP_FILE.'.sql')?></label></div> <div><label><input type="radio" name="it" value="gz"> import from file on server:<br> <?php eo($DUMP_FILE.'.sql.gz')?></label></div> <input type="hidden" name="doim" value="1"> <input type="submit" value=" Import " onclick="return ays()"><input type="button" value=" Cancel " onclick="window.location='<?php eo($self.'?'.$xurl.'&db='.$DB['db'])?>'"> </div> <br><br><br> <!-- <h3>Import one Table from CSV</h3> <div class="frm"> .csv file (Excel style): <input type="file" name="file2" value="" size=40><br> <input type="checkbox" name="r1" value="1" checked> first row contain field names<br> <small>(note: for success, field names should be exactly the same as in DB)</small><br> Character set of the file: <select name="chset"><?php echo chset_select('utf8')?></select> <br><br> Import into:<br> <input type="radio" name="tt" value="1" checked="checked"> existing table: <select name="t"> <option value=''>- select -</option> <?php echo sel(db_array('show tables',NULL,0,1), 0, ''); ?> </select> <div style="margin-left:20px"> <input type="checkbox" name="ttr" value="1"> replace existing DB data<br> <input type="checkbox" name="tti" value="1"> ignore duplicate rows </div> <input type="radio" name="tt" value="2"> create new table with name <input type="text" name="tn" value="" size="20"> <br><br> <input type="hidden" name="doimcsv" value="1"> <input type="submit" value=" Upload and Import " onclick="return ays()"><input type="button" value=" Cancel " onclick="window.location='<?php eo($self)?>'"> </div> --> </center> <?php print_footer(); exit; } function do_import(){ global $err_msg,$out_message,$dbh,$SHOW_T,$DUMP_FILE; $err_msg=''; $it=$_REQUEST['it']; if (!$it){ $F=$_FILES['file1']; if ($F && $F['name']){ $filename=$F['tmp_name']; $pi=pathinfo($F['name']); $ext=$pi['extension']; } }else{ $ext=($it=='gz'?'sql.gz':'sql'); $filename=$DUMP_FILE.'.'.$ext; } if ($filename && file_exists($filename)){ if ($ext!='sql'){//if not sql - assume .gz and extract $tmpf=tmp_name(); if (($gz=gzopen($filename,'rb')) && ($tf=fopen($tmpf,'wb'))){ while(!gzeof($gz)){ if (fwrite($tf,gzread($gz,8192),8192)===FALSE){$err_msg='Error during gz file extraction to tmp file';break;} }//extract to tmp file gzclose($gz);fclose($tf);$filename=$tmpf; }else{$err_msg='Error opening gz file';} } if (!$err_msg){ if (!do_multi_sql('', $filename)){ $err_msg='Import Error: '.mysqli_error($dbh); }else{ $out_message='Import done successfully'; do_sql($SHOW_T); return; }} }else{ $err_msg="Error: Please select file first"; } print_import(); exit; } // multiple SQL statements splitter function do_multi_sql($insql,$fname=''){ @set_time_limit(600); $sql=''; $ochar=''; $is_cmt=''; $GLOBALS['insql_done']=0; while ($str=get_next_chunk($insql,$fname)){ $opos=-strlen($ochar); $cur_pos=0; $i=strlen($str); while ($i--){ if ($ochar){ list($clchar, $clpos)=get_close_char($str, $opos+strlen($ochar), $ochar); if ( $clchar ) { if ($ochar=='--' || $ochar=='#' || $is_cmt ){ $sql.=substr($str, $cur_pos, $opos-$cur_pos ); }else{ $sql.=substr($str, $cur_pos, $clpos+strlen($clchar)-$cur_pos ); } $cur_pos=$clpos+strlen($clchar); $ochar=''; $opos=0; }else{ $sql.=substr($str, $cur_pos); break; } }else{ list($ochar, $opos)=get_open_char($str, $cur_pos); if ($ochar==';'){ $sql.=substr($str, $cur_pos, $opos-$cur_pos+1); if (!do_one_sql($sql)) return 0; $sql=''; $cur_pos=$opos+strlen($ochar); $ochar=''; $opos=0; }elseif(!$ochar) { $sql.=substr($str, $cur_pos); break; }else{ $is_cmt=0;if ($ochar=='/*' && substr($str, $opos, 3)!='/*!') $is_cmt=1; } } } } if ($sql){ if (!do_one_sql($sql)) return 0; $sql=''; } return 1; } //read from insql var or file function get_next_chunk($insql, $fname){ global $LFILE, $insql_done; if ($insql) { if ($insql_done){ return ''; }else{ $insql_done=1; return $insql; } } if (!$fname) return ''; if (!$LFILE){ $LFILE=fopen($fname,"r+b") or die("Can't open [$fname] file $!"); } return fread($LFILE, 64*1024); } function get_open_char($str, $pos){ if ( preg_match("/(\/\*|^--|(?<=\s)--|#|'|\"|;)/", $str, $m, PREG_OFFSET_CAPTURE, $pos) ) { $ochar=$m[1][0]; $opos=$m[1][1]; } return array($ochar, $opos); } #RECURSIVE! function get_close_char($str, $pos, $ochar){ $aCLOSE=array( '\'' => '(?<!\\\\)\'|(\\\\+)\'', '"' => '(?<!\\\\)"', '/*' => '\*\/', '#' => '[\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))."<br>\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); } ?>