-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathMySQLi.php
392 lines (388 loc) · 12.9 KB
/
MySQLi.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
<?php
//MySQL基本操作(基于 PHP 的 MySQLi 扩展)
//Author:MoonLord
//Version:2015.12.05
$MySQL_Server = 'localhost';
$MySQL_Port = '3306';
$MySQL_Username = 'root';
$MySQL_Password = '132357';
$MySQL_Database = 'MoonLord';
//已处理的MySQL错误:
//2006 MySQL server has gone away(可能原因:MySQL服务已异常关闭、连接超时、SQL语句过长、获取的结果集过长等,解决方案:尝试一次重新连接和重新查询)
//2013 Lost connection to MySQL server during query(可能原因:MySQL连接超时、SQL语句过长、获取的结果集过长等,解决方案:尝试一次重新连接和重新查询)
//结果集的额外处理:
//单元格的值如果为NULL,在返回结果中,将被转换为空字符串""
//单元格的值如果为JSON字符串,在返回结果中,将被转换为JSON数组
//die("【数据库连接错误】<br/>错误代码:".mysqli_errno($Connect)."<br/>错误原因: ".mysqli_error($Connect));
$Connect = null;
//自定义的MySQL新建连接的函数(成功返回数据库连接标识,失败返回false)
function MySQLConnect(){
global $MySQL_Server;
global $MySQL_Port;
global $MySQL_Username;
global $MySQL_Password;
global $MySQL_Database;
global $Connect;
$Connect=mysqli_connect($MySQL_Server.':'.$MySQL_Port,$MySQL_Username,$MySQL_Password,$MySQL_Database);
if(!$Connect) {
return false;
}
return $Connect;
}
//自定义的MySQL断开连接的函数(成功返回true,失败返回false)
function MySQLDisconnect(){
global $Connect;
return mysqli_close($Connect);
}
//自定义的MySQL错误信息函数
function MySQLErrorInfo(){
global $Connect;
return '错误代码:'.mysqli_errno($Connect).' 错误原因:'.mysqli_error($Connect);
}
function MySQLErrorNumber(){
global $Connect;
return mysqli_errno($Connect);
}
//自定义的MySQL插入数据库的函数(成功返回上一步INSERT操作产生的ID,失败返回false)
function MySQLInsert($SQL){
global $Connect;
$result = mysqli_query($Connect,$SQL);
//2006和2013错误则重试一次
if(!$result && in_array(mysqli_errno($Connect), array(2006, 2013))){
MySQLDisconnect();
MySQLConnect();
$result = mysqli_query($Connect,$SQL);
}
if(!$result){
return false;
}
if(mysqli_insert_id($Connect)===0){
return false;
}
return mysqli_insert_id($Connect);
}
//自定义的MySQL尝试更新/删除数据库的函数(成功或【实际影响的行数为0】返回true,失败返回false)
function MySQLTryUpdate($SQL){
global $Connect;
$result = mysqli_query($Connect,$SQL);
//2006和2013错误则重试一次
if(!$result && in_array(mysqli_errno($Connect), array(2006, 2013))){
MySQLDisconnect();
MySQLConnect();
$result = mysqli_query($Connect,$SQL);
}
if(!$result){
return false;
}
return $result;
}
function MySQLTryDelete($SQL){
return MySQLTryUpdate($SQL);
}
function MySQLCreateTable($SQL){
return MySQLTryUpdate($SQL);
}
function MySQLDropTable($SQL){
return MySQLTryUpdate($SQL);
}
//自定义的MySQL强制更新数据库的函数(成功返回true,失败或【实际影响的行数为0】返回false)
function MySQLMustUpdate($SQL){
global $Connect;
//mysqli_query函数会自动对记录集进行读取和缓存
//mysqli_query($Connect,query,connection)的参数connection如果未规定,则使用上一个打开的连接
//mysqli_query返回非false的值,不说明任何有关影响到的或返回的行数,很有可能一条查询执行成功了但并未影响到或并未返回任何行
$result = mysqli_query($Connect,$SQL);
//2006和2013错误则重试一次
if(!$result && in_array(mysqli_errno($Connect), array(2006, 2013))){
MySQLDisconnect();
MySQLConnect();
$result = mysqli_query($Connect,$SQL);
}
if(!$result){
return false;
}
if(mysqli_affected_rows()===0){
return false;
}
return $result;
}
function MySQLMustDelete($SQL){
return MySQLMustUpdate($SQL);
}
//自定义的MySQL读取数据库的函数(成功返回数据的关联和默认下标数组,失败返回false)
function MySQLSelectArray($SQL){
global $Connect;
$result = mysqli_query($Connect,$SQL);
//2006和2013错误则重试一次
if(!$result && in_array(mysqli_errno($Connect), array(2006, 2013))){
MySQLDisconnect();
MySQLConnect();
$result = mysqli_query($Connect,$SQL);
}
if(!$result){
return false;
}
$data = array();
$row = mysqli_fetch_array($result);
while ($row){
ResultTransform($row);
$data[] = $row;
$row = mysqli_fetch_array($result);
}
return $data;
}
//自定义的MySQL读取数据库的函数(成功只返回数据的默认下标数组,失败返回false)
function MySQLSelectDefaultArray($SQL){
global $Connect;
$result = mysqli_query($Connect,$SQL);
//2006和2013错误则重试一次
if(!$result && in_array(mysqli_errno($Connect), array(2006, 2013))){
MySQLDisconnect();
MySQLConnect();
$result = mysqli_query($Connect,$SQL);
}
if(!$result){
return false;
}
$data = array();
$row = mysqli_fetch_row($result);
while ($row){
ResultTransform($row);
$data[] = $row;
$row = mysqli_fetch_row($result);
}
return $data;
}
//自定义的MySQL读取数据库的函数(成功只返回数据的关联数组,失败返回false)
function MySQLSelectAssociativeArray($SQL){
global $Connect;
$result = mysqli_query($Connect,$SQL);
//2006和2013错误则重试一次
if(!$result && in_array(mysqli_errno($Connect), array(2006, 2013))){
MySQLDisconnect();
MySQLConnect();
$result = mysqli_query($Connect,$SQL);
}
if(!$result){
return false;
}
$data = array();
$row = mysqli_fetch_assoc($result);
while ($row){
ResultTransform($row);
$data[] = $row;
$row = mysqli_fetch_assoc($result);
}
return $data;
}
//自定义的MySQL读取数据库(一行)的函数(成功返回数据的关联和默认下标数组,失败或【查询到的行数为0】返回false)
function MySQLSelectRow($SQL){
global $Connect;
$result = mysqli_query($Connect,$SQL);
//2006和2013错误则重试一次
if(!$result && in_array(mysqli_errno($Connect), array(2006, 2013))){
MySQLDisconnect();
MySQLConnect();
$result = mysqli_query($Connect,$SQL);
}
if(!$result){
return false;
}
$row = mysqli_fetch_array($result);
if (!$row){ return false; }
ResultTransform($row);
return $row;
}
//自定义的MySQL读取数据库(一行)的函数(成功只返回数据的默认下标数组,失败或【查询到的行数为0】返回false)
function MySQLSelectDefaultRow($SQL){
global $Connect;
$result = mysqli_query($Connect,$SQL);
//2006和2013错误则重试一次
if(!$result && in_array(mysqli_errno($Connect), array(2006, 2013))){
MySQLDisconnect();
MySQLConnect();
$result = mysqli_query($Connect,$SQL);
}
if(!$result){
return false;
}
$row = mysqli_fetch_row($result);
if (!$row){ return false; }
ResultTransform($row);
return $row;
}
//自定义的MySQL读取数据库(一行)的函数(成功只返回数据的关联数组,失败或【查询到的行数为0】返回false)
function MySQLSelectAssociativeRow($SQL){
global $Connect;
$result = mysqli_query($Connect,$SQL);
//2006和2013错误则重试一次
if(!$result && in_array(mysqli_errno($Connect), array(2006, 2013))){
MySQLDisconnect();
MySQLConnect();
$result = mysqli_query($Connect,$SQL);
}
if(!$result){
return false;
}
$row = mysqli_fetch_assoc($result);
if (!$row){ return false; }
ResultTransform($row);
return $row;
}
//自定义的MySQL读取数据库(一格)的函数(成功返回数据,失败或【查询到的行数为0】返回false)
function MySQLSelectCell($SQL){
global $Connect;
$result = mysqli_query($Connect,$SQL);
//2006和2013错误则重试一次
if(!$result && in_array(mysqli_errno($Connect), array(2006, 2013))){
MySQLDisconnect();
MySQLConnect();
$result = mysqli_query($Connect,$SQL);
}
if(!$result){
return false;
}
$row = mysqli_fetch_row($result);
if (!$row){ return false; }
ResultTransform($row);
$row = $row[0];
return $row;
}
function MySQLSelectDefaultCell($SQL){
return MySQLSelectCell($SQL);
}
function MySQLSelectAssociativeCell($SQL){
return MySQLSelectCell($SQL);
}
//SQL结果集解析的函数(成功返回数据的关联和默认下标数组,失败返回false)
function MySQLFetchAllArray($result){
$data = array();
if($result===false){return $data;}
$row = mysqli_fetch_array($result);
while ($row){
ResultTransform($row);
$data[] = $row;
$row = mysqli_fetch_array($result);
}
return $data;
}
//SQL结果集解析的函数(成功只返回数据的默认下标数组,失败返回false)
function MySQLFetchDefaultArray($result){
$data = array();
if($result===false){return $data;}
$row = mysqli_fetch_row($result);
while ($row){
ResultTransform($row);
$data[] = $row;
$row = mysqli_fetch_row($result);
}
return $data;
}
//SQL结果集解析的函数(成功只返回数据的关联数组,失败返回false)
function MySQLFetchAssociativeArray($result){
$data = array();
if($result===false){return $data;}
$row = mysqli_fetch_assoc($result);
while ($row){
ResultTransform($row);
$data[] = $row;
$row = mysqli_fetch_assoc($result);
}
return $data;
}
//获取MySQL版本号的函数
function MySQLVersion(){
return mysqli_get_server_info();
}
//获取MySQL当前运行的线程信息的函数
function MySQLProcesses(){
return MySQLFetchAssociativeArray(mysqli_list_processes());
}
//自定义的结果集处理函数,将NULL值和JSON字符串做转换
function ResultTransform(&$Array){
foreach ($Array as &$Item){
$Item = ($Item!==null) ? $Item : '';
$temp = json_decode($Item,true);
//PHP语言,数组变量的=号赋值,是进行的值的Copy,而不是指针的Copy
$Item = ($temp===null) ? $Item : $temp;
}
//因为有这个函数的存在,所以MySQLSelectCell可能返回的是一个数组
}
//自定义的SQL防止注入检查的函数
function MySQLCheck(&$value)
{
global $Connect;
//去除斜杠(服务器配置给予的转义斜杠)
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
//如果不是数字则加引号(专业的转义函数)
if (!is_numeric($value))
{
$value = "'" . mysqli_real_escape_string($Connect,$value) . "'";
}
return $value;
//示例用法:
//$user = SQLCheck($_POST['user']);
//$pwd = SQLCheck($_POST['pwd']);
//$sql = "SELECT * FROM users WHERE user = $user AND password = $pwd";
}
//自定义的生成Select内连接查询的SQL语句的函数
function MySQLCreateSelect($Table,$Column,$Condition){
$num_args=func_num_args();
if($num_args === 0 || $num_args % 3 !== 0){
return false;
}
$get_args=func_get_args();
$TableString = '';
$ColumnString = '';
$ConditionString = '';
for($I = 0; $I < $num_args; $I = $I +3){
$temp = $get_args[$I];
$TableString .='`'.$temp.'` , ';
foreach($get_args[$I+1] as $column){
$ColumnString .= '`'.$temp.'`.`'.$column.'` , ';
}
foreach($get_args[$I+2] as $key => $value){
if(is_array($value)===false){
if(is_numeric($value)===false && strpos($value,'.')!==false){//参数$value为"表名.字段"
$value = '`' . str_replace('.','`.`',$value) . '`';//补充"`"符号
}
$ConditionString .= '`'.$temp.'`.`' . $key . '` = ' . $value . ' and ';
}
else{
$ConditionString .= '( ';
foreach($value as $v){
if(is_numeric($v)===false && strpos($v,'.')!==false){//参数$value包含"表名.字段"
$v = '`' . str_replace('.','`.`',$v) . '`';//补充"`"符号
}
$ConditionString .= '`'.$temp.'`.`' . $key . '` = ' . $v . ' or ';
}
$ConditionString = substr($ConditionString,0,strlen($ConditionString)-3);
$ConditionString .= ') and ';
}
}
}
$TableString= substr($TableString,0,strlen($TableString)-2);
$ColumnString= substr($ColumnString,0,strlen($ColumnString)-2);
$ConditionString= substr($ConditionString,0,strlen($ConditionString)-5);
return 'select ' . $ColumnString . 'from ' . $TableString . 'where ' . $ConditionString. ';' ;
//代码示例(单表查询):
//MySQLCreateSelect( "user_info" , array("id","name") , array("id"=>array("1","2")) );
//var_dump(MySQLCreateSelect("user_info",array("id","name"),array("id"=>array("1","2"))));
//返回值:select `user_info`.`id` , `user_info`.`name` from `user_info` where ( `user_info`.`id` = 1 or `user_info`.`id` = 2 );
//代码示例(多表内连接查询):
//MySQLCreateSelect("user_info",array("id","name"),array("id"=>array("1","2")) , "order_info",array("id","time"),array("user_id"=>"user_info.id") );
//var_dump(MySQLCreateSelect("user_info",array("id","name"),array("id"=>array("1","2")) , "order_info",array("id","time"),array("user_id"=>"user_info.id") ));
//返回值:select `user_info`.`id` , `user_info`.`name` , `order_info`.`id` , `order_info`.`time` from `user_info` , `order_info` where ( `user_info`.`id` = 1 or `user_info`.`id` = 2 ) and `order_info`.`user_id` = `user_info`.`id`;
}
//示例使用代码:
/*
MySQLConnect();
var_dump(json_encode(MySQLSelectAssociativeRow('SELECT * FROM `DDOS_Student_Class` LIMIT 0 , 1')));
var_dump(json_encode(array("1"=>"\r\n")));
var_dump(MySQLProcesses());
var_dump(MySQLVersion());
*/
?>