Advertisement
Guest User

PHP mysqli

a guest
Feb 13th, 2013
301
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2.  
  3. if (!defined('VALID_ACCESS')) {
  4.     echo -8;
  5.     die('You don\'t belong here!');
  6. }
  7.  
  8. // Gets called from the form handling code
  9. // $rows is an array containing form data for each new row in the table
  10. // $len is the length of the array
  11. function insertRows($rows, $len) {
  12.     $query = prepareQuery($rows, $len);
  13.     $con = new db('localhost', 'root', 'shibboleet', 'test');
  14.     if (mysqli_connect_errno()) {
  15.         echo -4;
  16.         die('Couldn\'t connect to database! ' . mysqli_connect_error());
  17.     }
  18.     else {
  19.         if (!($stmt = $con->prepare($query))) {
  20.             echo -5;
  21.             die('Couldn\'t connect to database! ' . $con->error);
  22.         }
  23.         bindParams($rows, $len, $stmt);
  24.        
  25.         if ($stmt->execute()) {
  26.             echo 0;
  27.         }
  28.         else {
  29.             echo -9;
  30.             die('Error: ' . $stmt->error . '<br/>');
  31.         }
  32.         $stmt->close();
  33.     }
  34.    
  35.     $con->close();
  36. }
  37.  
  38. // This function prepares the format of the prepared statement by figuring out
  39. // how many rows are to be inserted and how many columns will each row contain.
  40. // Then it just appends the required number of '?' and wraps them in '()'.
  41. // $sepr = ','
  42. // $typeMap contains descriptors for each column of data - 's' or 'i'
  43. // $colMap contains the column names
  44. function prepareQuery($rows, $len) {
  45.     global $base, $sepr, $typeMap, $colMap;
  46.     $str = $base . '(' . implode($sepr, $colMap) . ') VALUES ';
  47.     $entries = 0;
  48.     for ($i = 0; $i < $len; $i++) {
  49.         $toAppend = true;
  50.         $query = '(';
  51.        
  52.         $tycnt = count($typeMap) - 1;
  53.         $ncols = substr_count($rows[$i], $sepr);
  54.         if ($ncols == $tycnt) {
  55.             for ($j = 0; $j < $ncols; $j++) {
  56.                 $query .= '?,';
  57.             }
  58.             $query .= '?';
  59.         }
  60.         else {
  61.             $toAppend = false;
  62.         }
  63.        
  64.         $query .= ')';
  65.         if ($i < ($len-1)) {
  66.             $query .= ',';
  67.         }
  68.        
  69.         if ($toAppend) {
  70.             $str .= $query;
  71.             $entries++;
  72.         }
  73.     }
  74.     $str .= ';';
  75.    
  76.     if ($entries == 0) {
  77.         echo -7;
  78.         die('No valid entries provided!');
  79.     }
  80.    
  81.     echo $str . '<br/>';
  82.     return $str;
  83. }
  84.  
  85. // This binds the form data to the prepared statement. The form data is in the format
  86. // <row1_col1>,<row1_col2>,....,<row1_coln>;<row2_col1>,<row2_col2>,...,<row2_coln>;....
  87. // where each <rowi_coli> is base64 encoded.
  88. function bindParams($rows, $len, $stmt) {
  89.     global $sepr, $typeMap;
  90.     for ($i = 0; $i < $len; $i++) {
  91.         $tycnt = count($typeMap);
  92.         $cols = explode($sepr, $rows[$i]);
  93.        
  94.         if (count($cols) == $tycnt) {
  95.             for ($j =0; $j < $tycnt; $j++) {
  96.                 $prm = base64_decode($cols[$j]);
  97.                 if ($prm == '') {
  98.                     $prm = NULL;
  99.                 }
  100.                 $cols[$j] = $prm;
  101.                 $stmt->mbind_param($typeMap[$j], $cols[$j]);
  102.             }
  103.         }
  104.     }
  105. }
  106.  
  107. class db extends mysqli {
  108.     public function prepare($query) {
  109.         return new stmt($this,$query);
  110.     }
  111. }
  112.  
  113. class stmt extends mysqli_stmt {
  114.     public function __construct($link, $query) {
  115.         $this->mbind_reset();
  116.         parent::__construct($link, $query);
  117.     }
  118.  
  119.     public function mbind_reset() {
  120.         unset($this->mbind_params);
  121.         unset($this->mbind_types);
  122.         $this->mbind_params = array();
  123.         $this->mbind_types = array('');
  124.     }
  125.  
  126.     public function mbind_param($type, &$param) {
  127.         $this->mbind_types[0].= $type;
  128.         $this->mbind_params[] = &$param;
  129.     }
  130.  
  131.     public function mbind_param_do() {
  132.         $params = array_merge($this->mbind_types, $this->mbind_params);
  133.         return  call_user_func_array(array($this, 'bind_param'),
  134.                 $this->makeValuesReferenced($params));
  135.     }
  136.  
  137.     private function makeValuesReferenced($arr){
  138.         $refs = array();
  139.         foreach($arr as $key => $value) {
  140.             $refs[$key] = &$arr[$key];
  141.         }
  142.         return $refs;
  143.     }
  144.  
  145.     public function execute() {
  146.         if(count($this->mbind_params)) {
  147.             if (!$this->mbind_param_do()) {
  148.                 echo -11;
  149.                 die('Error binding parameters! ' . $this->error . '<br/>');
  150.             }
  151.         }
  152.         return parent::execute();
  153.     }
  154.  
  155.     private $mbind_types = array('');
  156.     private $mbind_params = array();
  157. }
  158.  
  159. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement