%s
%s
HTML; /** * Template used for CLI and text output. * * @var string */ private static $templateText = <<getValueBinder()->bindings()) : static::interpolate($sql, $query->valueBinder()->bindings()); } $trace = Debugger::trace(['start' => 1, '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 = static::$templateHtml; $sqlHighlight = true; if ((PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') || $showHtml === false) { $template = static::$templateText; $sqlHighlight = false; if ($file && $line) { $lineInfo = sprintf('%s (line %s)', $file, $line); } } if ($showHtml === null && $template !== static::$templateText) { $showHtml = true; } $var = $showHtml ? SqlFormatter::format($sql, $sqlHighlight) : $sql; $var = str_replace( ': ', ':', $var ); if ($showHtml) { $template = static::$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 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); } /** * 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); } }