· 9 years ago · Nov 27, 2016, 08:54 PM
1<?php
2
3 $ACCESS_PWD='12345'; #!!!IMPORTANT!!! this is script access password, SET IT if you want to protect you DB from public access
4
5 #DEFAULT db connection settings
6 # --- WARNING! --- if you set defaults - it's recommended to set $ACCESS_PWD to protect your db!
7 $DBDEF=array(
8 'user'=>"",#required
9 'pwd'=>"", #required
10 'db'=>"", #optional, default DB
11 'host'=>"",#optional
12 'port'=>"",#optional
13 'chset'=>"utf8",#optional, default charset
14 );
15file_exists($f=dirname(__FILE__) . '/phpminiconfig.php')&&require($f); // Read from config (easier to update)
16if (function_exists('date_default_timezone_set')) date_default_timezone_set('UTC');#required by PHP 5.1+
17
18//constants
19 $VERSION='1.9.160630';
20 $MAX_ROWS_PER_PAGE=50; #max number of rows in select per one page
21 $D="\r\n"; #default delimiter for export
22 $BOM=chr(239).chr(187).chr(191);
23 $SHOW_D="SHOW DATABASES";
24 $SHOW_T="SHOW TABLE STATUS";
25 $DB=array(); #working copy for DB settings
26
27 $self=$_SERVER['PHP_SELF'];
28
29 session_set_cookie_params(0, null, null, false, true);
30 session_start();
31 if (!isset($_SESSION['XSS'])) $_SESSION['XSS']=get_rand_str(16);
32 $xurl='XSS='.$_SESSION['XSS'];
33
34 ini_set('display_errors',0); #turn on to debug db or script issues
35 error_reporting(E_ALL ^ E_NOTICE);
36
37//strip quotes if they set
38 if (get_magic_quotes_gpc()){
39 $_COOKIE=array_map('killmq',$_COOKIE);
40 $_REQUEST=array_map('killmq',$_REQUEST);
41 }
42
43 if ($_REQUEST['login']){
44 if ($_REQUEST['pwd']!=$ACCESS_PWD){
45 $err_msg="Invalid password. Try again";
46 }else{
47 $_SESSION['is_logged']=true;
48 loadcfg();
49 }
50 }
51
52 if ($_REQUEST['logoff']){
53 check_xss();
54 $_SESSION = array();
55 savecfg();
56 session_destroy();
57 $url=$self;
58 if (!$ACCESS_PWD) $url='/';
59 header("location: $url");
60 exit;
61 }
62
63 if (!$_SESSION['is_logged']){
64 if (!$ACCESS_PWD) {
65 $_SESSION['is_logged']=true;
66 loadcfg();
67 }else{
68 print_login();
69 exit;
70 }
71 }
72
73 if ($_REQUEST['savecfg']){
74 check_xss();
75 savecfg();
76 }
77
78 loadsess();
79
80 if ($_REQUEST['showcfg']){
81 print_cfg();
82 exit;
83 }
84
85 //get initial values
86 $SQLq=trim(base64_decode($_REQUEST['q']));
87 $page=$_REQUEST['p']+0;
88 if ($_REQUEST['refresh'] && $DB['db'] && preg_match('/^show/',$SQLq) ) $SQLq=$SHOW_T;
89
90 if (db_connect('nodie')){
91 $time_start=microtime_float();
92
93 if ($_REQUEST['phpinfo']){
94 ob_start();phpinfo();$sqldr='<div style="font-size:130%">'.ob_get_clean().'</div>';
95 }else{
96 if ($DB['db']){
97 if ($_REQUEST['shex']){
98 print_export();
99 }elseif ($_REQUEST['doex']){
100 check_xss();do_export();
101 }elseif ($_REQUEST['shim']){
102 print_import();
103 }elseif ($_REQUEST['doim']){
104 check_xss();do_import();
105 }elseif ($_REQUEST['dosht']){
106 check_xss();do_sht();
107 }elseif (!$_REQUEST['refresh'] || preg_match('/^select|show|explain|desc/i',$SQLq) ){
108 if ($SQLq)check_xss();
109 do_sql($SQLq);#perform non-select SQL only if not refresh (to avoid dangerous delete/drop)
110 }
111 }else{
112 if ( $_REQUEST['refresh'] ){
113 check_xss();do_sql($SHOW_D);
114 }elseif ($_REQUEST['crdb']){
115 check_xss();do_sql('CREATE DATABASE `'.$_REQUEST['new_db'].'`');do_sql($SHOW_D);
116 }elseif ( preg_match('/^(?:show\s+(?:databases|status|variables|process)|create\s+database|grant\s+)/i',$SQLq) ){
117 check_xss();do_sql($SQLq);
118 }else{
119 $err_msg="Select Database first";
120 if (!$SQLq) do_sql($SHOW_D);
121 }
122 }
123 }
124 $time_all=ceil((microtime_float()-$time_start)*10000)/10000;
125
126 print_screen();
127 }else{
128 print_cfg();
129 }
130
131function do_sql($q){
132 global $dbh,$last_sth,$last_sql,$reccount,$out_message,$SQLq,$SHOW_T;
133 $SQLq=$q;
134
135 if (!do_multi_sql($q)){
136 $out_message="Error: ".mysqli_error($dbh);
137 }else{
138 if ($last_sth && $last_sql){
139 $SQLq=$last_sql;
140 if (preg_match("/^select|show|explain|desc/i",$last_sql)) {
141 if ($q!=$last_sql) $out_message="Results of the last select displayed:";
142 display_select($last_sth,$last_sql);
143 } else {
144 $reccount=mysqli_affected_rows($dbh);
145 $out_message="Done.";
146 if (preg_match("/^insert|replace/i",$last_sql)) $out_message.=" Last inserted id=".get_identity();
147 if (preg_match("/^drop|truncate/i",$last_sql)) do_sql($SHOW_T);
148 }
149 }
150 }
151}
152
153function display_select($sth,$q){
154 global $dbh,$DB,$sqldr,$reccount,$is_sht,$xurl;
155 $rc=array("o","e");
156 $dbn=$DB['db'];
157 $sqldr='';
158
159 $is_shd=(preg_match('/^show\s+databases/i',$q));
160 $is_sht=(preg_match('/^show\s+tables|^SHOW\s+TABLE\s+STATUS/',$q));
161 $is_show_crt=(preg_match('/^show\s+create\s+table/i',$q));
162
163 if ($sth===FALSE or $sth===TRUE) return;#check if $sth is not a mysql resource
164
165 $reccount=mysqli_num_rows($sth);
166 $fields_num=mysqli_field_count($dbh);
167
168 $w='';
169 if ($is_sht || $is_shd) {$w='wa';
170 $url='?'.$xurl."&db=$dbn";
171 $sqldr.="<div class='dot'>
172 MySQL Server:
173 ·<a href='$url&q=".b64e("show variables")."'>Show Configuration Variables</a>
174 ·<a href='$url&q=".b64e("show status")."'>Show Statistics</a>
175 ·<a href='$url&q=".b64e("show processlist")."'>Show Processlist</a>";
176 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'>";
177 $sqldr.="<br>";
178 if ($is_sht) $sqldr.=" Database: ·<a href='$url&q=".b64e("show table status")."'>Show Table Status</a>";
179 $sqldr.="</div>";
180 }
181 if ($is_sht){
182 $abtn=" <input type='submit' value='Export' onclick=\"sht('exp')\">
183 <input type='submit' value='Drop' onclick=\"if(ays()){sht('drop')}else{return false}\">
184 <input type='submit' value='Truncate' onclick=\"if(ays()){sht('trunc')}else{return false}\">
185 <input type='submit' value='Optimize' onclick=\"sht('opt')\">
186 <b>selected tables</b>";
187 $sqldr.=$abtn."<input type='hidden' name='dosht' value=''>";
188 }
189
190 $sqldr.="<table class='res $w'>";
191 $headers="<tr class='h'>";
192 if ($is_sht) $headers.="<td><input type='checkbox' name='cball' value='' onclick='chkall(this)'></td>";
193 for($i=0;$i<$fields_num;$i++){
194 if ($is_sht && $i>0) break;
195 $meta=mysqli_fetch_field($sth);
196 $headers.="<th>".$meta->name."</th>";
197 }
198 if ($is_shd) $headers.="<th>show create database</th><th>show table status</th><th>show triggers</th>";
199 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>";
200 $headers.="</tr>\n";
201 $sqldr.=$headers;
202 $swapper=false;
203 while($row=mysqli_fetch_row($sth)){
204 $sqldr.="<tr class='".$rc[$swp=!$swp]."' onclick='tc(this)'>";
205 $v=$row[0];
206 if ($is_sht){
207 $vq='`'.$v.'`';
208 $url='?'.$xurl."&db=$dbn";
209 $v="<input type='checkbox' name='cb[]' value=\"$vq\"></td>"
210 ."<td><a href=\"$url&q=".b64e("select * from $vq")."\">$v</a></td>"
211 ."<td>".$row[1]."</td>"
212 ."<td align='right'>".$row[4]."</td>"
213 ."<td align='right'>".$row[6]."</td>"
214 ."<td align='right'>".$row[8]."</td>"
215 ."<td>·<a href=\"$url&q=".b64e("show create table $vq")."\">sct</a></td>"
216 ."<td>·<a href=\"$url&q=".b64e("explain $vq")."\">exp</a></td>"
217 ."<td>·<a href=\"$url&q=".b64e("show index from $vq")."\">ind</a></td>"
218 ."<td>·<a href=\"$url&shex=1&t=$vq\">export</a></td>"
219 ."<td>·<a href=\"$url&q=".b64e("drop table $vq")."\" onclick='return ays()'>dr</a></td>"
220 ."<td>·<a href=\"$url&q=".b64e("truncate table $vq")."\" onclick='return ays()'>tr</a></td>"
221 ."<td>·<a href=\"$url&q=".b64e("optimize table $vq")."\" onclick='return ays()'>opt</a></td>"
222 ."<td>·<a href=\"$url&q=".b64e("repair table $vq")."\" onclick='return ays()'>rpr</a></td>"
223 ."<td>".hs($row[$fields_num-1]);
224 $sqldr.="<td>$v</td>";
225 }elseif ($is_shd){
226 $url='?'.$xurl."&db=$v";
227 $v="<a href=\"$url&q=".b64e("SHOW TABLE STATUS")."\">$v</a></td>"
228 ."<td><a href=\"$url&q=".b64e("show create database `$v`")."\">scd</a></td>"
229 ."<td><a href=\"$url&q=".b64e("show table status")."\">status</a></td>"
230 ."<td><a href=\"$url&q=".b64e("show triggers")."\">trig</a>";
231 $sqldr.="<td>$v</td>";
232 }else{
233 for($i=0;$i<$fields_num;$i++){
234 $v=$row[$i];
235 if (is_null($v)) $v="NULL";
236 elseif (preg_match('/[\x00-\x09\x0B\x0C\x0E-\x1F]+/',$v)) { #all chars <32, except \n\r(0D0A)
237 $vl=strlen($v);$pf='';
238 if ($vl>16 && $fields_num>1){#show full dump if just one field
239 $v=substr($v, 0, 16);$pf='...';
240 }
241 $v='BINARY: '.chunk_split(strtoupper(bin2hex($v)),2,' ').$pf;
242 }else $v=hs($v);
243 if ($is_show_crt) $v="<pre>$v</pre>";
244 $sqldr.="<td>$v".(!strlen($v)?"<br>":'')."</td>";
245 }
246 }
247 $sqldr.="</tr>\n";
248 }
249 $sqldr.="</table>\n".$abtn;
250}
251
252function print_header(){
253 global $err_msg,$VERSION,$DB,$dbh,$self,$is_sht,$xurl,$SHOW_T;
254 $dbn=$DB['db'];
255?>
256<!DOCTYPE html>
257<html>
258<head><title>phpMiniAdmin</title>
259<meta charset="utf-8">
260<style type="text/css">
261body{font-family:Arial,sans-serif;font-size:80%;padding:0;margin:0}
262th,td{padding:0;margin:0}
263div{padding:3px}
264pre{font-size:125%}
265.nav{text-align:center}
266.ft{text-align:right;margin-top:20px;font-size:smaller}
267.inv{background-color:#069;color:#FFF}
268.inv a{color:#FFF}
269table.res{width:100%;border-collapse:collapse;}
270table.wa{width:auto}
271table.res th,table.res td{padding:2px;border:1px solid #fff;vertical-align: top}
272table.restr{vertical-align:top}
273tr.e{background-color:#CCC}
274tr.o{background-color:#EEE}
275tr.e:hover, tr.o:hover {background-color:#FF9}
276tr.h{background-color:#99C}
277tr.s{background-color:#FF9}
278.err{color:#F33;font-weight:bold;text-align:center}
279.frm{width:400px;border:1px solid #999;background-color:#eee;text-align:left}
280.frm label .l{width:100px;float:left}
281.dot{border-bottom:1px dotted #000}
282.ajax{text-decoration: none;border-bottom: 1px dashed;}
283.qnav{width:30px}
284</style>
285
286<script type="text/javascript">
287var LSK='pma_',LSKX=LSK+'max',LSKM=LSK+'min',qcur=0,LSMAX=32;
288
289function $(i){return document.getElementById(i)}
290function frefresh(){
291 var F=document.DF;
292 F.method='get';
293 F.refresh.value="1";
294 F.GoSQL.click();
295}
296function go(p,sql){
297 var F=document.DF;
298 F.p.value=p;
299 if(sql)F.q.value=sql;
300 F.GoSQL.click();
301}
302function ays(){
303 return confirm('Are you sure to continue?');
304}
305function chksql(){
306 var F=document.DF,v=F.qraw.value;
307 if(/^\s*(?:delete|drop|truncate|alter)/.test(v)) if(!ays())return false;
308 if(lschk(1)){
309 var lsm=lsmax()+1,ls=localStorage;
310 ls[LSK+lsm]=v;
311 ls[LSKX]=lsm;
312 //keep just last LSMAX queries in log
313 if(!ls[LSKM])ls[LSKM]=1;
314 var lsmin=parseInt(ls[LSKM]);
315 if((lsm-lsmin+1)>LSMAX){
316 lsclean(lsmin,lsm-LSMAX);
317 }
318 }
319 return true;
320}
321function tc(tr){
322 if (tr.className=='s'){
323 tr.className=tr.classNameX;
324 }else{
325 tr.classNameX=tr.className;
326 tr.className='s';
327 }
328}
329function lschk(skip){
330 if (!localStorage || !skip && !localStorage[LSKX]) return false;
331 return true;
332}
333function lsmax(){
334 var ls=localStorage;
335 if(!lschk() || !ls[LSKX])return 0;
336 return parseInt(ls[LSKX]);
337}
338function lsclean(from,to){
339 ls=localStorage;
340 for(var i=from;i<=to;i++){
341 delete ls[LSK+i];ls[LSKM]=i+1;
342 }
343}
344function q_prev(){
345 var ls=localStorage;
346 if(!lschk())return;
347 qcur--;
348 var x=parseInt(ls[LSKM]);
349 if(qcur<x)qcur=x;
350 $('qraw').value=ls[LSK+qcur];
351}
352function q_next(){
353 var ls=localStorage;
354 if(!lschk())return;
355 qcur++;
356 var x=parseInt(ls[LSKX]);
357 if(qcur>x)qcur=x;
358 $('qraw').value=ls[LSK+qcur];
359}
360function after_load(){
361 var F=document.DF;
362 var p=F['v[pwd]'];
363 if (p) p.focus();
364 qcur=lsmax();
365
366 F.addEventListener('submit',function(e){
367 if(!F.qraw)return;
368 if(!chksql()){e.preventDefault();return}
369 $('q').value=btoa(encodeURIComponent($('qraw').value).replace(/%([0-9A-F]{2})/g,function(m,p){return String.fromCharCode('0x'+p)}));
370 });
371}
372function logoff(){
373 if(lschk()){
374 var ls=localStorage;
375 var from=parseInt(ls[LSKM]),to=parseInt(ls[LSKX]);
376 for(var i=from;i<=to;i++){
377 delete ls[LSK+i];
378 }
379 delete ls[LSKM];delete ls[LSKX];
380 }
381}
382function cfg_toggle(){
383 var e=$('cfg-adv');
384 e.style.display=e.style.display=='none'?'':'none';
385}
386<?php if($is_sht){?>
387function chkall(cab){
388 var e=document.DF.elements;
389 if (e!=null){
390 var cl=e.length;
391 for (i=0;i<cl;i++){var m=e[i];if(m.checked!=null && m.type=="checkbox"){m.checked=cab.checked}}
392 }
393}
394function sht(f){
395 document.DF.dosht.value=f;
396}
397<?php }?>
398</script>
399
400</head>
401<body onload="after_load()">
402<form method="post" name="DF" id="DF" action="<?php eo($self)?>" enctype="multipart/form-data">
403<input type="hidden" name="XSS" value="<?php eo($_SESSION['XSS'])?>">
404<input type="hidden" name="refresh" value="">
405<input type="hidden" name="p" value="">
406
407<div class="inv">
408<a href="http://phpminiadmin.sourceforge.net/" target="_blank"><b>phpMiniAdmin <?php eo($VERSION)?></b></a>
409<?php if ($_SESSION['is_logged'] && $dbh){ ?>
410 | <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>
411<?php echo get_db_select($dbn)?></select>
412<?php if($dbn){ $z=" · <a href='".hs($self."?$xurl&db=$dbn"); ?>
413<?php echo $z.'&q='.b64e($SHOW_T)?>'>show tables</a>
414<?php echo $z?>&shex=1'>export</a>
415<?php echo $z?>&shim=1'>import</a>
416<?php } ?>
417 | <a href="?showcfg=1">Settings</a>
418<?php } ?>
419<?php if ($_SESSION['is_logged']){?> | <a href="?<?php eo($xurl)?>&logoff=1" onclick="logoff()">Logoff</a> <?php }?>
420 | <a href="?phpinfo=1">phpinfo</a>
421</div>
422
423<div class="err"><?php eo($err_msg)?></div>
424
425<?php
426}
427
428function print_screen(){
429 global $out_message, $SQLq, $err_msg, $reccount, $time_all, $sqldr, $page, $MAX_ROWS_PER_PAGE, $is_limited_sql, $last_count;
430
431 $nav='';
432 if ($is_limited_sql && ($page || $reccount>=$MAX_ROWS_PER_PAGE) ){
433 $nav="<div class='nav'>".get_nav($page, 10000, $MAX_ROWS_PER_PAGE, "javascript:go(%p%)")."</div>";
434 }
435
436 print_header();
437?>
438
439<div class="dot" style="padding:0 0 5px 20px">
440<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>
441<textarea id="qraw" cols="70" rows="10" style="width:98%"><?php eo($SQLq)?></textarea><br>
442<input type="hidden" name="q" id="q" value="<?php b64e($SQLq);?>">
443<input type="submit" name="GoSQL" value="Go" style="width:100px">
444<input type="button" name="Clear" value=" Clear " onclick="$('qraw').value='';" style="width:100px">
445</div>
446<div class="dot" style="padding:5px 0 5px 20px">
447Records: <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>
448<b><?php eo($out_message)?></b>
449</div>
450<div class="sqldr">
451<?php echo $nav.$sqldr.$nav; ?>
452</div>
453<?php
454 print_footer();
455}
456
457function print_footer(){
458?>
459</form>
460<div class="ft">© 2004-2016 <a href="http://osalabs.com" target="_blank">Oleg Savchuk</a></div>
461</body></html>
462<?php
463}
464
465function print_login(){
466 print_header();
467?>
468<center>
469<h3>Access protected by password</h3>
470<div style="width:400px;border:1px solid #999999;background-color:#eeeeee">
471<label>Password: <input type="password" name="pwd" value=""></label>
472<input type="hidden" name="login" value="1">
473<input type="submit" value=" Login ">
474</div>
475</center>
476<?php
477 print_footer();
478}
479
480
481function print_cfg(){
482 global $DB,$err_msg,$self;
483 print_header();
484?>
485<center>
486<h3>DB Connection Settings</h3>
487<div class="frm">
488<label><div class="l">DB user name:</div><input type="text" name="v[user]" value="<?php eo($DB['user'])?>"></label><br>
489<label><div class="l">Password:</div><input type="password" name="v[pwd]" value=""></label><br>
490<div style="text-align:right"><a href="#" class="ajax" onclick="cfg_toggle()">advanced settings</a></div>
491<div id="cfg-adv" style="display:none;">
492<label><div class="l">DB name:</div><input type="text" name="v[db]" value="<?php eo($DB['db'])?>"></label><br>
493<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>
494<label><div class="l">Charset:</div><select name="v[chset]"><option value="">- default -</option><?php echo chset_select($DB['chset'])?></select></label><br>
495<br><label for ="rmb"><input type="checkbox" name="rmb" id="rmb" value="1" checked> Remember in cookies for 30 days or until Logoff</label>
496</div>
497<center>
498<input type="hidden" name="savecfg" value="1">
499<input type="submit" value=" Apply "><input type="button" value=" Cancel " onclick="window.location='<?php eo($self)?>'">
500</center>
501</div>
502</center>
503<?php
504 print_footer();
505}
506
507
508//* utilities
509function db_connect($nodie=0){
510 global $dbh,$DB,$err_msg;
511
512 if ($DB['port']) {
513 $dbh=mysqli_connect($DB['host'],$DB['user'],$DB['pwd'],'',(int)$DB['port']);
514 } else {
515 $dbh=mysqli_connect($DB['host'],$DB['user'],$DB['pwd']);
516 }
517 if (!$dbh) {
518 $err_msg='Cannot connect to the database because: '.mysqli_connect_error();
519 if (!$nodie) die($err_msg);
520 }
521
522 if ($dbh && $DB['db']) {
523 $res=mysqli_select_db($dbh, $DB['db']);
524 if (!$res) {
525 $err_msg='Cannot select db because: '.mysqli_error($dbh);
526 if (!$nodie) die($err_msg);
527 }else{
528 if ($DB['chset']) db_query("SET NAMES ".$DB['chset']);
529 }
530 }
531
532 return $dbh;
533}
534
535function db_checkconnect($dbh1=NULL, $skiperr=0){
536 global $dbh;
537 if (!$dbh1) $dbh1=&$dbh;
538 if (!$dbh1 or !mysqli_ping($dbh1)) {
539 db_connect($skiperr);
540 $dbh1=&$dbh;
541 }
542 return $dbh1;
543}
544
545function db_disconnect(){
546 global $dbh;
547 mysqli_close($dbh);
548}
549
550function dbq($s){
551 global $dbh;
552 if (is_null($s)) return "NULL";
553 return "'".mysqli_real_escape_string($dbh,$s)."'";
554}
555
556function db_query($sql, $dbh1=NULL, $skiperr=0){
557 $dbh1=db_checkconnect($dbh1, $skiperr);
558 $sth=mysqli_query($dbh1, $sql);
559 if (!$sth && $skiperr) return;
560 if (!$sth) die("Error in DB operation:<br>\n".mysqli_error($dbh1)."<br>\n$sql");
561 return $sth;
562}
563
564function db_array($sql, $dbh1=NULL, $skiperr=0, $isnum=0){#array of rows
565 $sth=db_query($sql, $dbh1, $skiperr);
566 if (!$sth) return;
567 $res=array();
568 if ($isnum){
569 while($row=mysqli_fetch_row($sth)) $res[]=$row;
570 }else{
571 while($row=mysqli_fetch_assoc($sth)) $res[]=$row;
572 }
573 return $res;
574}
575
576function db_row($sql){
577 $sth=db_query($sql);
578 return mysqli_fetch_assoc($sth);
579}
580
581function db_value($sql,$dbh1=NULL,$skiperr=0){
582 $sth=db_query($sql,$dbh1,$skiperr);
583 if (!$sth) return;
584 $row=mysqli_fetch_row($sth);
585 return $row[0];
586}
587
588function get_identity($dbh1=NULL){
589 $dbh1=db_checkconnect($dbh1);
590 return mysqli_insert_id($dbh1);
591}
592
593function get_db_select($sel=''){
594 global $DB,$SHOW_D;
595 if (is_array($_SESSION['sql_sd']) && $_REQUEST['db']!='*'){//check cache
596 $arr=$_SESSION['sql_sd'];
597 }else{
598 $arr=db_array($SHOW_D,NULL,1);
599 if (!is_array($arr)){
600 $arr=array( 0 => array('Database' => $DB['db']) );
601 }
602 $_SESSION['sql_sd']=$arr;
603 }
604 return @sel($arr,'Database',$sel);
605}
606
607function chset_select($sel=''){
608 global $DBDEF;
609 $result='';
610 if ($_SESSION['sql_chset']){
611 $arr=$_SESSION['sql_chset'];
612 }else{
613 $arr=db_array("show character set",NULL,1);
614 if (!is_array($arr)) $arr=array(array('Charset'=>$DBDEF['chset']));
615 $_SESSION['sql_chset']=$arr;
616 }
617
618 return @sel($arr,'Charset',$sel);
619}
620
621function sel($arr,$n,$sel=''){
622 foreach($arr as $a){
623# echo $a[0];
624 $b=$a[$n];
625 $res.="<option value='$b' ".($sel && $sel==$b?'selected':'').">$b</option>";
626 }
627 return $res;
628}
629
630function microtime_float(){
631 list($usec,$sec)=explode(" ",microtime());
632 return ((float)$usec+(float)$sec);
633}
634
635/* page nav
636 $pg=int($_[0]); #current page
637 $all=int($_[1]); #total number of items
638 $PP=$_[2]; #number if items Per Page
639 $ptpl=$_[3]; #page url /ukr/dollar/notes.php?page= for notes.php
640 $show_all=$_[5]; #print Totals?
641*/
642function get_nav($pg, $all, $PP, $ptpl, $show_all=''){
643 $n=' ';
644 $sep=" $n|$n\n";
645 if (!$PP) $PP=10;
646 $allp=floor($all/$PP+0.999999);
647
648 $pname='';
649 $res='';
650 $w=array('Less','More','Back','Next','First','Total');
651
652 $sp=$pg-2;
653 if($sp<0) $sp=0;
654 if($allp-$sp<5 && $allp>=5) $sp=$allp-5;
655
656 $res="";
657
658 if($sp>0){
659 $pname=pen($sp-1,$ptpl);
660 $res.="<a href='$pname'>$w[0]</a>";
661 $res.=$sep;
662 }
663 for($p_p=$sp;$p_p<$allp && $p_p<$sp+5;$p_p++){
664 $first_s=$p_p*$PP+1;
665 $last_s=($p_p+1)*$PP;
666 $pname=pen($p_p,$ptpl);
667 if($last_s>$all){
668 $last_s=$all;
669 }
670 if($p_p==$pg){
671 $res.="<b>$first_s..$last_s</b>";
672 }else{
673 $res.="<a href='$pname'>$first_s..$last_s</a>";
674 }
675 if($p_p+1<$allp) $res.=$sep;
676 }
677 if($sp+5<$allp){
678 $pname=pen($sp+5,$ptpl);
679 $res.="<a href='$pname'>$w[1]</a>";
680 }
681 $res.=" <br>\n";
682
683 if($pg>0){
684 $pname=pen($pg-1,$ptpl);
685 $res.="<a href='$pname'>$w[2]</a> $n|$n ";
686 $pname=pen(0,$ptpl);
687 $res.="<a href='$pname'>$w[4]</a>";
688 }
689 if($pg>0 && $pg+1<$allp) $res.=$sep;
690 if($pg+1<$allp){
691 $pname=pen($pg+1,$ptpl);
692 $res.="<a href='$pname'>$w[3]</a>";
693 }
694 if ($show_all) $res.=" <b>($w[5] - $all)</b> ";
695
696 return $res;
697}
698
699function pen($p,$np=''){
700 return str_replace('%p%',$p, $np);
701}
702
703function killmq($value){
704 return is_array($value)?array_map('killmq',$value):stripslashes($value);
705}
706
707function savecfg(){
708 $v=$_REQUEST['v'];
709 $_SESSION['DB']=$v;
710 unset($_SESSION['sql_sd']);
711
712 if ($_REQUEST['rmb']){
713 $tm=time()+60*60*24*30;
714 newcookie("conn[db]", $v['db'],$tm);
715 newcookie("conn[user]",$v['user'],$tm);
716 newcookie("conn[pwd]", $v['pwd'],$tm);
717 newcookie("conn[host]",$v['host'],$tm);
718 newcookie("conn[port]",$v['port'],$tm);
719 newcookie("conn[chset]",$v['chset'],$tm);
720 }else{
721 newcookie("conn[db]", FALSE,-1);
722 newcookie("conn[user]",FALSE,-1);
723 newcookie("conn[pwd]", FALSE,-1);
724 newcookie("conn[host]",FALSE,-1);
725 newcookie("conn[port]",FALSE,-1);
726 newcookie("conn[chset]",FALSE,-1);
727 }
728}
729
730// Allow httponly cookies, or the password is stored plain text in a cookie
731function newcookie($n,$v,$e){$x;return setcookie($n,$v,$e,$x,$x,!!$x,!$x);}
732
733//during login only - from cookies or use defaults;
734function loadcfg(){
735 global $DBDEF;
736
737 if( isset($_COOKIE['conn']) ){
738 $_SESSION['DB']=$_COOKIE['conn'];
739 }else{
740 $_SESSION['DB']=$DBDEF;
741 }
742 if (!strlen($_SESSION['DB']['chset'])) $_SESSION['DB']['chset']=$DBDEF['chset'];#don't allow empty charset
743}
744
745//each time - from session to $DB_*
746function loadsess(){
747 global $DB;
748
749 $DB=$_SESSION['DB'];
750
751 $rdb=$_REQUEST['db'];
752 if ($rdb=='*') $rdb='';
753 if ($rdb) {
754 $DB['db']=$rdb;
755 }
756}
757
758function print_export(){
759 global $self,$xurl,$DB;
760 $t=$_REQUEST['t'];
761 $l=($t)?"Table $t":"whole DB";
762 print_header();
763?>
764<center>
765<h3>Export <?php eo($l)?></h3>
766<div class="frm">
767<input type="checkbox" name="s" value="1" checked> Structure<br>
768<input type="checkbox" name="d" value="1" checked> Data<br><br>
769<div><label><input type="radio" name="et" value="" checked> .sql</label> </div>
770<div>
771<?php if ($t && !strpos($t,',')){?>
772 <label><input type="radio" name="et" value="csv"> .csv (Excel style, data only and for one table only)</label>
773<?php }else{?>
774<label> ( ) .csv</label> <small>(to export as csv - go to 'show tables' and export just ONE table)</small>
775<?php }?>
776</div>
777<br>
778<div><label><input type="checkbox" name="sp" value="1"> import has super privileges</label></div>
779<div><label><input type="checkbox" name="gz" value="1"> compress as .gz</label></div>
780<br>
781<input type="hidden" name="doex" value="1">
782<input type="hidden" name="t" value="<?php eo($t)?>">
783<input type="submit" value=" Download "><input type="button" value=" Cancel " onclick="window.location='<?php eo($self.'?'.$xurl.'&db='.$DB['db'])?>'">
784</div>
785</center>
786<?php
787 print_footer();
788 exit;
789}
790
791function do_export(){
792 global $DB,$VERSION,$D,$BOM,$ex_isgz,$dbh;
793 $rt=str_replace('`','',$_REQUEST['t']);
794 $t=explode(",",$rt);
795 $th=array_flip($t);
796 $ct=count($t);
797 $z=db_row("show variables like 'max_allowed_packet'");
798 $MAXI=floor($z['Value']*0.8);
799 if(!$MAXI)$MAXI=838860;
800 $aext='';$ctp='';
801
802 $ex_super=($_REQUEST['sp'])?1:0;
803 $ex_isgz=($_REQUEST['gz'])?1:0;
804 if ($ex_isgz) {
805 $aext='.gz';$ctp='application/x-gzip';
806 }
807 ex_start();
808
809 if ($ct==1&&$_REQUEST['et']=='csv'){
810 ex_hdr($ctp?$ctp:'text/csv',"$t[0].csv$aext");
811 if ($DB['chset']=='utf8') ex_w($BOM);
812
813 $sth=db_query("select * from `$t[0]`");
814 $fn=mysqli_field_count($dbh);
815 for($i=0;$i<$fn;$i++){
816 $m=mysqli_fetch_field($sth);
817 ex_w(qstr($m->name).(($i<$fn-1)?",":""));
818 }
819 ex_w($D);
820 while($row=mysqli_fetch_row($sth)) ex_w(to_csv_row($row));
821 ex_end();
822 exit;
823 }
824
825 ex_hdr($ctp?$ctp:'text/plain',"$DB[db]".(($ct==1&&$t[0])?".$t[0]":(($ct>1)?'.'.$ct.'tables':'')).".sql$aext");
826 ex_w("-- phpMiniAdmin dump $VERSION$D-- Datetime: ".date('Y-m-d H:i:s')."$D-- Host: $DB[host]$D-- Database: $DB[db]$D$D");
827 ex_w("/*!40030 SET NAMES $DB[chset] */;$D");
828 $ex_super && ex_w("/*!40030 SET GLOBAL max_allowed_packet=16777216 */;$D$D");
829 ex_w("/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;$D$D");
830
831 $sth=db_query("show tables from `$DB[db]`");
832 while($row=mysqli_fetch_row($sth)){
833 if (!$rt||array_key_exists($row[0],$th)) do_export_table($row[0],1,$MAXI);
834 }
835
836 ex_w("/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;$D$D");
837 ex_w("$D-- phpMiniAdmin dump end$D");
838 ex_end();
839 exit;
840}
841
842function do_export_table($t='',$isvar=0,$MAXI=838860){
843 global $D;
844 @set_time_limit(600);
845
846 if($_REQUEST['s']){
847 $sth=db_query("show create table `$t`");
848 $row=mysqli_fetch_row($sth);
849 $ct=preg_replace("/\n\r|\r\n|\n|\r/",$D,$row[1]);
850 ex_w("DROP TABLE IF EXISTS `$t`;$D$ct;$D$D");
851 }
852
853 if ($_REQUEST['d']){
854 $exsql='';
855 ex_w("/*!40000 ALTER TABLE `$t` DISABLE KEYS */;$D");
856 $sth=db_query("select * from `$t`");
857 while($row=mysqli_fetch_row($sth)){
858 $values='';
859 foreach($row as $v) $values.=(($values)?',':'').dbq($v);
860 $exsql.=(($exsql)?',':'')."(".$values.")";
861 if (strlen($exsql)>$MAXI) {
862 ex_w("INSERT INTO `$t` VALUES $exsql;$D");$exsql='';
863 }
864 }
865 if ($exsql) ex_w("INSERT INTO `$t` VALUES $exsql;$D");
866 ex_w("/*!40000 ALTER TABLE `$t` ENABLE KEYS */;$D$D");
867 }
868 flush();
869}
870
871function ex_hdr($ct,$fn){
872 header("Content-type: $ct");
873 header("Content-Disposition: attachment; filename=\"$fn\"");
874}
875function ex_start(){
876 global $ex_isgz,$ex_gz,$ex_tmpf;
877 if ($ex_isgz){
878 $ex_tmpf=tmp_name().'.gz';
879 if (!($ex_gz=gzopen($ex_tmpf,'wb9'))) die("Error trying to create gz tmp file");
880 }
881}
882function ex_w($s){
883 global $ex_isgz,$ex_gz;
884 if ($ex_isgz){
885 gzwrite($ex_gz,$s,strlen($s));
886 }else{
887 echo $s;
888 }
889}
890function ex_end(){
891 global $ex_isgz,$ex_gz,$ex_tmpf;
892 if ($ex_isgz){
893 gzclose($ex_gz);
894 readfile($ex_tmpf);
895 unlink($ex_tmpf);
896 }
897}
898
899function print_import(){
900 global $self,$xurl,$DB;
901 print_header();
902?>
903<center>
904<h3>Import DB</h3>
905<div class="frm">
906<b>.sql</b> or <b>.gz</b> file: <input type="file" name="file1" value="" size=40><br>
907<input type="hidden" name="doim" value="1">
908<input type="submit" value=" Upload and Import " onclick="return ays()"><input type="button" value=" Cancel " onclick="window.location='<?php eo($self.'?'.$xurl.'&db='.$DB['db'])?>'">
909</div>
910<br><br><br>
911<!--
912<h3>Import one Table from CSV</h3>
913<div class="frm">
914.csv file (Excel style): <input type="file" name="file2" value="" size=40><br>
915<input type="checkbox" name="r1" value="1" checked> first row contain field names<br>
916<small>(note: for success, field names should be exactly the same as in DB)</small><br>
917Character set of the file: <select name="chset"><?php echo chset_select('utf8')?></select>
918<br><br>
919Import into:<br>
920<input type="radio" name="tt" value="1" checked="checked"> existing table:
921 <select name="t">
922 <option value=''>- select -</option>
923 <?php echo sel(db_array('show tables',NULL,0,1), 0, ''); ?>
924</select>
925<div style="margin-left:20px">
926 <input type="checkbox" name="ttr" value="1"> replace existing DB data<br>
927 <input type="checkbox" name="tti" value="1"> ignore duplicate rows
928</div>
929<input type="radio" name="tt" value="2"> create new table with name <input type="text" name="tn" value="" size="20">
930<br><br>
931<input type="hidden" name="doimcsv" value="1">
932<input type="submit" value=" Upload and Import " onclick="return ays()"><input type="button" value=" Cancel " onclick="window.location='<?php eo($self)?>'">
933</div>
934-->
935</center>
936<?php
937 print_footer();
938 exit;
939}
940
941function do_import(){
942 global $err_msg,$out_message,$dbh,$SHOW_T;
943 $err_msg='';
944 $F=$_FILES['file1'];
945
946 if ($F && $F['name']){
947 $filename=$F['tmp_name'];
948 $pi=pathinfo($F['name']);
949 if ($pi['extension']!='sql'){//if not sql - assume .gz
950 $tmpf=tmp_name();
951 if (($gz=gzopen($filename,'rb')) && ($tf=fopen($tmpf,'wb'))){
952 while(!gzeof($gz)){
953 if (fwrite($tf,gzread($gz,8192),8192)===FALSE){$err_msg='Error during gz file extraction to tmp file';break;}
954 }//extract to tmp file
955 gzclose($gz);fclose($tf);$filename=$tmpf;
956 }else{$err_msg='Error opening gz file';}
957 }
958 if (!$err_msg){
959 if (!do_multi_sql('', $filename)){
960 $err_msg='Import Error: '.mysqli_error($dbh);
961 }else{
962 $out_message='Import done successfully';
963 do_sql($SHOW_T);
964 return;
965 }}
966 }else{
967 $err_msg="Error: Please select file first";
968 }
969 print_import();
970 exit;
971}
972
973// multiple SQL statements splitter
974function do_multi_sql($insql,$fname=''){
975 @set_time_limit(600);
976
977 $sql='';
978 $ochar='';
979 $is_cmt='';
980 $GLOBALS['insql_done']=0;
981 while ($str=get_next_chunk($insql,$fname)){
982 $opos=-strlen($ochar);
983 $cur_pos=0;
984 $i=strlen($str);
985 while ($i--){
986 if ($ochar){
987 list($clchar, $clpos)=get_close_char($str, $opos+strlen($ochar), $ochar);
988 if ( $clchar ) {
989 if ($ochar=='--' || $ochar=='#' || $is_cmt ){
990 $sql.=substr($str, $cur_pos, $opos-$cur_pos );
991 }else{
992 $sql.=substr($str, $cur_pos, $clpos+strlen($clchar)-$cur_pos );
993 }
994 $cur_pos=$clpos+strlen($clchar);
995 $ochar='';
996 $opos=0;
997 }else{
998 $sql.=substr($str, $cur_pos);
999 break;
1000 }
1001 }else{
1002 list($ochar, $opos)=get_open_char($str, $cur_pos);
1003 if ($ochar==';'){
1004 $sql.=substr($str, $cur_pos, $opos-$cur_pos+1);
1005 if (!do_one_sql($sql)) return 0;
1006 $sql='';
1007 $cur_pos=$opos+strlen($ochar);
1008 $ochar='';
1009 $opos=0;
1010 }elseif(!$ochar) {
1011 $sql.=substr($str, $cur_pos);
1012 break;
1013 }else{
1014 $is_cmt=0;if ($ochar=='/*' && substr($str, $opos, 3)!='/*!') $is_cmt=1;
1015 }
1016 }
1017 }
1018 }
1019
1020 if ($sql){
1021 if (!do_one_sql($sql)) return 0;
1022 $sql='';
1023 }
1024 return 1;
1025}
1026
1027//read from insql var or file
1028function get_next_chunk($insql, $fname){
1029 global $LFILE, $insql_done;
1030 if ($insql) {
1031 if ($insql_done){
1032 return '';
1033 }else{
1034 $insql_done=1;
1035 return $insql;
1036 }
1037 }
1038 if (!$fname) return '';
1039 if (!$LFILE){
1040 $LFILE=fopen($fname,"r+b") or die("Can't open [$fname] file $!");
1041 }
1042 return fread($LFILE, 64*1024);
1043}
1044
1045function get_open_char($str, $pos){
1046 if ( preg_match("/(\/\*|^--|(?<=\s)--|#|'|\"|;)/", $str, $m, PREG_OFFSET_CAPTURE, $pos) ) {
1047 $ochar=$m[1][0];
1048 $opos=$m[1][1];
1049 }
1050 return array($ochar, $opos);
1051}
1052
1053#RECURSIVE!
1054function get_close_char($str, $pos, $ochar){
1055 $aCLOSE=array(
1056 '\'' => '(?<!\\\\)\'|(\\\\+)\'',
1057 '"' => '(?<!\\\\)"',
1058 '/*' => '\*\/',
1059 '#' => '[\r\n]+',
1060 '--' => '[\r\n]+',
1061 );
1062 if ( $aCLOSE[$ochar] && preg_match("/(".$aCLOSE[$ochar].")/", $str, $m, PREG_OFFSET_CAPTURE, $pos ) ) {
1063 $clchar=$m[1][0];
1064 $clpos=$m[1][1];
1065 $sl=strlen($m[2][0]);
1066 if ($ochar=="'" && $sl){
1067 if ($sl % 2){ #don't count as CLOSE char if number of slashes before ' ODD
1068 list($clchar, $clpos)=get_close_char($str, $clpos+strlen($clchar), $ochar);
1069 }else{
1070 $clpos+=strlen($clchar)-1;$clchar="'";#correction
1071 }
1072 }
1073 }
1074 return array($clchar, $clpos);
1075}
1076
1077function do_one_sql($sql){
1078 global $last_sth,$last_sql,$MAX_ROWS_PER_PAGE,$page,$is_limited_sql, $last_count;
1079 $sql=trim($sql);
1080 $sql=preg_replace("/;$/","",$sql);
1081 if ($sql){
1082 $last_sql=$sql;$is_limited_sql=0;
1083 $last_count=NULL;
1084 if (preg_match("/^select/i",$sql) && !preg_match("/limit +\d+/i", $sql)){
1085 #get total count
1086 $sql1='select count(*) from ('.$sql.') ___count_table';
1087 $last_count=db_value($sql1,NULL,'noerr');
1088
1089 $offset=$page*$MAX_ROWS_PER_PAGE;
1090 $sql.=" LIMIT $offset,$MAX_ROWS_PER_PAGE";
1091 $is_limited_sql=1;
1092 }
1093 $last_sth=db_query($sql,0,'noerr');
1094 return $last_sth;
1095 }
1096 return 1;
1097}
1098
1099function do_sht(){
1100 global $SHOW_T;
1101 $cb=$_REQUEST['cb'];
1102 if (!is_array($cb)) $cb=array();
1103 $sql='';
1104 switch ($_REQUEST['dosht']){
1105 case 'exp':$_REQUEST['t']=join(",",$cb);print_export();exit;
1106 case 'drop':$sq='DROP TABLE';break;
1107 case 'trunc':$sq='TRUNCATE TABLE';break;
1108 case 'opt':$sq='OPTIMIZE TABLE';break;
1109 }
1110 if ($sq){
1111 foreach($cb as $v){
1112 $sql.=$sq." $v;\n";
1113 }
1114 }
1115 if ($sql) do_sql($sql);
1116 do_sql($SHOW_T);
1117}
1118
1119function to_csv_row($adata){
1120 global $D;
1121 $r='';
1122 foreach ($adata as $a){
1123 $r.=(($r)?",":"").qstr($a);
1124 }
1125 return $r.$D;
1126}
1127function qstr($s){
1128 $s=nl2br($s);
1129 $s=str_replace('"','""',$s);
1130 return '"'.$s.'"';
1131}
1132
1133function get_rand_str($len){
1134 $result='';
1135 $chars=preg_split('//','ABCDEFabcdef0123456789');
1136 for($i=0;$i<$len;$i++) $result.=$chars[rand(0,count($chars)-1)];
1137 return $result;
1138}
1139
1140function check_xss(){
1141 global $self;
1142 if ($_SESSION['XSS']!=trim($_REQUEST['XSS'])){
1143 unset($_SESSION['XSS']);
1144 header("location: $self");
1145 exit;
1146 }
1147}
1148
1149function rw($s){#for debug
1150 echo hs(var_dump($s))."<br>\n";
1151}
1152
1153function tmp_name() {
1154 if ( function_exists('sys_get_temp_dir')) return tempnam(sys_get_temp_dir(),'pma');
1155
1156 if( !($temp=getenv('TMP')) )
1157 if( !($temp=getenv('TEMP')) )
1158 if( !($temp=getenv('TMPDIR')) ) {
1159 $temp=tempnam(__FILE__,'');
1160 if (file_exists($temp)) {
1161 unlink($temp);
1162 $temp=dirname($temp);
1163 }
1164 }
1165 return $temp ? tempnam($temp,'pma') : null;
1166}
1167
1168function hs($s){
1169 return htmlspecialchars($s, ENT_COMPAT|ENT_HTML401,'UTF-8');
1170}
1171function eo($s){//echo+escape
1172 echo hs($s);
1173}
1174
1175function b64e($s){
1176 return base64_encode($s);
1177}
1178?>