E?Щ џџџџбхB@ЌиБц@ F?Щ џџџџ@з)G#САЏц@ џџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџ pG?Щ џџџџПїнRњРРЈд@ ЈG?Щ џџџџЇS шЇФ@ џџџџџџџџљ=Щ HЏц@ џџџџнл{ЇјмМ@ @K?Щ џџџџХVЬжЗРЬх@ 0L?Щ џџџџa/&Хдіб@ M?Щ џџџџмYUDЬwјЦМ@ N?Щ џџџџ4?ѓdКЬ0Вц@ O?Щ ЁЊКср] ЇБц@ №O?Щ џџџџ гыzиZбГшАц@ рP?Щ џџџџ:РЭфпюxЏц@ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџ аQ?Щ џџџџщУЕмЬPЕц@ јQ?Щ џџџџэЉ? мѓвЕц@ џџџџџџџџ џџџџџџџџџџџџџџџџ џџџџ џџџџџџџџPT?Щ џџџџХVЬжЗРЬх@ @U?Щ џџџџ:РЭфпюxЏц@ 0V?Щ џџџџ гыzиZбГшАц@ АШB џџџџнл{ЇјмМ@ ЬB џџџџa/&Хдіб@ `ЮB џџџџмYUDЬwјЦМ@ (аB џџџџ4?ѓdКЬ0Вц@ №бB ЁЊКср] ЇБц@ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџшe Щ џџџџK8$дч`ѓГ@ џџџџj^RьЩИН@ џџџџџџџџ њ=Щ АЏц@ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџc Щ џџџџK8$дч`ѓГ@ џџџџj^RьЩИН@ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ g Щ џџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџf Щ џџџџsЯHЗсэїАљ=Щ џџџџџџџџ џџџџџџџџ њ=Щ HЏц@ џџџџнл{ЇјмМ@ Z?Щ џџџџХVЬжЗРЬх@ p[?Щ џџџџa/&Хдіб@ `\?Щ џџџџмYUDЬwјЦМ@ P]?Щ џџџџ4?ѓdКЬ0Вц@ @^?Щ ЁЊКср] ЇБц@ 0_?Щ џџџџ гыzиZбГшАц@ `?Щ џџџџ:РЭфпюxЏц@ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџ a?Щ џџџџщУЕмЬPЕц@ 8a?Щ џџџџ]9PЬІ9nБxКц@ `a?Щ эЉ? мѓвЕц@ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџpg Щ џџџџK8$дч`ѓГ@ џџџџj^RьЩИН@ break; } $j = strpos($sql, "'", $startPos); $k = strpos($sql, '"', $startPos); if (($k !== false) && (($k < $j) || ($j === false))) { $quoteChar = '"'; $j = $k; } else { $quoteChar = "'"; } if ($j === false) { $j = $n; } // Search for named prepared parameters and replace it with ? and save its position $substring = substr($sql, $startPos, $j - $startPos); if (preg_match_all($pattern, $substring, $matches, PREG_PATTERN_ORDER + PREG_OFFSET_CAPTURE)) { foreach ($matches[0] as $i => $match) { if ($i === 0) { $literal .= substr($substring, 0, $match[1]); } if (!isset($mapping[$match[0]])) { $mapping[$match[0]] = []; } $mapping[$match[0]][] = $position++; $endOfPlaceholder = $match[1] + strlen($match[0]); $beginOfNextPlaceholder = $matches[0][$i + 1][1] ?? strlen($substring); $beginOfNextPlaceholder -= $endOfPlaceholder; $literal .= '?' . substr($substring, $endOfPlaceholder, $beginOfNextPlaceholder); } } else { $literal .= $substring; } $startPos = $j; $j++; if ($j >= $n) { break; } // Quote comes first, find end of quote while (true) { $k = strpos($sql, $quoteChar, $j); $escaped = false; if ($k === false) { break; } $l = $k - 1; while ($l >= 0 && $sql[$l] === '\\') { $l--; $escaped = !$escaped; } if ($escaped) { $j = $k + 1; continue; } break; } if ($k === false) { // Error in the query - no end quote; ignore it break; } $literal .= substr($sql, $startPos, $k - $startPos + 1); $startPos = $k + 1; } if ($startPos < $n) { $literal .= substr($sql, $startPos, $n - $startPos); } $this->parameterKeyMapping = $mapping; return $literal; } /** * Binds a parameter to the specified variable name. * * @param string|integer $parameter Parameter identifier. For a prepared statement using named placeholders, this will be a parameter * name of the form `:name`. For a prepared statement using question mark placeholders, this will be * the 1-indexed position of the parameter. * @param mixed $variable Name of the PHP variable to bind to the SQL statement parameter. * @param integer $dataType Constant corresponding to a SQL datatype, this should be the processed type from the QueryInterface. * @param integer $length The length of the variable. Usually required for OUTPUT parameters. * @param array $driverOptions Optional driver options to be used. * * @return boolean * * @since 2.0.0 */ public function bindParam($parameter, &$variable, string $dataType = ParameterType::STRING, ?int $length = null, ?array $driverOptions = null) { $this->bindedValues[$parameter] =& $variable; // Validate parameter type if (!isset($this->parameterTypeMapping[$dataType])) { throw new \InvalidArgumentException(sprintf('Unsupported parameter type `%s`', $dataType)); } $this->typesKeyMapping[$parameter] = $this->parameterTypeMapping[$dataType]; return true; } /** * Binds a array of values to bound parameters. * * @param array $values The values to bind to the statement * * @return boolean * * @since 2.0.0 */ private function bindValues(array $values) { $params = []; $types = str_repeat('s', \count($values)); if (!empty($this->parameterKeyMapping)) { foreach ($values as $key => &$value) { $params[$this->parameterKeyMapping[$key]] =& $value; } ksort($params); } else { foreach ($values as $key => &$value) { $params[] =& $value; } } array_unshift($params, $types); return \call_user_func_array([$this->statement, 'bind_param'], $params); } /** * Closes the cursor, enabling the statement to be executed again. * * @return void * * @since 2.0.0 */ public function closeCursor(): void { $this->statement->free_result(); $this->result = false; } /** * Fetches the SQLSTATE associated with the last operation on the statement handle. * * @return int * * @since 2.0.0 */ public function errorCode() { return $this->statement->errno; } /** * Fetches extended error information associated with the last operation on the statement handle. * * @return string * * @since 2.0.0 */ public function errorInfo() { return $this->statement->error; } /** * Executes a prepared statement * * @param array|null $parameters An array of values with as many elements as there are bound parameters in the SQL statement being executed. * * @return boolean * * @since 2.0.0 */ public function execute(?array $parameters = null) { if ($this->bindedValues !== null) { $params = []; $types = []; if (!empty($this->parameterKeyMapping)) { foreach ($this->bindedValues as $key => &$value) { $paramKey = $this->parameterKeyMapping[$key]; foreach ($paramKey as $currentKey) { $params[$currentKey] =& $value; $types[$currentKey] = $this->typesKeyMapping[$key]; } } } else { foreach ($this->bindedValues as $key => &$value) { $params[] =& $value; $types[$key] = $this->typesKeyMapping[$key]; } } ksort($params); ksort($types); array_unshift($params, implode('', $types)); if (!\call_user_func_array([$this->statement, 'bind_param'], $params)) { throw new PrepareStatementFailureException($this->statement->error, $this->statement->errno); } } elseif ($parameters !== null) { if (!$this->bindValues($parameters)) { throw new PrepareStatementFailureException($this->statement->error, $this->statement->errno); } } try { if (!$this->statement->execute()) { throw new ExecutionFailureException($this->query, $this->statement->error, $this->statement->errno); } } catch (\Throwable $e) { throw new ExecutionFailureException($this->query, $e->getMessage(), $e->getCode(), $e); } if ($this->columnNames === null) { $meta = $this->statement->result_metadata(); if ($meta !== false) { $columnNames = []; foreach ($meta->fetch_fields() as $col) { $columnNames[] = $col->name; } $meta->free(); $this->columnNames = $columnNames; } else { $this->columnNames = false; } } if ($this->columnNames !== false) { $this->statement->store_result(); $this->rowBindedValues = array_fill(0, \count($this->columnNames), null); $refs = []; foreach ($this->rowBindedValues as $key => &$value) { $refs[$key] =& $value; } if (!\call_user_func_array([$this->statement, 'bind_result'], $refs)) { throw new \RuntimeException($this->statement->error, $this->statement->errno); } } $this->result = true; return true; } /** * Fetches the next row from a result set * * @param integer|null $fetchStyle Controls how the next row will be returned to the caller. This value must be one of the * FetchMode constants, defaulting to value of FetchMode::MIXED. * @param integer $cursorOrientation For a StatementInterface object representing a scrollable cursor, this value determines which row * will be returned to the caller. This value must be one of the FetchOrientation constants, * defaulting to FetchOrientation::NEXT. * @param integer $cursorOffset For a StatementInterface object representing a scrollable cursor for which the cursorOrientation * parameter is set to FetchOrientation::ABS, this value specifies the absolute number of the row in * the result set that shall be fetched. For a StatementInterface object representing a scrollable * cursor for which the cursorOrientation parameter is set to FetchOrientation::REL, this value * specifies the row to fetch relative to the cursor position before `fetch()` was called. * * @return mixed The return value of this function on success depends on the fetch type. In all cases, boolean false is returned on failure. * * @since 2.0.0 */ public function fetch(?int $fetchStyle = null, int $cursorOrientation = FetchOrientation::NEXT, int $cursorOffset = 0) { if (!$this->result) { return false; } $fetchStyle = $fetchStyle ?: $this->defaultFetchStyle; if ($fetchStyle === FetchMode::COLUMN) { return $this->fetchColumn(); } $values = $this->fetchData(); if ($values === null) { return false; } if ($values === false) { throw new \RuntimeException($this->statement->error, $this->statement->errno); } switch ($fetchStyle) { case FetchMode::NUMERIC: return $values; case FetchMode::ASSOCIATIVE: return array_combine($this->columnNames, $values); case FetchMode::MIXED: $ret = array_combine($this->columnNames, $values); $ret += $values; return $ret; case FetchMode::STANDARD_OBJECT: return (object) array_combine($this->columnNames, $values); default: throw new \InvalidArgumentException("Unknown fetch type '{$fetchStyle}'"); } } /** * Returns a single column from the next row of a result set * * @param integer $columnIndex 0-indexed number of the column you wish to retrieve from the row. * If no value is supplied, the first column is retrieved. * * @return mixed Returns a single column from the next row of a result set or boolean false if there are no more rows. * * @since 2.0.0 */ public function fetchColumn($columnIndex = 0) { $row = $this->fetch(FetchMode::NUMERIC); if ($row === false) { return false; } return $row[$columnIndex] ?? null; } /** * Fetch the data from the statement. * * @return array|boolean * * @since 2.0.0 */ private function fetchData() { $return = $this->statement->fetch(); if ($return === true) { $values = []; foreach ($this->rowBindedValues as $v) { $values[] = $v; } return $values; } return $return; } /** * Returns the number of rows affected by the last SQL statement. * * @return integer * * @since 2.0.0 */ public function rowCount(): int { if ($this->columnNames === false) { return $this->statement->affected_rows; } return $this->statement->num_rows; } /** * Sets the fetch mode to use while iterating this statement. * * @param integer $fetchMode The fetch mode, must be one of the FetchMode constants. * @param mixed ...$args Optional mode-specific arguments. * * @return void * * @since 2.0.0 */ public function setFetchMode(int $fetchMode, ...$args): void { $this->defaultFetchStyle = $fetchMode; } } E?Щ џџџџбхB@ЌиБц@ F?Щ џџџџ@з)G#САЏц@ џџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџ pG?Щ џџџџПїнRњРРЈд@ ЈG?Щ џџџџЇS шЇФ@ џџџџџџџџљ=Щ HЏц@ џџџџнл{ЇјмМ@ @K?Щ џџџџХVЬжЗРЬх@ 0L?Щ џџџџa/&Хдіб@ M?Щ џџџџмYUDЬwјЦМ@ N?Щ џџџџ4?ѓdКЬ0Вц@ O?Щ ЁЊКср] ЇБц@ №O?Щ џџџџ гыzиZбГшАц@ рP?Щ џџџџ:РЭфпюxЏц@ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџ аQ?Щ џџџџщУЕмЬPЕц@ јQ?Щ џџџџэЉ? мѓвЕц@ џџџџџџџџ џџџџџџџџџџџџџџџџ џџџџ џџџџџџџџPT?Щ џџџџХVЬжЗРЬх@ @U?Щ џџџџ:РЭфпюxЏц@ 0V?Щ џџџџ гыzиZбГшАц@ АШB џџџџнл{ЇјмМ@ ЬB џџџџa/&Хдіб@ `ЮB џџџџмYUDЬwјЦМ@ (аB џџџџ4?ѓdКЬ0Вц@ №бB ЁЊКср] ЇБц@ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџшe Щ џџџџK8$дч`ѓГ@ џџџџj^RьЩИН@ џџџџџџџџ њ=Щ АЏц@ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџc Щ џџџџK8$дч`ѓГ@ џџџџj^RьЩИН@ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ g Щ џџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџf Щ џџџџsЯHЗсэїАљ=Щ џџџџџџџџ џџџџџџџџ њ=Щ HЏц@ џџџџнл{ЇјмМ@ Z?Щ џџџџХVЬжЗРЬх@ p[?Щ џџџџa/&Хдіб@ `\?Щ џџџџмYUDЬwјЦМ@ P]?Щ џџџџ4?ѓdКЬ0Вц@ @^?Щ ЁЊКср] ЇБц@ 0_?Щ џџџџ гыzиZбГшАц@ `?Щ џџџџ:РЭфпюxЏц@ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџ a?Щ џџџџщУЕмЬPЕц@ 8a?Щ џџџџ]9PЬІ9nБxКц@ `a?Щ эЉ? мѓвЕц@ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџpg Щ џџџџK8$дч`ѓГ@ џџџџj^RьЩИН@ break; } $j = strpos($sql, "'", $startPos); $k = strpos($sql, '"', $startPos); if (($k !== false) && (($k < $j) || ($j === false))) { $quoteChar = '"'; $j = $k; } else { $quoteChar = "'"; } if ($j === false) { $j = $n; } // Search for named prepared parameters and replace it with ? and save its position $substring = substr($sql, $startPos, $j - $startPos); if (preg_match_all($pattern, $substring, $matches, PREG_PATTERN_ORDER + PREG_OFFSET_CAPTURE)) { foreach ($matches[0] as $i => $match) { if ($i === 0) { $literal .= substr($substring, 0, $match[1]); } if (!isset($mapping[$match[0]])) { $mapping[$match[0]] = []; } $mapping[$match[0]][] = $position++; $endOfPlaceholder = $match[1] + strlen($match[0]); $beginOfNextPlaceholder = $matches[0][$i + 1][1] ?? strlen($substring); $beginOfNextPlaceholder -= $endOfPlaceholder; $literal .= '?' . substr($substring, $endOfPlaceholder, $beginOfNextPlaceholder); } } else { $literal .= $substring; } $startPos = $j; $j++; if ($j >= $n) { break; } // Quote comes first, find end of quote while (true) { $k = strpos($sql, $quoteChar, $j); $escaped = false; if ($k === false) { break; } $l = $k - 1; while ($l >= 0 && $sql[$l] === '\\') { $l--; $escaped = !$escaped; } if ($escaped) { $j = $k + 1; continue; } break; } if ($k === false) { // Error in the query - no end quote; ignore it break; } $literal .= substr($sql, $startPos, $k - $startPos + 1); $startPos = $k + 1; } if ($startPos < $n) { $literal .= substr($sql, $startPos, $n - $startPos); } $this->parameterKeyMapping = $mapping; return $literal; } /** * Binds a parameter to the specified variable name. * * @param string|integer $parameter Parameter identifier. For a prepared statement using named placeholders, this will be a parameter * name of the form `:name`. For a prepared statement using question mark placeholders, this will be * the 1-indexed position of the parameter. * @param mixed $variable Name of the PHP variable to bind to the SQL statement parameter. * @param integer $dataType Constant corresponding to a SQL datatype, this should be the processed type from the QueryInterface. * @param integer $length The length of the variable. Usually required for OUTPUT parameters. * @param array $driverOptions Optional driver options to be used. * * @return boolean * * @since 2.0.0 */ public function bindParam($parameter, &$variable, string $dataType = ParameterType::STRING, ?int $length = null, ?array $driverOptions = null) { $this->bindedValues[$parameter] =& $variable; // Validate parameter type if (!isset($this->parameterTypeMapping[$dataType])) { throw new \InvalidArgumentException(sprintf('Unsupported parameter type `%s`', $dataType)); } $this->typesKeyMapping[$parameter] = $this->parameterTypeMapping[$dataType]; return true; } /** * Binds a array of values to bound parameters. * * @param array $values The values to bind to the statement * * @return boolean * * @since 2.0.0 */ private function bindValues(array $values) { $params = []; $types = str_repeat('s', \count($values)); if (!empty($this->parameterKeyMapping)) { foreach ($values as $key => &$value) { $params[$this->parameterKeyMapping[$key]] =& $value; } ksort($params); } else { foreach ($values as $key => &$value) { $params[] =& $value; } } array_unshift($params, $types); return \call_user_func_array([$this->statement, 'bind_param'], $params); } /** * Closes the cursor, enabling the statement to be executed again. * * @return void * * @since 2.0.0 */ public function closeCursor(): void { $this->statement->free_result(); $this->result = false; } /** * Fetches the SQLSTATE associated with the last operation on the statement handle. * * @return int * * @since 2.0.0 */ public function errorCode() { return $this->statement->errno; } /** * Fetches extended error information associated with the last operation on the statement handle. * * @return string * * @since 2.0.0 */ public function errorInfo() { return $this->statement->error; } /** * Executes a prepared statement * * @param array|null $parameters An array of values with as many elements as there are bound parameters in the SQL statement being executed. * * @return boolean * * @since 2.0.0 */ public function execute(?array $parameters = null) { if ($this->bindedValues !== null) { $params = []; $types = []; if (!empty($this->parameterKeyMapping)) { foreach ($this->bindedValues as $key => &$value) { $paramKey = $this->parameterKeyMapping[$key]; foreach ($paramKey as $currentKey) { $params[$currentKey] =& $value; $types[$currentKey] = $this->typesKeyMapping[$key]; } } } else { foreach ($this->bindedValues as $key => &$value) { $params[] =& $value; $types[$key] = $this->typesKeyMapping[$key]; } } ksort($params); ksort($types); array_unshift($params, implode('', $types)); if (!\call_user_func_array([$this->statement, 'bind_param'], $params)) { throw new PrepareStatementFailureException($this->statement->error, $this->statement->errno); } } elseif ($parameters !== null) { if (!$this->bindValues($parameters)) { throw new PrepareStatementFailureException($this->statement->error, $this->statement->errno); } } try { if (!$this->statement->execute()) { throw new ExecutionFailureException($this->query, $this->statement->error, $this->statement->errno); } } catch (\Throwable $e) { throw new ExecutionFailureException($this->query, $e->getMessage(), $e->getCode(), $e); } if ($this->columnNames === null) { $meta = $this->statement->result_metadata(); if ($meta !== false) { $columnNames = []; foreach ($meta->fetch_fields() as $col) { $columnNames[] = $col->name; } $meta->free(); $this->columnNames = $columnNames; } else { $this->columnNames = false; } } if ($this->columnNames !== false) { $this->statement->store_result(); $this->rowBindedValues = array_fill(0, \count($this->columnNames), null); $refs = []; foreach ($this->rowBindedValues as $key => &$value) { $refs[$key] =& $value; } if (!\call_user_func_array([$this->statement, 'bind_result'], $refs)) { throw new \RuntimeException($this->statement->error, $this->statement->errno); } } $this->result = true; return true; } /** * Fetches the next row from a result set * * @param integer|null $fetchStyle Controls how the next row will be returned to the caller. This value must be one of the * FetchMode constants, defaulting to value of FetchMode::MIXED. * @param integer $cursorOrientation For a StatementInterface object representing a scrollable cursor, this value determines which row * will be returned to the caller. This value must be one of the FetchOrientation constants, * defaulting to FetchOrientation::NEXT. * @param integer $cursorOffset For a StatementInterface object representing a scrollable cursor for which the cursorOrientation * parameter is set to FetchOrientation::ABS, this value specifies the absolute number of the row in * the result set that shall be fetched. For a StatementInterface object representing a scrollable * cursor for which the cursorOrientation parameter is set to FetchOrientation::REL, this value * specifies the row to fetch relative to the cursor position before `fetch()` was called. * * @return mixed The return value of this function on success depends on the fetch type. In all cases, boolean false is returned on failure. * * @since 2.0.0 */ public function fetch(?int $fetchStyle = null, int $cursorOrientation = FetchOrientation::NEXT, int $cursorOffset = 0) { if (!$this->result) { return false; } $fetchStyle = $fetchStyle ?: $this->defaultFetchStyle; if ($fetchStyle === FetchMode::COLUMN) { return $this->fetchColumn(); } $values = $this->fetchData(); if ($values === null) { return false; } if ($values === false) { throw new \RuntimeException($this->statement->error, $this->statement->errno); } switch ($fetchStyle) { case FetchMode::NUMERIC: return $values; case FetchMode::ASSOCIATIVE: return array_combine($this->columnNames, $values); case FetchMode::MIXED: $ret = array_combine($this->columnNames, $values); $ret += $values; return $ret; case FetchMode::STANDARD_OBJECT: return (object) array_combine($this->columnNames, $values); default: throw new \InvalidArgumentException("Unknown fetch type '{$fetchStyle}'"); } } /** * Returns a single column from the next row of a result set * * @param integer $columnIndex 0-indexed number of the column you wish to retrieve from the row. * If no value is supplied, the first column is retrieved. * * @return mixed Returns a single column from the next row of a result set or boolean false if there are no more rows. * * @since 2.0.0 */ public function fetchColumn($columnIndex = 0) { $row = $this->fetch(FetchMode::NUMERIC); if ($row === false) { return false; } return $row[$columnIndex] ?? null; } /** * Fetch the data from the statement. * * @return array|boolean * * @since 2.0.0 */ private function fetchData() { $return = $this->statement->fetch(); if ($return === true) { $values = []; foreach ($this->rowBindedValues as $v) { $values[] = $v; } return $values; } return $return; } /** * Returns the number of rows affected by the last SQL statement. * * @return integer * * @since 2.0.0 */ public function rowCount(): int { if ($this->columnNames === false) { return $this->statement->affected_rows; } return $this->statement->num_rows; } /** * Sets the fetch mode to use while iterating this statement. * * @param integer $fetchMode The fetch mode, must be one of the FetchMode constants. * @param mixed ...$args Optional mode-specific arguments. * * @return void * * @since 2.0.0 */ public function setFetchMode(int $fetchMode, ...$args): void { $this->defaultFetchStyle = $fetchMode; } }
* @since 2.0.0 * @throws PrepareStatementFailureException */ protected function prepareStatement(string $query): StatementInterface { return new MysqliStatement($this->connection, $query); } /** * Unlocks tables in the database. * $query->setLimit($limit, $offset); $sql = $this->replacePrefix((string) $query); $this->statement = $this->prepareStatement($sql); $this->sql = $query; $this->limit = (int) max(0, $limit); $this->offset = (int) max(0, $offset); ) ->bind(':currentDate2', $currentDate) ->order($this->db->quoteName('m.lft')); $items = []; $iterator = $this->db->setQuery($query)->getIterator(); foreach ($iterator as $item) { $items[$item->id] = new MenuItem((array) $item); } $referenceArgs = &$args; } // Just execute the callback if caching is disabled. if (empty($this->options['caching'])) { return \call_user_func_array($callback, $referenceArgs); } if (!$id) { // Generate an ID $id = $this->_makeId($callback, $args); try { /** @var CallbackController $cache */ $cache = $this->getCacheControllerFactory()->createCacheController('callback', ['defaultgroup' => 'com_menus']); $this->items = $cache->get($loader, [], md5(\get_class($this)), false); } catch (CacheExceptionInterface $e) { try { $this->items = $loader(); } catch (ExecutionFailureException $databaseException) { $this->app->enqueueMessage(Text::sprintf('JERROR_LOADING_MENUS', $databaseException->getMessage()), 'warning'); * @since 1.5 */ public function getMenu() { if (!$this->itemsLoaded) { $this->load(); foreach ($this->items as $item) { if ($item->home) { $this->default[trim($item->language)] = $item->id; } */ public function getItem($id) { $result = null; if (isset($this->getMenu()[$id])) { $result = &$this->getMenu()[$id]; } return $result; } // Get the id of the active menu item $menu = $this->getMenu(); $item = $menu->getActive(); if (!$item) { $item = $menu->getItem($this->input->getInt('Itemid', null)); } $id = 0; if (\is_object($item)) { public function render(\Throwable $error): string { $app = Factory::getApplication(); // Get the current template from the application $template = $app->getTemplate(true); // Push the error object into the document $this->getDocument()->setError($error); // Add registry file for the template asset 'subject' => $app, 'document' => $renderer->getDocument(), ]) ); $data = $renderer->render($error); // If nothing was rendered, just use the message from the Exception if (empty($data)) { $data = $error->getMessage(); } * @since 3.10.0 */ public static function handleException(\Throwable $error) { static::logException($error); static::render($error); } /** * Render the error page based on an exception. * ); // Trigger the onError event. $this->dispatchEvent('onError', $event); ExceptionHandler::handleException($event->getError()); } // Trigger the onBeforeRespond event. $this->dispatchEvent( 'onBeforeRespond',// Set the application as global app\Joomla\CMS\Factory::$application = $app;// Execute the application.$app->execute(); * define() is used rather than "const" to not error for PHP 5.2 and lower */define('_JEXEC', 1);// Run the application - All executable code should be triggered through this filerequire_once dirname(__FILE__) . '/includes/app.php'; * @since 2.0.0 * @throws PrepareStatementFailureException */ protected function prepareStatement(string $query): StatementInterface { return new MysqliStatement($this->connection, $query); } /** * Unlocks tables in the database. * $query->setLimit($limit, $offset); $sql = $this->replacePrefix((string) $query); $this->statement = $this->prepareStatement($sql); $this->sql = $query; $this->limit = (int) max(0, $limit); $this->offset = (int) max(0, $offset); if ($this->options['sqlModes'] !== []) { $this->connection->query('SET @@SESSION.sql_mode = \'' . implode(',', $this->options['sqlModes']) . '\';'); } // And read the real sql mode to mitigate changes in mysql > 5.7.+ $this->options['sqlModes'] = explode(',', $this->setQuery('SELECT @@SESSION.sql_mode;')->loadResult()); // If auto-select is enabled select the given database. if ($this->options['select'] && !empty($this->options['database'])) { $this->select($this->options['database']); } * @since 2.0.0 */ #[\ReturnTypeWillChange] public function open($save_path, $session_id) { $this->db->connect(); return true; } /** throw new \RuntimeException( sprintf('Failed to start the session because headers have already been sent by "%s" at line %d.', $file, $line) ); } if (!session_start()) { throw new \RuntimeException('Failed to start the session'); } $this->isActive(); $this->closed = false; $this->setId($session_clean); $cookie->set($session_name, '', time() - 3600); } } parent::start(); // Try loading data from the session if (!empty($_SESSION['joomla'])) { $this->data = unserialize(base64_decode($_SESSION['joomla'])); } { if ($this->isStarted()) { return; } $this->store->start(); $this->setState(SessionState::ACTIVE); // Initialise the session $this->setCounter(); * @since 1.0 */ public function has($name) { if (!$this->isActive()) { $this->start(); } return $this->store->has($name); } $name = $args[2] . '.' . $name; } } if (parent::has($name)) { // Parent is used because of b/c, can be changed in Joomla 6 return parent::get($name, $default); } /* __CLASS__ ), E_USER_DEPRECATED ); $instance = self::getApplication()->getSession()->get('user'); if (\is_null($id)) { if (!($instance instanceof User)) { $instance = User::getInstance(); } * * @since 3.2 */ protected function initialiseApp($options = []) { $user = Factory::getUser(); // If the user is a guest we populate it with the guest user group. if ($user->guest) { $guestUsergroup = ComponentHelper::getParams('com_users')->get('guest_usergroup', 1); $user->groups = [$guestUsergroup]; * @since 3.2 */ protected function doExecute() { // Initialise the application $this->initialiseApp(); // Mark afterInitialise in the profiler. JDEBUG ? $this->profiler->mark('afterInitialise') : null; // Route the application $this->sanityCheckSystemVariables(); $this->setupLogging(); $this->createExtensionNamespaceMap(); // Perform application routines. $this->doExecute(); // If we have an application document object, render it. if ($this->document instanceof \Joomla\CMS\Document\Document) { // Render the application output. $this->render();// Set the application as global app\Joomla\CMS\Factory::$application = $app;// Execute the application.$app->execute(); * define() is used rather than "const" to not error for PHP 5.2 and lower */define('_JEXEC', 1);// Run the application - All executable code should be triggered through this filerequire_once dirname(__FILE__) . '/includes/app.php';|
[2/2]
ClassNotFoundError
|
|---|
Symfony\Component\ErrorHandler\Error\ClassNotFoundError:
Attempted to load class "MysqliStatement" from namespace "Joomla\Database\Mysqli".
Did you forget a "use" statement for another namespace?
at /datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:1020
at Joomla\Database\Mysqli\MysqliDriver->prepareStatement('SELECT `m`.`id`,`m`.`menutype`,`m`.`title`,`m`.`alias`,`m`.`note`,`m`.`link`,`m`.`type`,`m`.`level`,`m`.`language`,`m`.`browserNav`,`m`.`access`,`m`.`params`,`m`.`home`,`m`.`img`,`m`.`template_style_id`,`m`.`component_id`,`m`.`parent_id`,`m`.`path` AS `route`,`e`.`element` AS `component`FROM `s4ib4_menu` AS `m`LEFT JOIN `s4ib4_extensions` AS `e` ON `m`.`component_id` = `e`.`extension_id`WHERE ((`m`.`published` = 1 AND `m`.`parent_id` > 0 AND `m`.`client_id` = 0) AND (`m`.`publish_up` IS NULL OR `m`.`publish_up` <= :currentDate1)) AND (`m`.`publish_down` IS NULL OR `m`.`publish_down` >= :currentDate2)ORDER BY `m`.`lft`')
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/vendor/joomla/database/src/DatabaseDriver.php:1785)
at Joomla\Database\DatabaseDriver->setQuery(object(MysqliQuery))
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Menu/SiteMenu.php:166)
at Joomla\CMS\Menu\SiteMenu->Joomla\CMS\Menu\{closure}()
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Cache/Controller/CallbackController.php:51)
at Joomla\CMS\Cache\Controller\CallbackController->get(object(Closure), array(), 'd17e8e13b99b4d9bf23a7d0b83a466c3', false)
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Menu/SiteMenu.php:179)
at Joomla\CMS\Menu\SiteMenu->load()
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Menu/AbstractMenu.php:333)
at Joomla\CMS\Menu\AbstractMenu->getMenu()
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Menu/AbstractMenu.php:164)
at Joomla\CMS\Menu\AbstractMenu->getItem(null)
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Application/SiteApplication.php:446)
at Joomla\CMS\Application\SiteApplication->getTemplate(true)
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Error/Renderer/HtmlRenderer.php:50)
at Joomla\CMS\Error\Renderer\HtmlRenderer->render(object(Error))
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Exception/ExceptionHandler.php:136)
at Joomla\CMS\Exception\ExceptionHandler::render(object(Error))
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Exception/ExceptionHandler.php:73)
at Joomla\CMS\Exception\ExceptionHandler::handleException(object(Error))
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Application/CMSApplication.php:336)
at Joomla\CMS\Application\CMSApplication->execute()
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/includes/app.php:58)
at require_once('/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/includes/app.php')
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/index.php:32)
|
|
[1/2]
Error
|
|---|
Error:
Class "Joomla\Database\Mysqli\MysqliStatement" not found
at /datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:1020
at Joomla\Database\Mysqli\MysqliDriver->prepareStatement('SELECT @@SESSION.sql_mode;')
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/vendor/joomla/database/src/DatabaseDriver.php:1785)
at Joomla\Database\DatabaseDriver->setQuery(object(MysqliQuery))
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:308)
at Joomla\Database\Mysqli\MysqliDriver->connect()
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/vendor/joomla/session/src/Handler/DatabaseHandler.php:223)
at Joomla\Session\Handler\DatabaseHandler->open('/opt/alt/php82/var/lib/php/session/', 'fe0d751b9ab98c62ad0ae5acb68cf498')
at session_start()
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/vendor/joomla/session/src/Storage/NativeStorage.php:459)
at Joomla\Session\Storage\NativeStorage->start()
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Session/Storage/JoomlaStorage.php:313)
at Joomla\CMS\Session\Storage\JoomlaStorage->start()
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/vendor/joomla/session/src/Session.php:396)
at Joomla\Session\Session->start()
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/vendor/joomla/session/src/Session.php:327)
at Joomla\Session\Session->has('user')
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Session/Session.php:194)
at Joomla\CMS\Session\Session->get('user')
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Factory.php:372)
at Joomla\CMS\Factory::getUser()
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Application/SiteApplication.php:582)
at Joomla\CMS\Application\SiteApplication->initialiseApp()
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Application/SiteApplication.php:238)
at Joomla\CMS\Application\SiteApplication->doExecute()
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Application/CMSApplication.php:306)
at Joomla\CMS\Application\CMSApplication->execute()
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/includes/app.php:58)
at require_once('/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/includes/app.php')
(/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/index.php:32)
|