Guest User

Untitled

a guest
May 2nd, 2018
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.05 KB | None | 0 0
  1. <?php
  2. #ini_set('display_errors',0);
  3. header('Content-Type: application/json');
  4. interface SQL { function sql(); }
  5. interface RecordSet{ function add(Field $f); function field($name,$as=''); function fields();}
  6. class DB
  7. {
  8. const USERNAME = 'root', PASSWORD = 'password';
  9. const HOST = 'localhost', DB_NAME='smf';
  10. const TABLE = "smf_%s";
  11. static $current = null;
  12.  
  13. static function con() { if(self::$current == null) new DB(self::DB_NAME); return self::$current; }
  14.  
  15. static function table($t) { return preg_match('/^'.sprintf(self::TABLE,'.*?').'$/',$t)>0?$t:sprintf(self::TABLE,$t); }
  16.  
  17. function __construct($name)
  18. {
  19. if(!mysql_connect(DB::HOST,DB::USERNAME,DB::PASSWORD))
  20. throw Exception('cant connect');
  21. mysql_select_db($name);
  22. $this->result = (object)null;
  23. self::$current = $this;
  24. }
  25.  
  26. function query(Query $q,$key='id')
  27. {
  28. $this->result = array();
  29. $this->query = $q->sql();
  30. $res = mysql_query($this->query);
  31. $count = mysql_num_rows($res);
  32. if(!$res or $count<1)
  33. return;
  34. if($count == 1)
  35. $this->result = (object)mysql_fetch_object($res);
  36. else
  37. while($row = mysql_fetch_object($res))
  38. {
  39. $id = property_exists($row,$key)?$row->id:count($this->result);
  40. $o = (object)null;
  41. foreach($row as $t => $v)
  42. $o->$t = self::getCasted($v);
  43. $this->result[$id]= $o;
  44. }
  45. $this->count = $count;
  46. }
  47.  
  48. function getCasted($v)
  49. {
  50. if(is_null($v))
  51. return null;
  52. if(is_bool($v))
  53. return (boolean)$v;
  54. if(is_int($v))
  55. return intval($v);
  56. if(is_float($v))
  57. return floatval($v);
  58. if(is_numeric($v))
  59. return doubleval($v);
  60. return $v;
  61. }
  62.  
  63. function requery()
  64. {
  65. query($this->query);
  66. }
  67.  
  68. public $query = null;
  69. public $count = 0;
  70. public $result = array();
  71. public $error = null;
  72. }
  73.  
  74. class Table implements SQL
  75. {
  76. protected $name;
  77. function __construct($n){ $this->name = DB::table($n); }
  78. function name($n = ''){ if($n == '') return $this->name; else return $this->name == $n; }
  79. function sql(){ return "`{$this->name}`"; }
  80. function __tostring(){ return $this->sql(); }
  81. }
  82.  
  83. class Field implements SQL
  84. {
  85. static function find(RecordSet $r, $n, $a)
  86. {
  87. if($n==null and $a==null)
  88. return null;
  89. foreach($r->fields() as $f)
  90. if( $f->named($n) || ($n!=null && $f->alias($n)) || ($n == null && $f->alias($a)) )
  91. return $f;
  92. return null;
  93. }
  94.  
  95. protected $name;
  96. var $alias = null;
  97. private $table = null;
  98. var $tabled = false;
  99.  
  100. function __construct($n, $as='', Table $t=null, $td = false) { $this->name = $n; $this->alias = $as; $this->table = $t; $this->tabled = $td;}
  101.  
  102. function name($t = false){ return (($t && self::tabled())?$this->table.'.':'')."`{$this->name}`"; }
  103.  
  104. function sql(){ return self::name($this->tabled).($this->alias!=null?' AS '.$this->alias:''); }
  105.  
  106. function __toString(){ return $this->sql(); }
  107.  
  108. function table($t = ''){ if($t == null) return $this->table; else return $this->table->named($t); }
  109.  
  110. function tabled(){ return $this->table != null; }
  111.  
  112. function named($n){ return $this->name == $n; }
  113.  
  114. function equal(Field $f){ return $f->named($this->name); }
  115.  
  116. function alias($a = ''){ $as = $this->alias==null?$this->name:$this->alias; if($a == null) return $as; else return $as == $a; }
  117. }
  118.  
  119. class Order extends Field implements SQL
  120. {
  121. const __SQL = " ORDER BY %s %s";
  122.  
  123. const ASCENDING = true, DESCENDING = false;
  124. static function direction($asc=true){ return $asc?"ASC":"DESC"; }
  125.  
  126. private $asc;
  127.  
  128. function __construct($n, $o = true, Table $t=null) { parent::__construct($n,'',$t); $this->asc = $o;}
  129.  
  130. function name($sql = true){ return $sql?parent::name():$this->name;}
  131.  
  132. function sql(){ return sprintf(self::__SQL,self::name(),self::direction($this->asc)); }
  133. }
  134.  
  135. class Limit implements SQL
  136. {
  137. private $count, $offset;
  138.  
  139. function __construct($c, $o = 0) { $this->count = $c; $this->offset = $o; }
  140.  
  141. function sql() { return " LIMIT ".$this->offset.", ".$this->count; }
  142. function __toString(){return self::sql();}
  143. }
  144.  
  145. class Join implements SQL
  146. {
  147. const __SQL = " LEFT JOIN %s ON %s";
  148.  
  149. private $table, $where;
  150.  
  151. function __construct($t, $where='1=1')
  152. {
  153. $this->table = ($t instanceof Table)?$t:new Table($t);
  154. $this->where = $where;
  155. }
  156.  
  157. function sql() { return sprintf(self::__SQL,$this->table, $this->where); }
  158.  
  159. function __toString() { return $this->sql(); }
  160. }
  161.  
  162. class Record extends Table implements RecordSet
  163. {
  164. protected $fields = array();
  165.  
  166. function __construct($name)
  167. {
  168. parent::__construct($name);
  169. $this->fields=array();
  170. }
  171.  
  172. function add(Field $f) { $this->fields[] = $f; }
  173.  
  174. function field($n,$a='') { return Field::find($this,$n,$a); }
  175.  
  176. function query()
  177. {
  178. $q = new Query($this->name);
  179. foreach($this->fields as $f)
  180. $q->add($f);
  181. return $q;
  182. }
  183. function fields() { return $this->fields; }
  184. }
  185.  
  186. class Query implements SQL, RecordSet
  187. {
  188. private $fields = array();
  189. private $tables = array();
  190. private $order = null;
  191. var $where = "";
  192. var $join = null;
  193. private $limit = null;
  194.  
  195. function __construct($name = '')
  196. {
  197. $this->tables = array();
  198. $this->fields=array();
  199. if($name != '')
  200. $this->addTable(new Table($name));
  201. }
  202.  
  203. function sql()
  204. {
  205. $fields = join(', ',$this->fields);
  206. $tables = join(', ',$this->tables);
  207. $_j = $this->join;
  208. $join = ($_j instanceof Join)?$_j->sql():"";
  209. $where = $this->where==null?"":' WHERE '.$this->where;
  210. return "SELECT ".$fields." FROM ".$tables.$join.$where.$this->order.$this->limit;
  211. }
  212.  
  213. function add(Field $f) { $this->fields[] = $f; }
  214.  
  215. function addTable(Table $t) { $this->tables[$t->name()] = $t; }
  216.  
  217. function setOrder(Order $o) { $this->limit = ($f = self::field($o->name(false)))==null?null:$o; }
  218. function SetLimit(Limit $l) { $this->limit = $l; }
  219.  
  220. function table($n) { return $this->tables[$n]; }
  221.  
  222. function field($n,$a='') { return Field::find($this,$n,$a); }
  223. function fields() { return $this->fields; }
  224. }
  225.  
  226. class User
  227. {
  228. const ID = 'ID_MEMBER', TABLE = 'members', BANNED = 'log_banned';
  229. private static $r;
  230.  
  231. private static function setWhere($q, $where='1=1')
  232. {
  233. $r = self::$r; // retrieves the Recordset
  234. $_AC = 'is_activated';
  235.  
  236. $r_id = $r->field(self::ID);
  237. $r_ac = new Field($_AC,null,$r); // allows us to restrict to active accounts
  238.  
  239. $b = new Record(self::BANNED); //creates a record for the banned users tabled
  240. $b_id = new Field(self::ID,'id',$b); //creates a field for the banned users id
  241.  
  242. $r_id->tabbed = $b_id->tabbed = true;
  243.  
  244. //LEFT JOIN $r ON $r_id <> $b_id
  245. $q->join = new Join($b, "{$r_id->name(true)}<>{$b_id->name(true)}");
  246.  
  247. return $q->where = "$where AND $r_ac";
  248. }
  249.  
  250. static function init()
  251. {
  252. $r = new Record(self::TABLE);
  253. $r->add(new Field(self::ID,"id",$r,true));
  254. $r->add(new Field("memberName","name",$r));
  255. $r->add(new Field("dateRegistered","reg",$r));
  256. $r->add(new Field("realName",null,$r));
  257. $r->add(new Field("emailAddress",'email',$r));
  258. $r->add(new Field("gender",null,$r));
  259. $r->add(new Field("personalText",'text',$r));
  260. $r->add(new Field("userTitle",'title',$r));
  261. $r->add(new Field("birthdate",'birthday',$r));
  262. $r->add(new Field("posts",null,$r));
  263. $r->add(new Field("totalTimeLoggedIn","time",$r));
  264. $r->add(new Field("websiteTitle",'siteName',$r));
  265. $r->add(new Field("websiteUrl",'site',$r));
  266. $r->add(new Field("location",$r));
  267. $r->add(new Field("ICQ",null,$r));
  268. $r->add(new Field("AIM",null,$r));
  269. $r->add(new Field("YIM",null,$r));
  270. $r->add(new Field("MSN",null,$r));
  271. $r->add(new Field("hideEmail",'emailHide',$r));
  272. $r->add(new Field("signature",null,$r));
  273. $r->add(new Field("avatar",null,$r));
  274. self::$r = $r;
  275. }
  276.  
  277. static function all(Order $o = null, Limit $l = null, DB $db=null)
  278. {
  279. if($db==null) $db = DB::con();
  280. $_LIST = array('id','name','posts','time');
  281.  
  282. $r = self::$r;
  283. $q = new Query();
  284.  
  285. $q->addTable($r);
  286. foreach($_LIST as $f)
  287. $q->add($r->field('',$f));
  288.  
  289. self::setWhere($q);
  290.  
  291. if($o!=null) $q->setOrder($o);
  292. if($l!=null) $q->setLimit($l);
  293.  
  294. if($o!=null)
  295. $db->query($q,$o->name(false));
  296. else
  297. $db->query($q);
  298. }
  299.  
  300. var $id, $name, $reg, $realName;
  301. var $email, $gender, $text, $title;
  302. var $birthday, $posts, $time, $siteName;
  303. var $site, $location;
  304. var $ICQ, $AIM, $YIM, $MSN;
  305. var $emailHide, $signature, $avatar;
  306.  
  307. function __construct($var, $key='id', $db=null)
  308. {
  309. if($db == null) $db = DB::con();
  310. $r = self::$r;
  311.  
  312. $q = $r->query();
  313.  
  314. $k = $r->field($key);
  315. $k->tabled = true;
  316.  
  317. $q->setOrder(new Order($key));
  318.  
  319. self::setWhere($q, "{$k->name(true)} LIKE '$var'");
  320.  
  321. $db->query($q,$key);
  322.  
  323. foreach($db->result as $k => $v) $this->$k = $v;
  324.  
  325. if($this->emailHide == true) unset($this->email, $this->birthday, $this->gender);
  326.  
  327. unset($this->emailHide);
  328.  
  329. $db->result = ($db->count>0)?$this:(object)null;
  330. }
  331.  
  332. }
  333.  
  334.  
  335. class Post
  336. {
  337. const ID = 'ID_MSG', TABLE = 'messages';
  338. const THREAD = 'ID_TOPIC',BOARD = 'boards';
  339. const GUEST = '-1';
  340. private static $r;
  341. private static $b;
  342.  
  343. private static function setWhere($q,$w='', $j_w = '1=1')
  344. {
  345. $r = self::$r;
  346. $_ID = 'ID_BOARD';
  347. $_GST = '%'.self::GUEST.'%';
  348.  
  349. $r_id = new Field($_ID,null,$r);
  350.  
  351. $b = Post::board();
  352. $b_id = $b->field($_ID);
  353. $b_gr = $b->field('','group');
  354.  
  355. $b_id->tabled = $r_id->tabled = $b_grp->tabled = true;
  356.  
  357. //LEFT JOIN $r ON $r_id = $b_id AND $b_gr LIKE $_GST
  358. $q->join = new Join($b, "{$b_id->name(true)} = {$r_id} AND {$b_gr->name(true)} LIKE '$_GST' AND ($j_w)");
  359.  
  360. return $q->where = $w;
  361. }
  362.  
  363. private static function board()
  364. {
  365. $b = new Record(self::BOARD);
  366. $b->add(new Field('ID_BOARD','id',$b,true));
  367. $b->add(new Field('memberGroups','group',$b));
  368. $b->add(new Field('ID_MEMBER_STARTED','member',$b));
  369. return $b;
  370. }
  371.  
  372. private static function thread()
  373. {
  374. $b = new Record('topics');
  375. $b->add(new Field(self::THREAD,'id',$b,true));
  376. return $b;
  377. }
  378.  
  379. static function init()
  380. {
  381. $r = new Record(self::TABLE);
  382. $r->add(new Field(self::ID,'id',$r,true));
  383. $r->add(new Field(self::THREAD,'topic',$r,true));
  384. $r->add(new Field(User::ID,"member",$r,true));
  385. $r->add(new Field("posterName","memberName",$r));
  386. $r->add(new Field("posterTime","time",$r));
  387. $r->add(new Field("subject",null,$r));
  388. $r->add(new Field("body",null,$r));
  389. self::$r = $r;
  390. }
  391.  
  392. static function by_thread($id, Limit $l = null, DB $db=null)
  393. {
  394. if($db==null) $db = DB::con();
  395. $_ORDER = 'time';
  396. $_FIELDS = array('id','member','topic','time');
  397.  
  398. $r = self::$r;
  399. $q = new Query(self::TABLE);
  400. $o = new Order($_ORDER,false,$r); // Order by post time.
  401.  
  402. $r_t = $r->field('','topic');
  403.  
  404. foreach($_FIELDS as $_f)
  405. $q->add($r->field('',$_f));
  406.  
  407. $q->setOrder($o);
  408. if($l!=null) $q->setLimit($l);
  409.  
  410. //WHERE `topic` = '$id'
  411. self::setWhere($q,"{$r_t->name()}='$id'");
  412. $db->query($q,$o->name());
  413. }
  414. //*
  415. static function blog($id, Limit $l = null, DB $db=null)
  416. {
  417. if($db==null) $db = DB::con();
  418. $_ORDER = 'time';
  419. $_FIELDS = array('id','member','topic','time');
  420.  
  421. $r = self::$r;
  422. $t_t = self::thread();
  423. $q = new Query($t_t->name());
  424. $q->addTable($r);
  425. $o = new Order($_ORDER,false,$r); // Order by post time.
  426.  
  427. $r_t = $r->field(self::THREAD);
  428. $r_m = $r->field(User::ID);
  429.  
  430. $t_m = $t_t->field(self::THREAD);
  431.  
  432. foreach($_FIELDS as $_f)
  433. $q->add($r->field('',$_f));
  434.  
  435. $q->setOrder($o);
  436. if($l!=null) $q->setLimit($l);
  437.  
  438. //WHERE `topic` = '$id' AND `poster` = `thread.topic_starter`
  439. self::setWhere($q,"{$r_t->name(true)}='$id' AND {$r_m->name(true)} = {$t_m->name(true)}");
  440. $db->query($q,$o->name());
  441. }
  442. //*/
  443. var $id, $topic, $Field, $time;
  444.  
  445. function __construct($var, $key='id', $db=null)
  446. {
  447. if($db == null) $db = DB::con();
  448. $r = self::$r;
  449. $q = $r->query();
  450.  
  451. $k = $r->field('',$key);
  452. $k->tabled = true;
  453.  
  454. $q->setOrder(new Order($key));
  455.  
  456. // WHERE $key = $var
  457. self::setWhere($q,"{$k->name()} = '$var'");
  458.  
  459. $db->query($q);
  460. foreach($db->result as $k => $v)
  461. $this->$k = $v;
  462.  
  463. $db->result = ($db->count>0)?$this:(object)null;
  464. }
  465. }
  466.  
  467. User::init();
  468. Post::init();
  469. $t = DB::con();
  470.  
  471. //The things it does atm, just uncomment one line at a time :)
  472. #User::all(); //Returns all the users.
  473. #new User(6); //the parameter is the user ID (can search on user name and other fields by adding 'field_name' as the second parameter.#
  474. #Post::by_thread(1); // parameter is the thread ID.
  475. #new Post(2); // parameter is the post ID (can search on other fields by adding 'field_name' as the second parameter.
  476. #Post::blog(1); // doesnt work.
  477.  
  478. print json_encode($t);
Add Comment
Please, Sign In to add comment