|
5 | 5 | session_start(); |
6 | 6 | $bg=2; |
7 | 7 | $step=20; |
8 | | -$version="3.19"; |
| 8 | +$version="3.20"; |
9 | 9 | $bbs=['False','True']; |
10 | 10 | $deny=['sqlite_sequence']; |
11 | 11 | class DBT { |
@@ -101,6 +101,9 @@ public function utf($fi) { |
101 | 101 | } |
102 | 102 | return $fi; |
103 | 103 | } |
| 104 | + function isBase64($data) { |
| 105 | + return (bool) preg_match('/^[a-zA-Z0-9+\/]+={0,2}$/', $data) && (strlen($data) % 4 === 0); |
| 106 | + } |
104 | 107 | public function form($furl,$enc='') { |
105 | 108 | return "<form action='".$this->path.$furl."' method='post'".($enc==1 ? " enctype='multipart/form-data'":"").">"; |
106 | 109 | } |
@@ -415,7 +418,7 @@ public function getTables($dbx) { |
415 | 418 | } |
416 | 419 | $ed=new ED; |
417 | 420 | $head='<!DOCTYPE html><html lang="en"><head> |
418 | | -<title>EdLiteAdmin</title><meta charset="utf-8"> |
| 421 | +<meta charset="utf-8"><title>EdLiteAdmin</title> |
419 | 422 | <style> |
420 | 423 | *{margin:0;padding:0;font-size:14px;color:#333;font-family:Arial} |
421 | 424 | html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;background:#fff} |
@@ -444,7 +447,7 @@ public function getTables($dbx) { |
444 | 447 | optgroup option{padding-left:8px} |
445 | 448 | textarea{white-space:pre-wrap} |
446 | 449 | .msg{position:absolute;top:0;right:0;z-index:9} |
447 | | -.ok,.err{padding:8px;font-weight:bold;font-size:14px} |
| 450 | +.ok,.err{padding:8px;font-weight:bold} |
448 | 451 | .ok{background:#efe;color:#080;border-bottom:2px solid #080} |
449 | 452 | .err{background:#fee;color:#f00;border-bottom:2px solid #f00} |
450 | 453 | .l1,th,button{background:#9be} |
@@ -474,7 +477,7 @@ public function getTables($dbx) { |
474 | 477 | default: |
475 | 478 | case ""://show DBs |
476 | 479 | $ed->check(); |
477 | | - echo $head.$ed->menu()."<div class='col1'>Create Database".$ed->form(2)."<input type='text' name='dbc' /><br/><button type='submit'>Create</button></form></div><div class='col2'><table><tr><th>Database</th><th>Tables</th><th><a href='{$ed->path}31'>Exp</a>/ Actions</th></tr>"; |
| 480 | + echo $head.$ed->menu()."<div class='col1'>".$ed->form(2)."<input type='text' name='dbc' placeholder='Database' /><br/><button type='submit'>Create</button></form></div><div class='col2'><table><tr><th>Database</th><th>Tables</th><th><a href='{$ed->path}31'>Exp</a>/ Actions</th></tr>"; |
478 | 481 | foreach($ed->listdb() as $db) { |
479 | 482 | $bg=($bg==1)?2:1; |
480 | 483 | $dbx=new DBT($ed->dir.$db.$ed->ext); |
@@ -1696,16 +1699,19 @@ public function getTables($dbx) { |
1696 | 1699 | } else { |
1697 | 1700 | $ph=$ed->sg[7];$nu1=" AND ".$ed->sg[5]."='".base64_decode($ed->sg[6])."'"; |
1698 | 1701 | } |
1699 | | - $q_ph=$ed->con->query("SELECT $ph FROM $tb WHERE $nu='$id'$nu1",true)->fetch(); |
1700 | | - $r_ph=base64_decode($q_ph); |
| 1702 | + $r_ph=$ed->con->query("SELECT $ph FROM $tb WHERE $nu='$id'$nu1",true)->fetch(); |
| 1703 | + if($ed->isBase64($r_ph)) $r_ph=base64_decode($r_ph); |
1701 | 1704 | $len=strlen($r_ph); |
1702 | | - if($len >=2 && $r_ph[0]==chr(0xff) && $r_ph[1]==chr(0xd8)) {$tp='image/jpeg';$xt='.jpg';} |
1703 | | - elseif($len >=3 && substr($r_ph,0,3)=='GIF') {$tp='image/gif';$xt='.gif';} |
1704 | | - elseif($len >=4 && substr($r_ph,0,4)=="\x89PNG") {$tp='image/png';$xt='.png';} |
1705 | | - else {$tp='application/octet-stream';$xt='.bin';$r_ph=$q_ph;} |
| 1705 | + $tp='application/octet-stream';$xt='bin'; |
| 1706 | + if($len>3){ |
| 1707 | + if(substr($r_ph,0,3)=="\xFF\xD8\xFF"){$tp='image/jpg';$xt='jpg';} |
| 1708 | + elseif(substr($r_ph,0,3)=="GIF"){$tp='image/gif';$xt='gif';} |
| 1709 | + elseif(substr($r_ph,0,4)=="\x89PNG"){$tp='image/png';$xt='png';} |
| 1710 | + elseif(substr($r_ph,0,4)=="RIFF"){$tp='image/webp';$xt='webp';} |
| 1711 | + } |
1706 | 1712 | header("Content-type: $tp"); |
1707 | 1713 | header("Content-Length: $len"); |
1708 | | - header("Content-Disposition: attachment; filename={$tb}-blob{$xt}"); |
| 1714 | + header("Content-Disposition: attachment; filename={$tb}-blob.{$xt}"); |
1709 | 1715 | die($r_ph); |
1710 | 1716 | break; |
1711 | 1717 |
|
@@ -1849,33 +1855,21 @@ public function getTables($dbx) { |
1849 | 1855 | unset($_POST,$_SESSION["ok"],$_SESSION["err"]); |
1850 | 1856 | ?></div></div><div class="l1 ce"><a href="http://edmondsql.github.io">edmondsql</a></div> |
1851 | 1857 | <script> |
1852 | | -function byId(n){ |
1853 | | -return document.getElementById(n); |
1854 | | -} |
1855 | | -function byName(n){ |
1856 | | -return document.getElementsByName(n); |
1857 | | -} |
1858 | | -function byAll(n){ |
1859 | | -return document.querySelectorAll(n); |
1860 | | -} |
1861 | | -function createEl(n){ |
1862 | | -return document.createElement(n); |
1863 | | -} |
1864 | | -Element.prototype.show=function(){ |
1865 | | -this.style.display='block'; |
1866 | | -}; |
1867 | | -Element.prototype.hide=function(){ |
1868 | | -this.style.display='none'; |
1869 | | -}; |
1870 | | -var pwd=byId("pwd"); |
| 1858 | +const $=(s)=>document.querySelector(s); |
| 1859 | +const $$=(s)=>document.querySelectorAll(s); |
| 1860 | +const $n=(s)=>document.getElementsByName(s); |
| 1861 | +const $c=(s)=>document.createElement(s); |
| 1862 | +Element.prototype.show=function(){this.style.display='block';} |
| 1863 | +Element.prototype.hide=function(){this.style.display='none';} |
| 1864 | +const pwd=$("#pwd"); |
1871 | 1865 | pwd?pwd.focus():''; |
1872 | 1866 |
|
1873 | | -let msg=byAll(".msg"); |
1874 | | -byAll(".del").forEach(d=>{ |
| 1867 | +let msg=$$(".msg"); |
| 1868 | +$$(".del").forEach(d=>{ |
1875 | 1869 | d.addEventListener('click',(e)=>{ |
1876 | 1870 | e.preventDefault(); |
1877 | 1871 | msg.forEach(m=>m.remove()); |
1878 | | -let hrf=e.target.getAttribute("href"),nMsg=createEl("div"),nOk=createEl("div"),nEr=createEl("div"); |
| 1872 | +let hrf=e.target.getAttribute("href"),nMsg=$c("div"),nOk=$c("div"),nEr=$c("div"); |
1879 | 1873 | nMsg.className='msg'; |
1880 | 1874 | nOk.className='ok';nOk.innerText='Yes'; |
1881 | 1875 | nEr.className='err';nEr.innerText='No'; |
@@ -1950,34 +1944,34 @@ function addDragAndDrop(){ |
1950 | 1944 | })(); |
1951 | 1945 |
|
1952 | 1946 | function selectall(cb,lb){ |
1953 | | -var i,multi=byId(lb); |
| 1947 | +let i,multi=$('#'+lb); |
1954 | 1948 | if(cb.checked) for(i=0;i<multi.options.length;i++) multi.options[i].selected=true; |
1955 | 1949 | else multi.selectedIndex=-1; |
1956 | 1950 | } |
1957 | 1951 | function toggle(cb,el){ |
1958 | | -var i,cbox=byName(el); |
| 1952 | +let i,cbox=$n(el); |
1959 | 1953 | for(i=0;i<cbox.length;i++) cbox[i].checked=cb.checked; |
1960 | 1954 | } |
1961 | 1955 | function fmt(){ |
1962 | | -var j,opt=byName("fopt[]"),ff=byName("ffmt[]"),to=opt.length,ch=""; |
| 1956 | +let j,opt=$n("fopt[]"),ff=$n("ffmt[]"),to=opt.length,ch=""; |
1963 | 1957 | for(j=0;ff[j];++j){if(ff[j].checked) ch=ff[j].value;} |
1964 | | -if(byId('tbs'))dbx('tbs'); |
| 1958 | +if($('#tbs'))dbx('tbs'); |
1965 | 1959 | if(ch=="sql"){ |
1966 | | -for(var k=0;k<to;k++) opt[k].parentElement.show(); |
| 1960 | +for(let k=0;k<to;k++) opt[k].parentElement.show(); |
1967 | 1961 | }else if(ch=="doc" || ch=="xml"){ |
1968 | | -var k,n=ch=="xml"?4:2; |
| 1962 | +let k,n=ch=="xml"?4:2; |
1969 | 1963 | for(k=0;k<n;k++) opt[k].parentElement.show(); |
1970 | 1964 | for(k=n;k<to;k++) {opt[k].parentElement.hide();opt[k].checked=false} |
1971 | 1965 | }else{ |
1972 | | -for(var i=0;i<to;i++) {opt[i].parentElement.hide();opt[i].checked=false} |
| 1966 | +for(let i=0;i<to;i++) {opt[i].parentElement.hide();opt[i].checked=false} |
1973 | 1967 | } |
1974 | 1968 | } |
1975 | 1969 | function dbx(el='dbs'){ |
1976 | | -var j,ch="",ft=byName("ftype")[0],ff=byName("ffmt[]"),db=byAll("#"+el+" option:checked").length,dbs=byId('dbs'),arr=["json","csv1","csv2"]; |
| 1970 | +let j,ch="",ft=$n("ftype")[0],ff=$n("ffmt[]"),db=$$("#"+el+" option:checked").length,dbs=$('#dbs'),arr=["json","csv1","csv2"]; |
1977 | 1971 | for(j=0;ff[j];++j){if(ff[j].checked) ch=ff[j].value;} |
1978 | 1972 | if(ft[0].value!="plain"){ |
1979 | 1973 | if((db<2 && (dbs||arr.indexOf(ch)>-1))||(db>1 && (dbs||arr.indexOf(ch)==-1))){ |
1980 | | -var op=createEl("option"); |
| 1974 | +let op=$c("option"); |
1981 | 1975 | op.value="plain";op.text="None"; |
1982 | 1976 | ft.options.add(op,0); |
1983 | 1977 | ft.options[0].selected=true; |
|
0 commit comments