%s
%s
HTML;
/**
* Template used for CLI and text output.
*
* @var string
*/
private static $templateText = <<getValueBinder()->bindings());
}
/** @var array $trace */
$trace = Debugger::trace(['start' => 0, 'depth' => $stackDepth + 2, 'format' => 'array']);
$file = isset($trace[$stackDepth]) ? $trace[$stackDepth]['file'] : 'n/a';
$line = isset($trace[$stackDepth]) ? $trace[$stackDepth]['line'] : 0;
$lineInfo = '';
if ($file) {
$search = [];
if (defined('ROOT')) {
$search = [ROOT];
}
if (defined('CAKE_CORE_INCLUDE_PATH')) {
array_unshift($search, CAKE_CORE_INCLUDE_PATH);
}
$file = str_replace($search, '', $file);
}
$template = self::$templateHtml;
if (static::isCli() || $showHtml === false) {
$template = self::$templateText;
if ($file && $line) {
$lineInfo = sprintf('%s (line %s)', $file, $line);
}
}
if ($showHtml === null && $template !== self::$templateText) {
$showHtml = true;
}
if (static::isCli() && !$showHtml) {
$highlighter = new CliHighlighter([
CliHighlighter::HIGHLIGHT_QUOTE => "\x1b[33;1m",
CliHighlighter::HIGHLIGHT_WORD => "\x1b[36;1m",
CliHighlighter::HIGHLIGHT_VARIABLE => "\x1b[33;1m",
]);
} elseif ($showHtml) {
$highlighter = new HtmlHighlighter(
[
HtmlHighlighter::HIGHLIGHT_QUOTE => 'style="color: #004d40;"',
HtmlHighlighter::HIGHLIGHT_BACKTICK_QUOTE => 'style="color: #26a69a;"',
HtmlHighlighter::HIGHLIGHT_NUMBER => 'style="color: #ec407a;"',
HtmlHighlighter::HIGHLIGHT_WORD => 'style="color: #9c27b0;"',
HtmlHighlighter::HIGHLIGHT_PRE => 'style="color: #222; background-color: transparent;"',
],
false
);
} else {
$highlighter = new NullHighlighter();
}
$var = (new SqlFormatter($highlighter))->format($sql);
$var = trim($var);
if ($showHtml) {
$template = self::$templateHtml;
if ($file && $line) {
$lineInfo = sprintf('%s (line %s)', $file, $line);
}
}
printf($template, $lineInfo, $var);
return $query;
}
/**
* Prints out the SQL statements generated by a Query object and dies.
*
* Only runs if debug mode is enabled.
* It will otherwise just continue code execution and ignore this function.
*
* @param \Cake\Database\Query $query Query to show SQL statements for.
* @param bool $showValues Renders the SQL statement with bound variables.
* @param bool|null $showHtml If set to true, the method prints the debug
* data in a browser-friendly way.
* @param int $stackDepth Provides a hint as to which file in the call stack to reference.
* @return void
*/
public static function sqld(Query $query, $showValues = true, $showHtml = null, $stackDepth = 1)
{
static::sql($query, $showValues, $showHtml, $stackDepth);
die(1);
}
/**
* Checks whether the current environment is CLI based.
*
* @return bool
*/
protected static function isCli()
{
return PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg';
}
/**
* Helper function used to replace query placeholders by the real
* params used to execute the query.
*
* @param string $sql The SQL statement
* @param array $bindings The Query bindings
* @return string
*/
private static function interpolate($sql, array $bindings)
{
$params = array_map(function ($binding) {
$p = $binding['value'];
if ($p === null) {
return 'NULL';
}
if (is_bool($p)) {
return $p ? '1' : '0';
}
if (is_string($p)) {
$replacements = [
'$' => '\\$',
'\\' => '\\\\\\\\',
"'" => "''",
];
$p = strtr($p, $replacements);
return "'$p'";
}
return $p;
}, $bindings);
$keys = [];
$limit = is_int(key($params)) ? 1 : -1;
foreach ($params as $key => $param) {
$keys[] = is_string($key) ? "/$key\b/" : '/[?]/';
}
return preg_replace($keys, $params, $sql, $limit);
}
}