|
|
|
@ -1,5 +1,4 @@
|
|
|
|
|
<?php |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @author col.shrapnel@gmail.com |
|
|
|
|
* @link http://phpfaq.ru/safemysql |
|
|
|
@ -66,64 +65,16 @@
|
|
|
|
|
* $data = $db->getAll("SELECT * FROM table WHERE ?p", $bar, $sqlpart); |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
class SafeMySQL { |
|
|
|
|
#########################ТВИКИ ОТ ЗУМА###################### |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* удаляет строки из таблицы, принимает массив вида |
|
|
|
|
* 0=>имя таблицы |
|
|
|
|
* 1=>поле в таблице |
|
|
|
|
* 2=>чему равно |
|
|
|
|
* |
|
|
|
|
* @param array $array |
|
|
|
|
*/ |
|
|
|
|
public function removeRows($array) { |
|
|
|
|
foreach ($array as $task) { |
|
|
|
|
$this->query("DELETE FROM ?n WHERE ?n = ?i", $task[0], $task[1], $task[2]); |
|
|
|
|
//$wpdb->delete($task[0], array($task[1] => $task[2])); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
class SafeMySQL |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Возвращает sql для объединения таблиц |
|
|
|
|
* Принимает массива вида |
|
|
|
|
* array(array('name'=>'table1','field'=>'field1'),array('name'=>'table2','field'=>'field2')); |
|
|
|
|
* |
|
|
|
|
* @param string $sql |
|
|
|
|
*/ |
|
|
|
|
public function selectLeftJoin($tables) { |
|
|
|
|
$sql = "SELECT * FROM `" . $tables . "`"; |
|
|
|
|
foreach ($ons as $k => $table) { |
|
|
|
|
$sql .= " LEFT JOIN `" . $table[0]['name'] . "` ON `" . $table[1]['name'] . "`.`" . $table[1]['field'] . "`=`" . $table[0]['name'] . "`.`" . $table[0]['field'] . "`"; |
|
|
|
|
} |
|
|
|
|
return $sql; |
|
|
|
|
} |
|
|
|
|
private $conn; |
|
|
|
|
private $stats; |
|
|
|
|
private $emode; |
|
|
|
|
private $exname; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Возвращает стандартную функцию обновления |
|
|
|
|
* |
|
|
|
|
* @return string UPDATE ?n SET ?u WHERE `id` = ?i |
|
|
|
|
*/ |
|
|
|
|
public function updTempl() { |
|
|
|
|
return "UPDATE ?n SET ?u WHERE `id` = ?i"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Возвращает стандартную функцию вставки |
|
|
|
|
* |
|
|
|
|
* @return string INSERT INTO ?n SET ?u |
|
|
|
|
*/ |
|
|
|
|
public function insTempl() { |
|
|
|
|
return "INSERT INTO ?n SET ?u"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
############################################################ |
|
|
|
|
|
|
|
|
|
protected $conn; |
|
|
|
|
protected $stats; |
|
|
|
|
protected $emode; |
|
|
|
|
protected $exname; |
|
|
|
|
protected $defaults = array( |
|
|
|
|
private $defaults = array( |
|
|
|
|
'host' => 'localhost', |
|
|
|
|
'user' => 'root', |
|
|
|
|
'pass' => '', |
|
|
|
@ -139,28 +90,34 @@ class SafeMySQL {
|
|
|
|
|
const RESULT_ASSOC = MYSQLI_ASSOC; |
|
|
|
|
const RESULT_NUM = MYSQLI_NUM; |
|
|
|
|
|
|
|
|
|
function __construct($opt = array()) { |
|
|
|
|
function __construct($opt = array()) |
|
|
|
|
{ |
|
|
|
|
$opt = array_merge($this->defaults,$opt); |
|
|
|
|
|
|
|
|
|
$this->emode = $opt['errmode']; |
|
|
|
|
$this->exname = $opt['exception']; |
|
|
|
|
|
|
|
|
|
if (isset($opt['mysqli'])) { |
|
|
|
|
if ($opt['mysqli'] instanceof mysqli) { |
|
|
|
|
if (isset($opt['mysqli'])) |
|
|
|
|
{ |
|
|
|
|
if ($opt['mysqli'] instanceof mysqli) |
|
|
|
|
{ |
|
|
|
|
$this->conn = $opt['mysqli']; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
|
|
$this->error("mysqli option must be valid instance of mysqli class"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($opt['pconnect']) { |
|
|
|
|
if ($opt['pconnect']) |
|
|
|
|
{ |
|
|
|
|
$opt['host'] = "p:".$opt['host']; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@$this->conn = mysqli_connect($opt['host'], $opt['user'], $opt['pass'], $opt['db'], $opt['port'], $opt['socket']); |
|
|
|
|
if (!$this->conn) { |
|
|
|
|
if ( !$this->conn ) |
|
|
|
|
{ |
|
|
|
|
$this->error(mysqli_connect_errno()." ".mysqli_connect_error()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -178,7 +135,8 @@ class SafeMySQL {
|
|
|
|
|
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query |
|
|
|
|
* @return resource|FALSE whatever mysqli_query returns |
|
|
|
|
*/ |
|
|
|
|
public function query() { |
|
|
|
|
public function query() |
|
|
|
|
{ |
|
|
|
|
return $this->rawQuery($this->prepareQuery(func_get_args())); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -189,7 +147,8 @@ class SafeMySQL {
|
|
|
|
|
* @param int $mode - optional fetch mode, RESULT_ASSOC|RESULT_NUM, default RESULT_ASSOC |
|
|
|
|
* @return array|FALSE whatever mysqli_fetch_array returns |
|
|
|
|
*/ |
|
|
|
|
public function fetch($result, $mode = self::RESULT_ASSOC) { |
|
|
|
|
public function fetch($result,$mode=self::RESULT_ASSOC) |
|
|
|
|
{ |
|
|
|
|
return mysqli_fetch_array($result, $mode); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -198,7 +157,8 @@ class SafeMySQL {
|
|
|
|
|
* |
|
|
|
|
* @return int whatever mysqli_affected_rows returns |
|
|
|
|
*/ |
|
|
|
|
public function affectedRows() { |
|
|
|
|
public function affectedRows() |
|
|
|
|
{ |
|
|
|
|
return mysqli_affected_rows ($this->conn); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -207,7 +167,8 @@ class SafeMySQL {
|
|
|
|
|
* |
|
|
|
|
* @return int whatever mysqli_insert_id returns |
|
|
|
|
*/ |
|
|
|
|
public function insertId() { |
|
|
|
|
public function insertId() |
|
|
|
|
{ |
|
|
|
|
return mysqli_insert_id($this->conn); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -217,14 +178,16 @@ class SafeMySQL {
|
|
|
|
|
* @param resource $result - myqli result |
|
|
|
|
* @return int whatever mysqli_num_rows returns |
|
|
|
|
*/ |
|
|
|
|
public function numRows($result) { |
|
|
|
|
public function numRows($result) |
|
|
|
|
{ |
|
|
|
|
return mysqli_num_rows($result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Conventional function to free the resultset. |
|
|
|
|
*/ |
|
|
|
|
public function free($result) { |
|
|
|
|
public function free($result) |
|
|
|
|
{ |
|
|
|
|
mysqli_free_result($result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -239,9 +202,11 @@ class SafeMySQL {
|
|
|
|
|
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query |
|
|
|
|
* @return string|FALSE either first column of the first row of resultset or FALSE if none found |
|
|
|
|
*/ |
|
|
|
|
public function getOne() { |
|
|
|
|
public function getOne() |
|
|
|
|
{ |
|
|
|
|
$query = $this->prepareQuery(func_get_args()); |
|
|
|
|
if ($res = $this->rawQuery($query)) { |
|
|
|
|
if ($res = $this->rawQuery($query)) |
|
|
|
|
{ |
|
|
|
|
$row = $this->fetch($res); |
|
|
|
|
if (is_array($row)) { |
|
|
|
|
return reset($row); |
|
|
|
@ -256,13 +221,14 @@ class SafeMySQL {
|
|
|
|
|
* |
|
|
|
|
* Examples: |
|
|
|
|
* $data = $db->getRow("SELECT * FROM table WHERE id=1"); |
|
|
|
|
* $data = $db->getRow("SELECT * FROM table WHERE id=?i", $id); |
|
|
|
|
* $data = $db->getOne("SELECT * FROM table WHERE id=?i", $id); |
|
|
|
|
* |
|
|
|
|
* @param string $query - an SQL query with placeholders |
|
|
|
|
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query |
|
|
|
|
* @return array|FALSE either associative array contains first row of resultset or FALSE if none found |
|
|
|
|
*/ |
|
|
|
|
public function getRow() { |
|
|
|
|
public function getRow() |
|
|
|
|
{ |
|
|
|
|
$query = $this->prepareQuery(func_get_args()); |
|
|
|
|
if ($res = $this->rawQuery($query)) { |
|
|
|
|
$ret = $this->fetch($res); |
|
|
|
@ -283,11 +249,14 @@ class SafeMySQL {
|
|
|
|
|
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query |
|
|
|
|
* @return array|FALSE either enumerated array of first fields of all rows of resultset or FALSE if none found |
|
|
|
|
*/ |
|
|
|
|
public function getCol() { |
|
|
|
|
public function getCol() |
|
|
|
|
{ |
|
|
|
|
$ret = array(); |
|
|
|
|
$query = $this->prepareQuery(func_get_args()); |
|
|
|
|
if ($res = $this->rawQuery($query)) { |
|
|
|
|
while ($row = $this->fetch($res)) { |
|
|
|
|
if ( $res = $this->rawQuery($query) ) |
|
|
|
|
{ |
|
|
|
|
while($row = $this->fetch($res)) |
|
|
|
|
{ |
|
|
|
|
$ret[] = reset($row); |
|
|
|
|
} |
|
|
|
|
$this->free($res); |
|
|
|
@ -306,11 +275,14 @@ class SafeMySQL {
|
|
|
|
|
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query |
|
|
|
|
* @return array enumerated 2d array contains the resultset. Empty if no rows found. |
|
|
|
|
*/ |
|
|
|
|
public function getAll() { |
|
|
|
|
public function getAll() |
|
|
|
|
{ |
|
|
|
|
$ret = array(); |
|
|
|
|
$query = $this->prepareQuery(func_get_args()); |
|
|
|
|
if ($res = $this->rawQuery($query)) { |
|
|
|
|
while ($row = $this->fetch($res)) { |
|
|
|
|
if ( $res = $this->rawQuery($query) ) |
|
|
|
|
{ |
|
|
|
|
while($row = $this->fetch($res)) |
|
|
|
|
{ |
|
|
|
|
$ret[] = $row; |
|
|
|
|
} |
|
|
|
|
$this->free($res); |
|
|
|
@ -330,14 +302,17 @@ class SafeMySQL {
|
|
|
|
|
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query |
|
|
|
|
* @return array - associative 2d array contains the resultset. Empty if no rows found. |
|
|
|
|
*/ |
|
|
|
|
public function getInd() { |
|
|
|
|
public function getInd() |
|
|
|
|
{ |
|
|
|
|
$args = func_get_args(); |
|
|
|
|
$index = array_shift($args); |
|
|
|
|
$query = $this->prepareQuery($args); |
|
|
|
|
|
|
|
|
|
$ret = array(); |
|
|
|
|
if ($res = $this->rawQuery($query)) { |
|
|
|
|
while ($row = $this->fetch($res)) { |
|
|
|
|
if ( $res = $this->rawQuery($query) ) |
|
|
|
|
{ |
|
|
|
|
while($row = $this->fetch($res)) |
|
|
|
|
{ |
|
|
|
|
$ret[$row[$index]] = $row; |
|
|
|
|
} |
|
|
|
|
$this->free($res); |
|
|
|
@ -356,14 +331,17 @@ class SafeMySQL {
|
|
|
|
|
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query |
|
|
|
|
* @return array - associative array contains key=value pairs out of resultset. Empty if no rows found. |
|
|
|
|
*/ |
|
|
|
|
public function getIndCol() { |
|
|
|
|
public function getIndCol() |
|
|
|
|
{ |
|
|
|
|
$args = func_get_args(); |
|
|
|
|
$index = array_shift($args); |
|
|
|
|
$query = $this->prepareQuery($args); |
|
|
|
|
|
|
|
|
|
$ret = array(); |
|
|
|
|
if ($res = $this->rawQuery($query)) { |
|
|
|
|
while ($row = $this->fetch($res)) { |
|
|
|
|
if ( $res = $this->rawQuery($query) ) |
|
|
|
|
{ |
|
|
|
|
while($row = $this->fetch($res)) |
|
|
|
|
{ |
|
|
|
|
$key = $row[$index]; |
|
|
|
|
unset($row[$index]); |
|
|
|
|
$ret[$key] = reset($row); |
|
|
|
@ -395,7 +373,8 @@ class SafeMySQL {
|
|
|
|
|
* @param mixed $arg,... unlimited number of arguments to match placeholders in the expression |
|
|
|
|
* @return string - initial expression with placeholders substituted with data. |
|
|
|
|
*/ |
|
|
|
|
public function parse() { |
|
|
|
|
public function parse() |
|
|
|
|
{ |
|
|
|
|
return $this->prepareQuery(func_get_args()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -419,7 +398,8 @@ class SafeMySQL {
|
|
|
|
|
* @param string $default - optional variable to set if no match found. Default to false. |
|
|
|
|
* @return string|FALSE - either sanitized value or FALSE |
|
|
|
|
*/ |
|
|
|
|
public function whiteList($input, $allowed, $default = FALSE) { |
|
|
|
|
public function whiteList($input,$allowed,$default=FALSE) |
|
|
|
|
{ |
|
|
|
|
$found = array_search($input,$allowed); |
|
|
|
|
return ($found === FALSE) ? $default : $allowed[$found]; |
|
|
|
|
} |
|
|
|
@ -440,9 +420,12 @@ class SafeMySQL {
|
|
|
|
|
* @param array $allowed - an array with allowed field names |
|
|
|
|
* @return array filtered out source array |
|
|
|
|
*/ |
|
|
|
|
public function filterArray($input, $allowed) { |
|
|
|
|
foreach (array_keys($input) as $key) { |
|
|
|
|
if (!in_array($key, $allowed)) { |
|
|
|
|
public function filterArray($input,$allowed) |
|
|
|
|
{ |
|
|
|
|
foreach(array_keys($input) as $key ) |
|
|
|
|
{ |
|
|
|
|
if ( !in_array($key,$allowed) ) |
|
|
|
|
{ |
|
|
|
|
unset($input[$key]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -454,7 +437,8 @@ class SafeMySQL {
|
|
|
|
|
* |
|
|
|
|
* @return string|NULL either last executed query or NULL if were none |
|
|
|
|
*/ |
|
|
|
|
public function lastQuery() { |
|
|
|
|
public function lastQuery() |
|
|
|
|
{ |
|
|
|
|
$last = end($this->stats); |
|
|
|
|
return $last['query']; |
|
|
|
|
} |
|
|
|
@ -464,18 +448,20 @@ class SafeMySQL {
|
|
|
|
|
* |
|
|
|
|
* @return array contains all executed queries with timings and errors |
|
|
|
|
*/ |
|
|
|
|
public function getStats() { |
|
|
|
|
public function getStats() |
|
|
|
|
{ |
|
|
|
|
return $this->stats; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* protected function which actually runs a query against Mysql server. |
|
|
|
|
* private function which actually runs a query against Mysql server. |
|
|
|
|
* also logs some stats like profiling info and error message |
|
|
|
|
* |
|
|
|
|
* @param string $query - a regular SQL query |
|
|
|
|
* @return mysqli result resource or FALSE on error |
|
|
|
|
*/ |
|
|
|
|
protected function rawQuery($query) { |
|
|
|
|
private function rawQuery($query) |
|
|
|
|
{ |
|
|
|
|
$start = microtime(TRUE); |
|
|
|
|
$res = mysqli_query($this->conn, $query); |
|
|
|
|
$timer = microtime(TRUE) - $start; |
|
|
|
@ -485,7 +471,8 @@ class SafeMySQL {
|
|
|
|
|
'start' => $start, |
|
|
|
|
'timer' => $timer, |
|
|
|
|
); |
|
|
|
|
if (!$res) { |
|
|
|
|
if (!$res) |
|
|
|
|
{ |
|
|
|
|
$error = mysqli_error($this->conn); |
|
|
|
|
|
|
|
|
|
end($this->stats); |
|
|
|
@ -499,24 +486,29 @@ class SafeMySQL {
|
|
|
|
|
return $res; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected function prepareQuery($args) { |
|
|
|
|
private function prepareQuery($args) |
|
|
|
|
{ |
|
|
|
|
$query = ''; |
|
|
|
|
$raw = array_shift($args); |
|
|
|
|
$array = preg_split('~(\?[nsiuap])~u',$raw,null,PREG_SPLIT_DELIM_CAPTURE); |
|
|
|
|
$anum = count($args); |
|
|
|
|
$pnum = floor(count($array) / 2); |
|
|
|
|
if ($pnum != $anum) { |
|
|
|
|
if ( $pnum != $anum ) |
|
|
|
|
{ |
|
|
|
|
$this->error("Number of args ($anum) doesn't match number of placeholders ($pnum) in [$raw]"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
foreach ($array as $i => $part) { |
|
|
|
|
if (($i % 2) == 0) { |
|
|
|
|
foreach ($array as $i => $part) |
|
|
|
|
{ |
|
|
|
|
if ( ($i % 2) == 0 ) |
|
|
|
|
{ |
|
|
|
|
$query .= $part; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$value = array_shift($args); |
|
|
|
|
switch ($part) { |
|
|
|
|
switch ($part) |
|
|
|
|
{ |
|
|
|
|
case '?n': |
|
|
|
|
$part = $this->escapeIdent($value); |
|
|
|
|
break; |
|
|
|
@ -541,72 +533,90 @@ class SafeMySQL {
|
|
|
|
|
return $query; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected function escapeInt($value) { |
|
|
|
|
if ($value === NULL) { |
|
|
|
|
private function escapeInt($value) |
|
|
|
|
{ |
|
|
|
|
if ($value === NULL) |
|
|
|
|
{ |
|
|
|
|
return 'NULL'; |
|
|
|
|
} |
|
|
|
|
if (!is_numeric($value)) { |
|
|
|
|
if(!is_numeric($value)) |
|
|
|
|
{ |
|
|
|
|
$this->error("Integer (?i) placeholder expects numeric value, ".gettype($value)." given"); |
|
|
|
|
return FALSE; |
|
|
|
|
} |
|
|
|
|
if (is_float($value)) { |
|
|
|
|
if (is_float($value)) |
|
|
|
|
{ |
|
|
|
|
$value = number_format($value, 0, '.', ''); // may lose precision on big numbers |
|
|
|
|
} |
|
|
|
|
return $value; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected function escapeString($value) { |
|
|
|
|
if ($value === NULL) { |
|
|
|
|
private function escapeString($value) |
|
|
|
|
{ |
|
|
|
|
if ($value === NULL) |
|
|
|
|
{ |
|
|
|
|
return 'NULL'; |
|
|
|
|
} |
|
|
|
|
return "'".mysqli_real_escape_string($this->conn,$value)."'"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected function escapeIdent($value) { |
|
|
|
|
if ($value) { |
|
|
|
|
private function escapeIdent($value) |
|
|
|
|
{ |
|
|
|
|
if ($value) |
|
|
|
|
{ |
|
|
|
|
return "`".str_replace("`","``",$value)."`"; |
|
|
|
|
} else { |
|
|
|
|
$this->error("Empty value for identifier (?n) placeholder"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected function createIN($data) { |
|
|
|
|
if (!is_array($data)) { |
|
|
|
|
private function createIN($data) |
|
|
|
|
{ |
|
|
|
|
if (!is_array($data)) |
|
|
|
|
{ |
|
|
|
|
$this->error("Value for IN (?a) placeholder should be array"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (!$data) { |
|
|
|
|
if (!$data) |
|
|
|
|
{ |
|
|
|
|
return 'NULL'; |
|
|
|
|
} |
|
|
|
|
$query = $comma = ''; |
|
|
|
|
foreach ($data as $value) { |
|
|
|
|
foreach ($data as $value) |
|
|
|
|
{ |
|
|
|
|
$query .= $comma.$this->escapeString($value); |
|
|
|
|
$comma = ","; |
|
|
|
|
} |
|
|
|
|
return $query; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected function createSET($data) { |
|
|
|
|
if (!is_array($data)) { |
|
|
|
|
private function createSET($data) |
|
|
|
|
{ |
|
|
|
|
if (!is_array($data)) |
|
|
|
|
{ |
|
|
|
|
$this->error("SET (?u) placeholder expects array, ".gettype($data)." given"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (!$data) { |
|
|
|
|
if (!$data) |
|
|
|
|
{ |
|
|
|
|
$this->error("Empty array for SET (?u) placeholder"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
$query = $comma = ''; |
|
|
|
|
foreach ($data as $key => $value) { |
|
|
|
|
foreach ($data as $key => $value) |
|
|
|
|
{ |
|
|
|
|
$query .= $comma.$this->escapeIdent($key).'='.$this->escapeString($value); |
|
|
|
|
$comma = ","; |
|
|
|
|
} |
|
|
|
|
return $query; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected function error($err) { |
|
|
|
|
private function error($err) |
|
|
|
|
{ |
|
|
|
|
$err = __CLASS__.": ".$err; |
|
|
|
|
|
|
|
|
|
if ($this->emode == 'error') { |
|
|
|
|
if ( $this->emode == 'error' ) |
|
|
|
|
{ |
|
|
|
|
$err .= ". Error initiated in ".$this->caller().", thrown"; |
|
|
|
|
trigger_error($err,E_USER_ERROR); |
|
|
|
|
} else { |
|
|
|
@ -614,11 +624,14 @@ class SafeMySQL {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected function caller() { |
|
|
|
|
private function caller() |
|
|
|
|
{ |
|
|
|
|
$trace = debug_backtrace(); |
|
|
|
|
$caller = ''; |
|
|
|
|
foreach ($trace as $t) { |
|
|
|
|
if (isset($t['class']) && $t['class'] == __CLASS__) { |
|
|
|
|
foreach ($trace as $t) |
|
|
|
|
{ |
|
|
|
|
if ( isset($t['class']) && $t['class'] == __CLASS__ ) |
|
|
|
|
{ |
|
|
|
|
$caller = $t['file']." on line ".$t['line']; |
|
|
|
|
} else { |
|
|
|
|
break; |
|
|
|
@ -631,12 +644,13 @@ class SafeMySQL {
|
|
|
|
|
* On a long run we can eat up too much memory with mere statsistics |
|
|
|
|
* Let's keep it at reasonable size, leaving only last 100 entries. |
|
|
|
|
*/ |
|
|
|
|
protected function cutStats() { |
|
|
|
|
if (count($this->stats) > 100) { |
|
|
|
|
private function cutStats() |
|
|
|
|
{ |
|
|
|
|
if ( count($this->stats) > 100 ) |
|
|
|
|
{ |
|
|
|
|
reset($this->stats); |
|
|
|
|
$first = key($this->stats); |
|
|
|
|
unset($this->stats[$first]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|