Advertisement
stuppid_bot

Untitled

Jul 15th, 2014
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.64 KB | None | 0 0
  1. <?php
  2.  
  3. abstract class ORM_Abstract {
  4.     public $pdo;
  5.     protected $_tablePrefix;
  6.     protected $_statementCache = [];
  7.  
  8.     abstract public function quoteName($name);
  9.  
  10.     abstract public function getMeta($table);
  11.  
  12.     public function __construct(PDO $pdo, $table_prefix='') {
  13.         $this->pdo = $pdo;
  14.         $this->_tablePrefix = $table_prefix;
  15.     }
  16.    
  17.     public function record($table, $id=null) {
  18.         $meta = $this->getmeta($table);
  19.         $rec = new ORM_Record($this, $table);
  20.  
  21.         if (func_num_args() > 1 && !$rec->load($id))
  22.             return false;
  23.  
  24.         return $rec;
  25.     }
  26.  
  27.     public function load($table, $id) {
  28.         $o = $this->disponse($table);
  29.         return $o->load($id) ? $o: false;
  30.     }
  31.  
  32.     public function query($query, array $bindings=[]) {
  33.         // '?_' автоматически заменяется на преффикс для таблиц.
  34.         $query = str_replace('?_', $this->_tablePrefix, $query);
  35.         echo dump($query);
  36.         $h = md5($query);
  37.         if (isset($this->_statementCache[$h])) {
  38.             list($s, $t) = $this->_statementCache[$h];
  39.         }
  40.         else {
  41.             $s = $this->pdo->prepare($query);
  42.             preg_match('/^\s*(\w+)/', $query, $m);
  43.             $t = strtolower($m[1]);
  44.             $this->_statementCache[$h] = [$s, $t];
  45.         }
  46.  
  47.         $s->execute($bindings);
  48.  
  49.         if ($t == 'update' or $t == 'delete')
  50.             return $s->rowCount();
  51.  
  52.         if ($t == 'insert')
  53.             return $this->lastInsertId();
  54.  
  55.         return $s;
  56.     }
  57.  
  58.     public function get($query, array $bindings=[],
  59.                         $fetch_type=ORM::FETCH_ALL) {
  60.         $r = $this->query($query, $bindings);
  61.  
  62.         if ($fetch_type & ORM::FETCH_COLUMN)
  63.             return $r->fetchColumn();
  64.  
  65.         if ($fetch_type & ORM::FETCH_ROW)
  66.             return $r->fetch(PDO::FETCH_ASSOC);
  67.  
  68.         return $r->fetchAll(PDO::FETCH_ASSOC);
  69.     }
  70.  
  71.     public function row($query, array $bindings=[]) {
  72.         return $this->get($query, $bindings, ORM::FETCH_ROW);
  73.     }
  74.  
  75.     public function column($query, array $bindings=[]) {
  76.         return $this->get($query, $bindings, ORM::FETCH_COLUMN);
  77.     }
  78.  
  79.     public function count($table, $where=1, array $bindings=[]) {
  80.         $tbl = $this->fulltablename($table);
  81.         $q = "SELECT COUNT(*) FROM $tbl WHERE $where";
  82.         return (int) $this->column($q, $bindings);
  83.     }
  84.  
  85.     public function insert($table, array $data) {
  86.         if (!$data)
  87.             return false;
  88.  
  89.         $t = $this;
  90.         $keys = array_keys($data);
  91.  
  92.         foreach ($keys as $v) {
  93.             $columns[] = $t->quotename($v);
  94.             $values[] = ":$v";
  95.         }
  96.  
  97.         $columns = implode(',', $columns);
  98.         $values = implode(',', $values);
  99.         $tbl = $t->fulltablename($table);
  100.         $q = "INSERT INTO $tbl ($columns) VALUES ($values)";
  101.         return $t->query($q, $data);
  102.     }
  103.  
  104.     public function update($table, array $data, $where=1,
  105.                            array $bindings=[]) {
  106.         if (!$data)
  107.             return false;
  108.  
  109.         $t = $this;
  110.         $is_l = is_list($bindings);
  111.         $bindings = array_merge($is_l ? array_values($data) : $data,
  112.                                 $bindings);
  113.         $keys = array_keys($data);
  114.  
  115.         foreach ($keys as $v) {
  116.             $set[] = $t->quotename($v) . '=' . ($is_l ? '?' : ":$v");
  117.         }
  118.  
  119.         $set = implode(',', $set);
  120.         $tbl = $t->fulltablename($table);
  121.         return $t->query("UPDATE $tbl SET $set WHERE $where", $bindings);
  122.     }
  123.  
  124.     public function delete($table, $where=1, array $bindings=[]) {
  125.         $tbl = $this->fulltablename($table);
  126.         return $this->query("DELETE FROM $tbl WHERE $where", $bindings);
  127.     }
  128.  
  129.     public function commit() {
  130.         return $this->pdo->commit();
  131.     }
  132.  
  133.     public function rollback() {
  134.         return $this->pdo->rollback();
  135.     }
  136.  
  137.     public function lastInsertId() {
  138.         return $this->pdo->lastInsertId();
  139.     }
  140.  
  141.     public function fullTableName($table) {
  142.         return $this->quotename($this->_tablePrefix . $table);
  143.     }
  144. }
  145.  
  146. /* ---------------------------- 78 characters ----------------------------- */
  147.  
  148. <?php
  149.  
  150. class ORM_Record extends object {
  151.     protected $_db;
  152.     protected $_table;
  153.     protected $_primaryKey;
  154.     protected $_columns;
  155.     protected $_relations;
  156.     protected $_primaryId;
  157.  
  158.  
  159.     public function __construct(ORM_Abstract $db, $table,
  160.                                 $columns, $relations) {
  161.         $t = $this;
  162.         $t->_db = $db;
  163.         $t->_table = $table;
  164.         $t->_columns = $columns;
  165.         $t->_relations = $relations;
  166.     }
  167.  
  168.     public function load($id) {
  169.         $t = $this;
  170.         $tbl = $t->_db->fulltablename($t->_table);
  171.         $k = $t->_db->quotename($t->_primaryKey);
  172.         $r = $t->_db->row("SELECT * FROM $tbl WHERE $k=?", [$id,]);
  173.        
  174.         if ($r) {
  175.             $t->_data = $r;
  176.             $t->_primaryId = $id;
  177.             return true;
  178.         }
  179.  
  180.         /*
  181.         array (
  182.           'columns' =>
  183.           array (
  184.             0 => 'id',
  185.             1 => 'cat_id',
  186.             2 => 'author_id',
  187.             3 => 'title',
  188.             4 => 'body',
  189.           ),
  190.           'primary_key' => 'id',
  191.           'relations' =>
  192.           array (
  193.             0 =>
  194.             array (
  195.               'foreign_alias' => 'category',
  196.               'foreign_key' => 'cat_id',
  197.               'ref_table' => 'categories',
  198.               'ref_key' => 'id',
  199.             ),
  200.           ),
  201.         ) */
  202.  
  203.         foreach ($t->_relations as $rel) {
  204.             $t->_data[  ]
  205.         }
  206.  
  207.         return false;
  208.     }
  209.  
  210.     public function save() {
  211.         $t = $this;
  212.         $a = $t->_matchcolumns();
  213.  
  214.         if ($t->_primaryId) {
  215.             $k = $t->_db->quotename($t->_primaryKey);
  216.             $c = $t->_db->update($t->_table, $a, "$k=?", [$t->_primaryId,]);
  217.             return (bool) $c;
  218.         }
  219.  
  220.         $id = $t->_db->insert($t->_table, $a);
  221.  
  222.         if (!$id)
  223.             return fase;
  224.  
  225.         $t->_primaryId = $id;
  226.         return true;
  227.     }
  228.  
  229.     public function trash() {
  230.         $t = $this;
  231.         $k = $t->_db->quotename($t->_primaryKey);
  232.         $c = $t->_db->delete($t->_table, "$k=?", [$t->_primaryId,]);
  233.  
  234.         if ($c)
  235.             $t->_data = null;
  236.  
  237.         return (bool) $c;
  238.     }
  239.  
  240.     protected function _matchColumns() {
  241.         $t = $this;
  242.         $r = array();
  243.  
  244.         foreach ($t->_columns as $v) {
  245.             if (isset($t->_data[$v])) {
  246.                 $r[$v] = $t->_data[$v];
  247.             }
  248.         }
  249.  
  250.         return $r;
  251.     }
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement