The Rise of Contactless Payments:...
In recent years, contactless payments have surged in popularity, driven...
<?php
namespace DebugBar\DataCollector\PDO;
/**
* Holds information about a statement
*/
class TracedStatement
{
protected $sql;
protected $rowCount;
protected $parameters;
protected $startTime;
protected $endTime;
protected $duration;
protected $startMemory;
protected $endMemory;
protected $memoryDelta;
protected $exception;
protected $preparedId;
/**
* @param string $sql
* @param array $params
* @param null|string $preparedId
*/
public function __construct(string $sql, array $params = [], ?string $preparedId = null)
{
$this->sql = $sql;
$this->parameters = $this->checkParameters($params);
$this->preparedId = $preparedId;
}
/**
* @param null $startTime
* @param null $startMemory
*/
public function start($startTime = null, $startMemory = null) : void
{
$this->startTime = $startTime ?: microtime(true);
$this->startMemory = $startMemory ?: memory_get_usage(false);
}
/**
* @param \Exception|null $exception
* @param int $rowCount
* @param float $endTime
* @param int $endMemory
*/
public function end(\Exception $exception = null, int $rowCount = 0, float $endTime = null, int $endMemory = null) : void
{
$this->endTime = $endTime ?: microtime(true);
$this->duration = $this->endTime - $this->startTime;
$this->endMemory = $endMemory ?: memory_get_usage(false);
$this->memoryDelta = $this->endMemory - $this->startMemory;
$this->exception = $exception;
$this->rowCount = $rowCount;
}
/**
* Check parameters for illegal (non UTF-8) strings, like Binary data.
*
* @param array $params
* @return array
*/
public function checkParameters(array $params) : array
{
foreach ($params as &$param) {
if (!mb_check_encoding($param ?? '', 'UTF-8')) {
$param = '[BINARY DATA]';
}
}
return $params;
}
/**
* Returns the SQL string used for the query, without filled parameters
*
* @return string
*/
public function getSql() : string
{
return $this->sql;
}
/**
* Returns the SQL string with any parameters used embedded
*
* @param string $quotationChar
* @return string
*/
public function getSqlWithParams(string $quotationChar = '<>') : string
{
if (($l = strlen($quotationChar)) > 1) {
$quoteLeft = substr($quotationChar, 0, $l / 2);
$quoteRight = substr($quotationChar, $l / 2);
} else {
$quoteLeft = $quoteRight = $quotationChar;
}
$sql = $this->sql;
$cleanBackRefCharMap = ['%' => '%%', '$' => '$%', '\\' => '\\%'];
foreach ($this->parameters as $k => $v) {
$backRefSafeV = strtr($v, $cleanBackRefCharMap);
$v = "$quoteLeft$backRefSafeV$quoteRight";
if (is_numeric($k)) {
$marker = "\?";
} else {
$marker = (preg_match("/^:/", $k)) ? $k : ":" . $k;
}
$matchRule = "/({$marker}(?!\w))(?=(?:[^$quotationChar]|[$quotationChar][^$quotationChar]*[$quotationChar])*$)/";
$count = mb_substr_count($sql, $k);
if ($count < 1) {
$count = mb_substr_count($sql, $matchRule);
}
for ($i = 0; $i <= $count; $i++) {
$sql = preg_replace($matchRule, $v, $sql, 1);
}
}
$sql = strtr($sql, array_flip($cleanBackRefCharMap));
return $sql;
}
/**
* Returns the number of rows affected/returned
*
* @return int
*/
public function getRowCount() : int
{
return $this->rowCount;
}
/**
* Returns an array of parameters used with the query
*
* @return array
*/
public function getParameters() : array
{
$params = [];
foreach ($this->parameters as $name => $param) {
$params[$name] = htmlentities($param?:"", ENT_QUOTES, 'UTF-8', false);
}
return $params;
}
/**
* Returns the prepared statement id
*
* @return null|string
*/
public function getPreparedId() : ?string
{
return $this->preparedId;
}
/**
* Checks if this is a prepared statement
*
* @return boolean
*/
public function isPrepared() : bool
{
return $this->preparedId !== null;
}
/**
* @return float
*/
public function getStartTime() : float
{
return $this->startTime;
}
/**
* @return float
*/
public function getEndTime() : float
{
return $this->endTime;
}
/**
* Returns the duration in seconds + microseconds of the execution
*
* @return float
*/
public function getDuration() : float
{
return $this->duration;
}
/**
* @return int
*/
public function getStartMemory() : int
{
return $this->startMemory;
}
/**
* @return int
*/
public function getEndMemory() : int
{
return $this->endMemory;
}
/**
* Returns the memory usage during the execution
*
* @return int
*/
public function getMemoryUsage() : int
{
return $this->memoryDelta;
}
/**
* Checks if the statement was successful
*
* @return boolean
*/
public function isSuccess() : bool
{
return $this->exception === null;
}
/**
* Returns the exception triggered
*
* @return \Exception
*/
public function getException() : \Exception
{
return $this->exception;
}
/**
* Returns the exception's code
*
* @return int|string
*/
public function getErrorCode()
{
return $this->exception !== null ? $this->exception->getCode() : 0;
}
/**
* Returns the exception's message
*
* @return string
*/
public function getErrorMessage() : string
{
return $this->exception !== null ? $this->exception->getMessage() : '';
}
}
Blog Section
Dive into our blog to explore the cutting-edge trends in digital payments and NFC technology. Stay updated on the innovations that are revolutionizing transactions, boosting security, and making payments quicker and more convenient. Learn how these advancements are shaping the future of financial interactions and driving the global transition towards a cashless world.
In recent years, contactless payments have surged in popularity, driven...
As digital transactions proliferate, ensuring robust payment security is more critical than ever. Two foundational...
Digital wallets have fundamentally transformed how we manage money, offering a streamlined, secure, and highly...