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; } } Attempted to load class "MysqliStatement" from namespace "Joomla\Database\Mysqli". Did you forget a "use" statement for another namespace? (500 Whoops, looks like something went wrong.)

Error ClassNotFoundError

HTTP 500 Whoops, looks like something went wrong.

Attempted to load class "MysqliStatement" from namespace "Joomla\Database\Mysqli".
Did you forget a "use" statement for another namespace?

Exceptions 2

Symfony\Component\ErrorHandler\Error\ ClassNotFoundError

  1.      * @since   2.0.0
  2.      * @throws  PrepareStatementFailureException
  3.      */
  4.     protected function prepareStatement(string $query): StatementInterface
  5.     {
  6.         return new MysqliStatement($this->connection$query);
  7.     }
  8.     /**
  9.      * Unlocks tables in the database.
  10.      *
  1.         $query->setLimit($limit$offset);
  2.         $sql $this->replacePrefix((string) $query);
  3.         $this->statement $this->prepareStatement($sql);
  4.         $this->sql    $query;
  5.         $this->limit  = (int) max(0$limit);
  6.         $this->offset = (int) max(0$offset);
  1.                 )
  2.                 ->bind(':currentDate2'$currentDate)
  3.                 ->order($this->db->quoteName('m.lft'));
  4.             $items    = [];
  5.             $iterator $this->db->setQuery($query)->getIterator();
  6.             foreach ($iterator as $item) {
  7.                 $items[$item->id] = new MenuItem((array) $item);
  8.             }
  1.             $referenceArgs = &$args;
  2.         }
  3.         // Just execute the callback if caching is disabled.
  4.         if (empty($this->options['caching'])) {
  5.             return \call_user_func_array($callback$referenceArgs);
  6.         }
  7.         if (!$id) {
  8.             // Generate an ID
  9.             $id $this->_makeId($callback$args);
CallbackController->get(object(Closure), array(), 'd17e8e13b99b4d9bf23a7d0b83a466c3', false) in /datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/libraries/src/Menu/SiteMenu.php (line 179)
  1.         try {
  2.             /** @var CallbackController $cache */
  3.             $cache $this->getCacheControllerFactory()->createCacheController('callback', ['defaultgroup' => 'com_menus']);
  4.             $this->items $cache->get($loader, [], md5(\get_class($this)), false);
  5.         } catch (CacheExceptionInterface $e) {
  6.             try {
  7.                 $this->items $loader();
  8.             } catch (ExecutionFailureException $databaseException) {
  9.                 $this->app->enqueueMessage(Text::sprintf('JERROR_LOADING_MENUS'$databaseException->getMessage()), 'warning');
  1.      * @since   1.5
  2.      */
  3.     public function getMenu()
  4.     {
  5.         if (!$this->itemsLoaded) {
  6.             $this->load();
  7.             foreach ($this->items as $item) {
  8.                 if ($item->home) {
  9.                     $this->default[trim($item->language)] = $item->id;
  10.                 }
  1.      */
  2.     public function getItem($id)
  3.     {
  4.         $result null;
  5.         if (isset($this->getMenu()[$id])) {
  6.             $result = &$this->getMenu()[$id];
  7.         }
  8.         return $result;
  9.     }
  1.         // Get the id of the active menu item
  2.         $menu $this->getMenu();
  3.         $item $menu->getActive();
  4.         if (!$item) {
  5.             $item $menu->getItem($this->input->getInt('Itemid'null));
  6.         }
  7.         $id 0;
  8.         if (\is_object($item)) {
  1.     public function render(\Throwable $error): string
  2.     {
  3.         $app Factory::getApplication();
  4.         // Get the current template from the application
  5.         $template $app->getTemplate(true);
  6.         // Push the error object into the document
  7.         $this->getDocument()->setError($error);
  8.         // Add registry file for the template asset
  1.                     'subject'  => $app,
  2.                     'document' => $renderer->getDocument(),
  3.                 ])
  4.             );
  5.             $data $renderer->render($error);
  6.             // If nothing was rendered, just use the message from the Exception
  7.             if (empty($data)) {
  8.                 $data $error->getMessage();
  9.             }
  1.      * @since   3.10.0
  2.      */
  3.     public static function handleException(\Throwable $error)
  4.     {
  5.         static::logException($error);
  6.         static::render($error);
  7.     }
  8.     /**
  9.      * Render the error page based on an exception.
  10.      *
  1.             );
  2.             // Trigger the onError event.
  3.             $this->dispatchEvent('onError'$event);
  4.             ExceptionHandler::handleException($event->getError());
  5.         }
  6.         // Trigger the onBeforeRespond event.
  7.         $this->dispatchEvent(
  8.             'onBeforeRespond',
  1. // Set the application as global app
  2. \Joomla\CMS\Factory::$application $app;
  3. // Execute the application.
  4. $app->execute();
require_once('/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/includes/app.php') in /datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/index.php (line 32)
  1.  * define() is used rather than "const" to not error for PHP 5.2 and lower
  2.  */
  3. define('_JEXEC'1);
  4. // Run the application - All executable code should be triggered through this file
  5. require_once dirname(__FILE__) . '/includes/app.php';

Error

Class "Joomla\Database\Mysqli\MysqliStatement" not found

  1.      * @since   2.0.0
  2.      * @throws  PrepareStatementFailureException
  3.      */
  4.     protected function prepareStatement(string $query): StatementInterface
  5.     {
  6.         return new MysqliStatement($this->connection$query);
  7.     }
  8.     /**
  9.      * Unlocks tables in the database.
  10.      *
  1.         $query->setLimit($limit$offset);
  2.         $sql $this->replacePrefix((string) $query);
  3.         $this->statement $this->prepareStatement($sql);
  4.         $this->sql    $query;
  5.         $this->limit  = (int) max(0$limit);
  6.         $this->offset = (int) max(0$offset);
  1.         if ($this->options['sqlModes'] !== []) {
  2.             $this->connection->query('SET @@SESSION.sql_mode = \'' implode(','$this->options['sqlModes']) . '\';');
  3.         }
  4.         // And read the real sql mode to mitigate changes in mysql > 5.7.+
  5.         $this->options['sqlModes'] = explode(','$this->setQuery('SELECT @@SESSION.sql_mode;')->loadResult());
  6.         // If auto-select is enabled select the given database.
  7.         if ($this->options['select'] && !empty($this->options['database'])) {
  8.             $this->select($this->options['database']);
  9.         }
  1.      * @since   2.0.0
  2.      */
  3.     #[\ReturnTypeWillChange]
  4.     public function open($save_path$session_id)
  5.     {
  6.         $this->db->connect();
  7.         return true;
  8.     }
  9.     /**
DatabaseHandler->open('/opt/alt/php82/var/lib/php/session/', 'fe0d751b9ab98c62ad0ae5acb68cf498')
  1.             throw new \RuntimeException(
  2.                 sprintf('Failed to start the session because headers have already been sent by "%s" at line %d.'$file$line)
  3.             );
  4.         }
  5.         if (!session_start()) {
  6.             throw new \RuntimeException('Failed to start the session');
  7.         }
  8.         $this->isActive();
  9.         $this->closed  false;
  1.                 $this->setId($session_clean);
  2.                 $cookie->set($session_name''time() - 3600);
  3.             }
  4.         }
  5.         parent::start();
  6.         // Try loading data from the session
  7.         if (!empty($_SESSION['joomla'])) {
  8.             $this->data unserialize(base64_decode($_SESSION['joomla']));
  9.         }
  1.     {
  2.         if ($this->isStarted()) {
  3.             return;
  4.         }
  5.         $this->store->start();
  6.         $this->setState(SessionState::ACTIVE);
  7.         // Initialise the session
  8.         $this->setCounter();
  1.      * @since   1.0
  2.      */
  3.     public function has($name)
  4.     {
  5.         if (!$this->isActive()) {
  6.             $this->start();
  7.         }
  8.         return $this->store->has($name);
  9.     }
  1.                 $name $args[2] . '.' $name;
  2.             }
  3.         }
  4.         if (parent::has($name)) {
  5.             // Parent is used because of b/c, can be changed in Joomla 6
  6.             return parent::get($name$default);
  7.         }
  8.         /*
  1.                 __CLASS__
  2.             ),
  3.             E_USER_DEPRECATED
  4.         );
  5.         $instance self::getApplication()->getSession()->get('user');
  6.         if (\is_null($id)) {
  7.             if (!($instance instanceof User)) {
  8.                 $instance User::getInstance();
  9.             }
  1.      *
  2.      * @since   3.2
  3.      */
  4.     protected function initialiseApp($options = [])
  5.     {
  6.         $user Factory::getUser();
  7.         // If the user is a guest we populate it with the guest user group.
  8.         if ($user->guest) {
  9.             $guestUsergroup ComponentHelper::getParams('com_users')->get('guest_usergroup'1);
  10.             $user->groups   = [$guestUsergroup];
  1.      * @since   3.2
  2.      */
  3.     protected function doExecute()
  4.     {
  5.         // Initialise the application
  6.         $this->initialiseApp();
  7.         // Mark afterInitialise in the profiler.
  8.         JDEBUG $this->profiler->mark('afterInitialise') : null;
  9.         // Route the application
  1.             $this->sanityCheckSystemVariables();
  2.             $this->setupLogging();
  3.             $this->createExtensionNamespaceMap();
  4.             // Perform application routines.
  5.             $this->doExecute();
  6.             // If we have an application document object, render it.
  7.             if ($this->document instanceof \Joomla\CMS\Document\Document) {
  8.                 // Render the application output.
  9.                 $this->render();
  1. // Set the application as global app
  2. \Joomla\CMS\Factory::$application $app;
  3. // Execute the application.
  4. $app->execute();
require_once('/datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/includes/app.php') in /datas/yulpa173848/sites/test2025.samclap-ufolep.fr/htdocs/index.php (line 32)
  1.  * define() is used rather than "const" to not error for PHP 5.2 and lower
  2.  */
  3. define('_JEXEC'1);
  4. // Run the application - All executable code should be triggered through this file
  5. require_once dirname(__FILE__) . '/includes/app.php';

Stack Traces 2

[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)