View difference between Paste ID: 1X4f5G5Z and DSXgmxJd
SHOW: | | - or go back to the newest paste.
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-
// $colMap contains descriptors for each column of data - 's' or 'i'
42+
// $typeMap contains descriptors for each column of data - 's' or 'i'
43-
// $typeMap contains the column names
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
?>