1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
database.php
См. документацию.
1<?php
2
9
11
13{
16 public $type = "MYSQL";
17 public
18 $escL = '`',
19 $escR = '`';
20
25 public function Disconnect()
26 {
27 $this->connection?->disconnect();
28 }
29
30 public static function CurrentTimeFunction()
31 {
32 return "now()";
33 }
34
35 public static function CurrentDateFunction()
36 {
37 return "CURRENT_DATE";
38 }
39
40 public function DateFormatToDB($format, $field = false)
41 {
42 static $search = [
43 "YYYY",
44 "MMMM",
45 "MM",
46 "MI",
47 "DD",
48 "HH",
49 "GG",
50 "G",
51 "SS",
52 "TT",
53 ];
54 static $replace = [
55 "%Y",
56 "%M",
57 "%m",
58 "%i",
59 "%d",
60 "%H",
61 "%h",
62 "%l",
63 "%s",
64 "%p",
65 ];
66
67 $format = str_replace($search, $replace, $format);
68
69 if (!str_contains($format, '%H'))
70 {
71 $format = str_replace("H", "%h", $format);
72 }
73
74 if (!str_contains($format, '%M'))
75 {
76 $format = str_replace("M", "%b", $format);
77 }
78
79 $lowerAmPm = false;
80 if (str_contains($format, 'T'))
81 {
82 //lowercase am/pm
83 $lowerAmPm = true;
84 $format = str_replace("T", "%p", $format);
85 }
86
87 if ($field === false)
88 {
89 $field = "#FIELD#";
90 }
91
92 if ($lowerAmPm)
93 {
94 return "REPLACE(REPLACE(DATE_FORMAT(" . $field . ", '" . $format . "'), 'PM', 'pm'), 'AM', 'am')";
95 }
96
97 return "DATE_FORMAT(" . $field . ", '" . $format . "')";
98 }
99
100 public function DatetimeToTimestampFunction($fieldName)
101 {
102 $timeZone = "";
103 if (CTimeZone::Enabled())
104 {
105 static $diff = false;
106 if ($diff === false)
107 {
108 $diff = CTimeZone::GetOffset();
109 }
110
111 if ($diff <> 0)
112 {
113 $timeZone = $diff > 0 ? "+" . $diff : $diff;
114 }
115 }
116 return "UNIX_TIMESTAMP(" . $fieldName . ")" . $timeZone;
117 }
118
119 public function DatetimeToDateFunction($strValue)
120 {
121 return 'DATE(' . $strValue . ')';
122 }
123
124 // 1 if date1 > date2
125 // 0 if date1 = date2
126 // -1 if date1 < date2
127 public function CompareDates($date1, $date2)
128 {
129 $s_date1 = $this->CharToDateFunction($date1);
130 $s_date2 = $this->CharToDateFunction($date2);
131 $strSql = "
132 SELECT
133 if($s_date1 > $s_date2, 1,
134 if ($s_date1 < $s_date2, -1,
135 if ($s_date1 = $s_date2, 0, 'x')
136 )) as RES
137 ";
138 $z = $this->Query($strSql);
139 $zr = $z->Fetch();
140 return $zr["RES"];
141 }
142
143 public function PrepareFields($strTableName, $strPrefix = "str_", $strSuffix = "")
144 {
145 $arColumns = $this->GetTableFields($strTableName);
146 foreach ($arColumns as $arColumn)
147 {
148 $column = $arColumn["NAME"];
149 $type = $arColumn["TYPE"];
150 global $$column;
151 $var = $strPrefix . $column . $strSuffix;
152 global $$var;
153 switch ($type)
154 {
155 case "int":
156 $$var = intval($$column);
157 break;
158 case "real":
159 $$var = doubleval($$column);
160 break;
161 default:
162 $$var = $this->ForSql($$column);
163 }
164 }
165 }
166
167 public function PrepareInsert($strTableName, $arFields)
168 {
169 $strInsert1 = "";
170 $strInsert2 = "";
171
172 $arColumns = $this->GetTableFields($strTableName);
173 foreach ($arColumns as $strColumnName => $arColumnInfo)
174 {
175 $type = $arColumnInfo["TYPE"];
176 if (isset($arFields[$strColumnName]))
177 {
178 if ($strInsert1 != '')
179 {
180 $strInsert1 .= ', ';
181 $strInsert2 .= ', ';
182 }
183
184 $value = $arFields[$strColumnName];
185
186 $strInsert1 .= "`" . $strColumnName . "`";
187
188 if ($value === false)
189 {
190 $strInsert2 .= "NULL";
191 }
192 else
193 {
194 switch ($type)
195 {
196 case "datetime":
197 case "timestamp":
198 if ($value == '')
199 {
200 $strInsert2 .= "NULL";
201 }
202 else
203 {
204 $strInsert2 .= CDatabase::CharToDateFunction($value);
205 }
206 break;
207 case "date":
208 if ($value == '')
209 {
210 $strInsert2 .= "NULL";
211 }
212 else
213 {
214 $strInsert2 .= CDatabase::CharToDateFunction($value, "SHORT");
215 }
216 break;
217 case "int":
218 $strInsert2 .= "'" . intval($value) . "'";
219 break;
220 case "real":
221 $value = doubleval($value);
222 if (!is_finite($value))
223 {
224 $value = 0;
225 }
226 $strInsert2 .= "'" . $value . "'";
227 break;
228 default:
229 $strInsert2 .= "'" . $this->ForSql($value) . "'";
230 }
231 }
232 }
233 elseif (array_key_exists("~" . $strColumnName, $arFields))
234 {
235 if ($strInsert1 != '')
236 {
237 $strInsert1 .= ', ';
238 $strInsert2 .= ', ';
239 }
240 $strInsert1 .= "`" . $strColumnName . "`";
241 $strInsert2 .= $arFields["~" . $strColumnName];
242 }
243 }
244
245 return [$strInsert1, $strInsert2];
246 }
247
248 public function PrepareUpdate($strTableName, $arFields, $strFileDir = "", $lang = false, $strTableAlias = "")
249 {
250 $arBinds = [];
251 return $this->PrepareUpdateBind($strTableName, $arFields, $strFileDir, $lang, $arBinds, $strTableAlias);
252 }
253
254 public function PrepareUpdateBind($strTableName, $arFields, $strFileDir, $lang, &$arBinds, $strTableAlias = "")
255 {
256 $arBinds = [];
257 if ($strTableAlias != "")
258 {
259 $strTableAlias .= ".";
260 }
261 $strUpdate = "";
262 $arColumns = $this->GetTableFields($strTableName);
263 foreach ($arColumns as $strColumnName => $arColumnInfo)
264 {
265 $type = $arColumnInfo["TYPE"];
266 if (isset($arFields[$strColumnName]))
267 {
268 if ($strUpdate != '')
269 {
270 $strUpdate .= ', ';
271 }
272
273 $value = $arFields[$strColumnName];
274
275 if ($value === false)
276 {
277 $strUpdate .= $strTableAlias . "`" . $strColumnName . "` = NULL";
278 }
279 elseif ($value instanceof SqlExpression)
280 {
281 $strUpdate .= $strTableAlias . "`" . $strColumnName . "` = " . $value->compile();
282 }
283 else
284 {
285 switch ($type)
286 {
287 case "int":
288 $value = intval($value);
289 break;
290 case "real":
291 $value = doubleval($value);
292 if (!is_finite($value))
293 {
294 $value = 0;
295 }
296 break;
297 case "datetime":
298 case "timestamp":
299 if ($value == '')
300 {
301 $value = "NULL";
302 }
303 else
304 {
305 $value = CDatabase::CharToDateFunction($value, "FULL", $lang);
306 }
307 break;
308 case "date":
309 if ($value == '')
310 {
311 $value = "NULL";
312 }
313 else
314 {
315 $value = CDatabase::CharToDateFunction($value, "SHORT", $lang);
316 }
317 break;
318 default:
319 $value = "'" . $this->ForSql($value) . "'";
320 }
321 $strUpdate .= $strTableAlias . "`" . $strColumnName . "` = " . $value;
322 }
323 }
324 elseif (is_set($arFields, "~" . $strColumnName))
325 {
326 if ($strUpdate != '')
327 {
328 $strUpdate .= ', ';
329 }
330 $strUpdate .= $strTableAlias . "`" . $strColumnName . "` = " . $arFields["~" . $strColumnName];
331 }
332 }
333
334 return $strUpdate;
335 }
336
337 public function PrepareUpdateJoin($strTableName, $arFields, $from, $where)
338 {
339 $tables = $strTableName;
340 foreach ($from as $join)
341 {
342 $tables .= "\n INNER JOIN " . $join[0] . ' ON ' . $join[1];
343 }
344 $fields = '';
345 foreach ($arFields as $fieldName => $fieldValue)
346 {
347 $fields .= ($fields ? ",\n " : "") . $strTableName . '.' . $fieldName . '=' . $fieldValue;
348 }
349 $update = 'UPDATE ' . $tables . "\n"
350 . "SET\n " . $fields . "\n"
351 . ($where ? "\nWHERE" . $where : "");
352 return $update;
353 }
354
355 public function Insert($table, $arFields, $error_position = "", $DEBUG = false, $EXIST_ID = "", $ignore_errors = false)
356 {
357 if (!is_array($arFields))
358 {
359 return false;
360 }
361
362 $str1 = "";
363 $str2 = "";
364 foreach ($arFields as $field => $value)
365 {
366 $str1 .= ($str1 <> "" ? ", " : "") . $this->quote($field);
367 if ((string)$value == '')
368 {
369 $str2 .= ($str2 <> "" ? ", " : "") . "''";
370 }
371 else
372 {
373 $str2 .= ($str2 <> "" ? ", " : "") . $value;
374 }
375 }
376
377 if ($EXIST_ID <> '')
378 {
379 $strSql = "INSERT INTO " . $table . "(ID," . $str1 . ") VALUES ('" . $this->ForSql($EXIST_ID) . "'," . $str2 . ")";
380 }
381 else
382 {
383 $strSql = "INSERT INTO " . $table . "(" . $str1 . ") VALUES (" . $str2 . ")";
384 }
385
386 if ($DEBUG)
387 {
388 echo "<br>" . htmlspecialcharsEx($strSql) . "<br>";
389 }
390
391 $res = $this->Query($strSql, $ignore_errors, $error_position);
392
393 if ($res === false)
394 {
395 return false;
396 }
397
398 if ($EXIST_ID <> '')
399 {
400 return $EXIST_ID;
401 }
402 else
403 {
404 return $this->LastID();
405 }
406 }
407
408 public function Add($tablename, $arFields, $arCLOBFields = [], $strFileDir = "", $ignore_errors = false, $error_position = "", $arOptions = [])
409 {
410 global $DB;
411
412 if (!isset($this) || !is_object($this) || !isset($this->type))
413 {
414 return $DB->Add($tablename, $arFields, $arCLOBFields, $strFileDir, $ignore_errors, $error_position, $arOptions);
415 }
416 else
417 {
418 $arInsert = $this->PrepareInsert($tablename, $arFields);
419 $strSql =
420 "INSERT INTO " . $tablename . "(" . $arInsert[0] . ") " .
421 "VALUES(" . $arInsert[1] . ")";
422 $this->Query($strSql, $ignore_errors, $error_position, $arOptions);
423 return $this->LastID();
424 }
425 }
426
427 public function LockTables($str)
428 {
429 register_shutdown_function([&$this, "UnLockTables"]);
430 $this->Query("LOCK TABLE " . $str, false, '', ["fixed_connection" => true]);
431 }
432
433 public function UnLockTables()
434 {
435 $this->Query("UNLOCK TABLES", true, '', ["fixed_connection" => true]);
436 }
437
438 public function ToChar($expr, $len = 0)
439 {
440 return $expr;
441 }
442
443 public function Instr($str, $toFind)
444 {
445 return "INSTR($str, $toFind)";
446 }
447
448 public function CreateIndex($indexName, $tableName, $columns, $unique = false, $fulltext = false)
449 {
450 foreach ($columns as $i => $columnName)
451 {
452 $columns[$i] = $this->quote($columnName);
453 }
454
455 if ($unique)
456 {
457 $indexType = 'UNIQUE';
458 }
459 elseif ($fulltext)
460 {
461 $indexType = 'FULLTEXT';
462 }
463 else
464 {
465 $indexType = '';
466 }
467
468 return $this->Query('CREATE ' . $indexType . ' INDEX ' . $this->quote($indexName) . ' ON ' . $this->quote($tableName) . '(' . implode(',', $columns) . ')', true);
469 }
470
471 protected function QueryInternal($strSql)
472 {
473 return mysqli_query($this->db_Conn, $strSql);
474 }
475
476 protected function GetError()
477 {
478 return "(" . $this->GetErrorCode() . ") " . mysqli_error($this->db_Conn);
479 }
480
481 protected function GetErrorCode()
482 {
483 return mysqli_errno($this->db_Conn);
484 }
485
486 public function ForSqlLike($strValue, $iMaxLength = 0)
487 {
488 if ($iMaxLength > 0)
489 {
490 $strValue = mb_substr($strValue ?? '', 0, $iMaxLength);
491 }
492
493 $this->DoConnect();
494 return mysqli_real_escape_string($this->db_Conn, str_replace("\\", "\\\\", $strValue ?? ''));
495 }
496
497 public function GetTableFields($table)
498 {
499 if (!isset($this->column_cache[$table]))
500 {
501 $this->column_cache[$table] = [];
502 $this->DoConnect();
503
504 $dbResult = $this->query("SELECT * FROM " . $this->quote($table) . " LIMIT 0");
505
506 $resultFields = mysqli_fetch_fields($dbResult->result);
507 foreach ($resultFields as $field)
508 {
509 switch ($field->type)
510 {
511 case MYSQLI_TYPE_TINY:
512 case MYSQLI_TYPE_SHORT:
513 case MYSQLI_TYPE_LONG:
514 case MYSQLI_TYPE_INT24:
515 case MYSQLI_TYPE_CHAR:
516 $type = "int";
517 break;
518
519 case MYSQLI_TYPE_DECIMAL:
520 case MYSQLI_TYPE_NEWDECIMAL:
521 case MYSQLI_TYPE_FLOAT:
522 case MYSQLI_TYPE_DOUBLE:
523 $type = "real";
524 break;
525
526 case MYSQLI_TYPE_DATETIME:
527 case MYSQLI_TYPE_TIMESTAMP:
528 $type = "datetime";
529 break;
530
531 case MYSQLI_TYPE_DATE:
532 case MYSQLI_TYPE_NEWDATE:
533 $type = "date";
534 break;
535
536 default:
537 $type = "string";
538 break;
539 }
540
541 $this->column_cache[$table][$field->name] = [
542 "NAME" => $field->name,
543 "TYPE" => $type,
544 ];
545 }
546 }
547 return $this->column_cache[$table];
548 }
549
550 protected function getThreadId()
551 {
552 return mysqli_thread_id($this->db_Conn);
553 }
554}
555
557{
558}
Определения database.php:15
DoConnect($connectionName='')
Определения database.php:239
LastID()
Определения database.php:538
Query($strSql, $bIgnoreErrors=false, $error_position="", $arOptions=[])
Определения database.php:556
CharToDateFunction($strValue, $strType="FULL", $lang=false)
Определения database.php:389
ForSql($strValue, $iMaxLength=0)
Определения database.php:697
quote($identifier)
Определения database.php:709
Определения database.php:557
Определения database.php:13
$db_Conn
Определения database.php:15
PrepareUpdate($strTableName, $arFields, $strFileDir="", $lang=false, $strTableAlias="")
Определения database.php:248
ForSqlLike($strValue, $iMaxLength=0)
Определения database.php:486
GetErrorCode()
Определения database.php:481
LockTables($str)
Определения database.php:427
GetTableFields($table)
Определения database.php:497
UnLockTables()
Определения database.php:433
Instr($str, $toFind)
Определения database.php:443
PrepareInsert($strTableName, $arFields)
Определения database.php:167
ToChar($expr, $len=0)
Определения database.php:438
DatetimeToDateFunction($strValue)
Определения database.php:119
$escL
Определения database.php:18
PrepareUpdateBind($strTableName, $arFields, $strFileDir, $lang, &$arBinds, $strTableAlias="")
Определения database.php:254
Insert($table, $arFields, $error_position="", $DEBUG=false, $EXIST_ID="", $ignore_errors=false)
Определения database.php:355
Add($tablename, $arFields, $arCLOBFields=[], $strFileDir="", $ignore_errors=false, $error_position="", $arOptions=[])
Определения database.php:408
CompareDates($date1, $date2)
Определения database.php:127
static CurrentDateFunction()
Определения database.php:35
static CurrentTimeFunction()
Определения database.php:30
DatetimeToTimestampFunction($fieldName)
Определения database.php:100
$escR
Определения database.php:19
DateFormatToDB($format, $field=false)
Определения database.php:40
getThreadId()
Определения database.php:550
CreateIndex($indexName, $tableName, $columns, $unique=false, $fulltext=false)
Определения database.php:448
$type
Определения database.php:16
PrepareUpdateJoin($strTableName, $arFields, $from, $where)
Определения database.php:337
QueryInternal($strSql)
Определения database.php:471
GetError()
Определения database.php:476
Disconnect()
Определения database.php:25
PrepareFields($strTableName, $strPrefix="str_", $strSuffix="")
Определения database.php:143
$str
Определения commerceml2.php:63
$arFields
Определения dblapprove.php:5
$res
Определения filter_act.php:7
$zr
Определения options.php:5
global $DB
Определения cron_frame.php:29
if(!defined('SITE_ID')) $lang
Определения include.php:91
$z
Определения options.php:31
$arOptions
Определения structure.php:223
htmlspecialcharsEx($str)
Определения tools.php:2685
is_set($a, $k=false)
Определения tools.php:2133
$var
Определения payment.php:63
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$i
Определения factura.php:643
$dbResult
Определения updtr957.php:3
$fields
Определения yandex_run.php:501