Continuamos con esta serie con comenzó en MIC031S En esta segunda parte de este artículo veremos cómo utilizar operadores para la comparación de cadenas, comprobar cuántos caracteres tiene una cadena y cómo quitar los espacios en blanco. Parte 1 en MIC031S.

 

OPERADORES PARA COMPARACION DE STRINGS.

Para comparar 2 strings y comprobar si son iguales, se puede usar el operador '=='. La comparación es sensitiva a mayúsculas y minúsculas (case-sensitive), significando con esto que la string "hello", no es igual a "HELLO". Para saber si las strings son diferentes podemos usar el operador '!='. También es posible saber si una string es mayor o menor que otra string. Para esto podemos usar los operadores '>' y '<'.

Estos operadores funcionan en base a la posición que los caracteres ocupan en el set de caracteres ASCII. Para comparar string, tambien podemos usar la función equals(). En el siguiente programa se usan varios de estos operadores y puede ser encontrado en el menú: Archivo->Ejemplos->Strings->StringComparisonOperators. El diagrama de flujo puede ser observado en la Figura 10.

 

 

Figura 10. Diagrama de Flujo  para Operador de Comparación
Figura 10. Diagrama de Flujo para Operador de Comparación

 

 

String stringOne, stringTwo;

void setup() {

   // Open serial communications and wait for port to open:
   Serial.begin(9600);
   while (!Serial) {
      ; // wait for serial port to connect. Needed for native USB port only
   }
   stringOne = String("this");
   stringTwo = String("that");
   // send an intro:
   Serial.println("\n\nComparing Strings:");
   Serial.println();

}
 

void loop() {

   // two Strings equal:
   if (stringOne == "this") {
      Serial.println("StringOne == \"this\"");
   }

   // two Strings not equal:

   if (stringOne != stringTwo) {
      Serial.println(stringOne + " =! " + stringTwo);
   }

   // two Strings not equal (case sensitivity matters):

   stringOne = "This";
   stringTwo = "this";

   if (stringOne != stringTwo) {
      Serial.println(stringOne + " =! " + stringTwo);
   }
   // you can also use equals() to see if two Strings are the same:

   if (stringOne.equals(stringTwo)) {
      Serial.println(stringOne + " equals " + stringTwo);
   } else {
      Serial.println(stringOne + " does not equal " + stringTwo);
   } 

// or perhaps you want to ignore case:
   if (stringOne.equalsIgnoreCase(stringTwo)) {
      Serial.println(stringOne + " equals (ignoring case) " + stringTwo);
   } else {
      Serial.println(stringOne + " does not equal (ignoring case) " + stringTwo);
   }

   // a numeric String compared to the number it represents:

   stringOne = "1";
   int numberOne = 1;

   if (stringOne.toInt() == numberOne) {
       Serial.println(stringOne + " = " + numberOne);
   }

   // two numeric Strings compared:
   stringOne = "2";
   stringTwo = "1";

   if (stringOne >= stringTwo) {
      Serial.println(stringOne + " >= " + stringTwo);
   }

   // comparison operators can be used to compare Strings for alphabetic sorting too:

   stringOne = String("Brown");
   if (stringOne < "Charles") {
      Serial.println(stringOne + " < Charles");
   }

   if (stringOne > "Adams") {
      Serial.println(stringOne + " > Adams");
   }

   if (stringOne <= "Browne") {
      Serial.println(stringOne + " <= Browne");
   }

   if (stringOne >= "Brow") {
      Serial.println(stringOne + " >= Brow");
   }


   // the compareTo() operator also allows you to compare Strings
   // it evaluates on the first character that's different.
   // if the first character of the String you're comparing to comes first in
   // alphanumeric order, then compareTo() is greater than 0:

   stringOne = "Cucumber";
   stringTwo = "Cucuracha";

   if (stringOne.compareTo(stringTwo) < 0) {
      Serial.println(stringOne + " comes before " + stringTwo);
   } else {
       Serial.println(stringOne + " comes after " + stringTwo);
   }


   delay(10000); // because the next part is a loop:


   // compareTo() is handy when you've got Strings with numbers in them too:

 

   while (true) {

      stringOne = "Sensor: ";
      stringTwo = "Sensor: ";
      stringOne += analogRead(A0);
      stringTwo += analogRead(A5);

      if (stringOne.compareTo(stringTwo) < 0) {
          Serial.println(stringOne + " comes before " + stringTwo);
      } else {
         Serial.println(stringOne + " comes after " + stringTwo);
      }

   }

}

 

CREANDO O CONSTRUYENDO STRINGS.

Para crear o construir strings en un programa existen varias maneras. En la siguiente lista se muestran algunas de ellas:

String stringOne = "Hello String"; // usando una constante String.

String stringOne = String('a'); // convirtiendo una constante char en un String.

String stringTwo = String("This is a string"); // convertiendo una constante string // en un objeto String.

String stringOne = String(stringTwo + " with more"); // concatenando 2 strings

String stringOne = String(13); // usando una constante entera (integer)

String stringOne = String(analogRead(0), DEC); // usando un int y una base

String stringOne = String(45, HEX); // usando un int y una base (hexadecimal)

String stringOne = String(255, BIN); // usando un int y una base (binary)

String stringOne = String(millis(), DEC); // usando un long y una base

String stringOne = String(5.698, 3); // usando un float y lugares decimales.

En el siguiente programa usamos varios de estos constructores para crear strings. El compilador analiza que variables recibe la string en sus parámetros y de acuerdo a esto crea las respectivas string. A esto se le conoce en lenguaje C++ como sobrecarga de funciones.

Es decir que con el mismo nombre de una función, se pueden hacer varios tipos de función. El siguiente programa ejemplo puede ser encontrado en el menú: Archivo->Ejemplos->Strings->StringsConstructors. El diagrama de flujo puede ser observado en la Figura 11.

 

Figura 11. Diagrama de Flujo  para Constructores de Strings
Figura 11. Diagrama de Flujo para Constructores de Strings

 

 

void setup() {

   // Open serial communications and wait for port to open:
   Serial.begin(9600);

   while (!Serial) {
       ; // wait for serial port to connect. Needed for native USB port only
   }


   // send an intro:
    Serial.println("\n\nString Constructors:");
    Serial.println();
}

 
void loop() {

   // using a constant String:
   String stringOne = "Hello String";
   Serial.println(stringOne); // prints "Hello String"
   // converting a constant char into a String:
   stringOne = String('a');
   Serial.println(stringOne); // prints "a"
   // converting a constant string into a String object:
   String stringTwo = String("This is a string");
   Serial.println(stringTwo); // prints "This is a string"
   // concatenating two strings:
   stringOne = String(stringTwo + " with more");
   // prints "This is a string with more":
   Serial.println(stringOne);
   // using a constant integer:

   stringOne = String(13);
   Serial.println(stringOne); // prints "13"

   // using an int and a base:
   stringOne = String(analogRead(A0), DEC);
   // prints "453" or whatever the value of analogRead(A0) is
   Serial.println(stringOne);
   // using an int and a base (hexadecimal):
   stringOne = String(45, HEX);
   // prints "2d", which is the hexadecimal version of decimal 45:
   Serial.println(stringOne);
   // using an int and a base (binary)
   stringOne = String(255, BIN);
   // prints "11111111" which is the binary value of 255
   Serial.println(stringOne);
   // using a long and a base:
   stringOne = String(millis(), DEC);
   // prints "123456" or whatever the value of millis() is:
   Serial.println(stringOne);
   // using a float and the right decimal places:
   stringOne = String(5.698, 3);
   Serial.println(stringOne);
   // using a float and less decimal places to use rounding:
   stringOne = String(5.698, 2);
   Serial.println(stringOne);
   // do nothing while true:

   while (true);

}

 

LOCALIZANDO UN STRING DENTRO DE OTRO STRING.

Para localizar un string dentro de otro string podemos usar la función: string.indexOf(val) donde el parámetro 'val' es el carácter o string a buscar. La función retorna el índex de 'val' dentro del string o -1 caso no sea encontrado el string. También podemos usar la función: string.indexOf(val, from) donde el parámetro 'from' recibe el índex desde donde iniciar la búsqueda.

Las funciones anteriores comienzan la búsqueda desde el inicio del string. Si queremos iniciar una búsqueda a partir del final (end) del string, podemos usar la función: string.lastIndexOf(val) o también la función: string.lastIndexOf(val, from). El siguiente programa da un ejemplo del uso de estas funciones y puede ser encontrado en el menú: Archivo->Ejemplos->Strings->StringsIndexOf.

 

void setup() {

   // Open serial communications and wait for port to open:
   Serial.begin(9600);

   while (!Serial) {
      ; // wait for serial port to connect. Needed for native USB port only
    }

    // send an intro:
    Serial.println("\n\nString indexOf() and lastIndexOf() functions:");
    Serial.println();

}

 

void loop() {

   // indexOf() returns the position (i.e. index) of a particular character in a
   // String. For example, if you were parsing HTML tags, you could use it:

   String stringOne = "";
   int firstClosingBracket = stringOne.indexOf('>');
   Serial.println("The index of > in the string " + stringOne + " is " + firstClosingBracket);
   stringOne = "";
   int secondOpeningBracket = firstClosingBracket + 1;
   int secondClosingBracket = stringOne.indexOf('>', secondOpeningBracket);
   Serial.println("The index of the second > in the string " + stringOne + " is " + secondClosingBracket);

   // you can also use indexOf() to search for Strings:
   stringOne = "";
   int bodyTag = stringOne.indexOf("");
   Serial.println("The index of the body tag in the string " + stringOne + " is " + bodyTag);

   stringOne = "
      item
      item
      item
   ";

   int firstListItem = stringOne.indexOf("

   ");
 

   int secondListItem = stringOne.indexOf("

   ", firstListItem + 1);
 

   Serial.println("The index of the second list tag in the string " + stringOne + " is " + secondListItem);
   // lastIndexOf() gives you the last occurrence of a character or string:
   int lastOpeningBracket = stringOne.lastIndexOf('<');
   Serial.println("The index of the last < in the string " + stringOne + " is " + lastOpeningBracket);

   int lastListItem = stringOne.lastIndexOf("

   ");
 
   Serial.println("The index of the last list tag in the string " + stringOne + " is " + lastListItem);

   // lastIndexOf() can also search for a string:

   stringOne = "
      Lorem ipsum dolor sit amet
      Ipsem
      Quod
   ";

   int lastParagraph = stringOne.lastIndexOf("<p");
   int secondLastGraf = stringOne.lastIndexOf("<p", lastParagraph - 1);

   Serial.println("The index of the second to last paragraph tag " + stringOne + " is " + secondLastGraf);

   // do nothing while true:

   while (true);

}

 

AVERIGUANDO CUANTOS CARACTERES TIENE UN STRING (LENGTH).

Para conocer cuántos caracteres tiene un string podemos usar la función: string.length() la cual retorna el ancho de caracteres. Esta función no cuenta el último carácter del string, conocido como el carácter null. Este carácter es el hexadecimal 0x00. El siguiente programa usa la función length() y puede ser encontrado en el menú: Archivo->Ejemplos->Strings->StringLength. El diagrama de flujo puede ser observado en la Figura 12.

 

 

Figura 12. Diagrama de Flujo  para saber cuantos caracteres tiene un string
Figura 12. Diagrama de Flujo para saber cuantos caracteres tiene un string

 

 

String txtMsg = ""; // a string for incoming text
unsigned int lastStringLength = txtMsg.length(); // previous length of the String

void setup() {

   // Open serial communications and wait for port to open:
   Serial.begin(9600);

   while (!Serial) {
      ; // wait for serial port to connect. Needed for native USB port only
   }

   // send an intro:
   Serial.println("\n\nString length():");
   Serial.println();

}


void loop() {

   // add any incoming characters to the String:
   while (Serial.available() > 0) {
      char inChar = Serial.read();
      txtMsg += inChar;
   }

   // print the message and a notice if it's changed:
   if (txtMsg.length() != lastStringLength) {
      Serial.println(txtMsg);
      Serial.println(txtMsg.length());

      // if the String's longer than 140 characters, complain:
      if (txtMsg.length() < 140) {
         Serial.println("That's a perfectly acceptable text message");
      } else {
         Serial.println("That's too long for a text message.");
      }

      // note the length for next time through the loop:
      lastStringLength = txtMsg.length();

      }

}

 

REMOVIENDO LOS ESPACIOS EN BLANCO DE UN STRING (TRIM).

Es común en programación con microcontroladores, encontrar espacios en blanco al inicio y final del string. Para remover estos espacios se puede usar la función: string.trim().

Esta función modifica la string y elimina cualquier espacio en blanco. El siguiente programa hace uso de esta función y puede ser encontrado en el menú: Archivo->Ejemplos->Strings->StringLengthTrim. El diagrama de flujo puede ser observado en la Figura 13.

 

 

Figura 13. Diagrama de Flujo  para eliminar espacios en blanco
Figura 13. Diagrama de Flujo para eliminar espacios en blanco

 

 

void setup() {

   // Open serial communications and wait for port to open:
   Serial.begin(9600);
   while (!Serial) {
      ; // wait for serial port to connect. Needed for native USB port only
   }

   // send an intro:
   Serial.println("\n\nString length() and trim():");
   Serial.println();

}

 

void loop() {

    // here's a String with empty spaces at the end (called white space):
    String stringOne = "Hello! ";
    Serial.print(stringOne);
    Serial.print("
    Serial.println(stringOne.length());

    // trim the white space off the string:
   stringOne.trim();
   Serial.print(stringOne);
   Serial.print("
   Serial.println(stringOne.length());

   // do nothing while true:
   while (true);

}

 

En la última parte de esta serie (Parte 3 en MIC033S) presentaremos algunos más ejemplos y práctica para trabajar con cadenas de textos con el Arduino Uno.

19.208MBMemory Usage42.61msRequest Duration
Joomla! Version5.2.3
PHP Version8.3.16
Identityguest
Response200
Templatecassiopeia
Database
Server
mysql
Version
10.5.22-MariaDB
Collation
latin1_swedish_ci
Conn Collation
utf8mb4_general_ci
$_GET
[]
$_POST
[]
$_SESSION
array:1 [ "joomla" => "***redacted***" ]
$_COOKIE
[]
$_SERVER
array:51 [ "USER" => "apache" "HOME" => "/usr/share/httpd" "SCRIPT_NAME" => "/index.php" "RE...
session
array:3 [ "counter" => 1 "timer" => array:3 [ "start" => 1741914667 "last" => 1741914667...
registry
array:3 [ "data" => [] "initialized" => false "separator" => "." ]
user
array:21 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (85.86KB) (195μs)
  • afterInitialise (1.14MB) (3.13ms)
  • afterRoute (179.16KB) (867μs)
  • beforeRenderComponent com_content (100.65KB) (411μs)
  • Before Access::preloadComponents (all components) (33.5KB) (187μs)
  • After Access::preloadComponents (all components) (107.06KB) (365μs)
  • Before Access::preloadPermissions (com_content) (1.57KB) (8μs)
  • After Access::preloadPermissions (com_content) (16.19MB) (21.51ms)
  • Before Access::getAssetRules (id:8 name:com_content) (480.16KB) (2.2ms)
  • After Access::getAssetRules (id:8 name:com_content) (7.36KB) (39μs)
  • afterRenderComponent com_content (535.69KB) (5.73ms)
  • afterDispatch (2.25KB) (45μs)
  • beforeRenderRawModule mod_articles_category (Banco de Circuitos) (423.33KB) (1.54ms)
  • afterRenderRawModule mod_articles_category (Banco de Circuitos) (15.43KB) (294μs)
  • beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (87μs)
  • afterRenderRawModule mod_finder (Busca_inteligente) (63.1KB) (1.12ms)
  • beforeRenderModule mod_articles_category (Banco de Circuitos) (9.98KB) (585μs)
  • afterRenderModule mod_articles_category (Banco de Circuitos) (5.39KB) (62μs)
  • beforeRenderModule mod_finder (Busca_inteligente) (6.39KB) (180μs)
  • afterRenderModule mod_finder (Busca_inteligente) (4.44KB) (47μs)
  • afterRender (352.48KB) (3.89ms)
  • 1 x After Access::preloadPermissions (com_content) (16.19MB) (50.49%)
    21.51ms
    1 x afterRenderComponent com_content (535.69KB) (13.44%)
    5.73ms
    1 x afterRender (352.48KB) (9.14%)
    3.89ms
    1 x afterInitialise (1.14MB) (7.35%)
    3.13ms
    1 x Before Access::getAssetRules (id:8 name:com_content) (480.16KB) (5.16%)
    2.20ms
    1 x beforeRenderRawModule mod_articles_category (Banco de Circuitos) (423.33KB) (3.62%)
    1.54ms
    1 x afterRenderRawModule mod_finder (Busca_inteligente) (63.1KB) (2.64%)
    1.12ms
    1 x afterRoute (179.16KB) (2.03%)
    867μs
    1 x beforeRenderModule mod_articles_category (Banco de Circuitos) (9.98KB) (1.37%)
    585μs
    1 x beforeRenderComponent com_content (100.65KB) (0.96%)
    411μs
    1 x After Access::preloadComponents (all components) (107.06KB) (0.86%)
    365μs
    1 x afterRenderRawModule mod_articles_category (Banco de Circuitos) (15.43KB) (0.69%)
    294μs
    1 x afterLoad (85.86KB) (0.46%)
    195μs
    1 x Before Access::preloadComponents (all components) (33.5KB) (0.44%)
    187μs
    1 x beforeRenderModule mod_finder (Busca_inteligente) (6.39KB) (0.42%)
    180μs
    1 x beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (0.2%)
    87μs
    1 x afterRenderModule mod_articles_category (Banco de Circuitos) (5.39KB) (0.15%)
    62μs
    1 x afterRenderModule mod_finder (Busca_inteligente) (4.44KB) (0.11%)
    47μs
    1 x afterDispatch (2.25KB) (0.11%)
    45μs
    1 x After Access::getAssetRules (id:8 name:com_content) (7.36KB) (0.09%)
    39μs
    1 x Before Access::preloadPermissions (com_content) (1.57KB) (0.02%)
    8μs
23 statements were executed, 5 of which were duplicates, 18 unique11.54ms1.68MB
  • SELECT @@SESSION.sql_mode;29μs968B/libraries/src/Session/MetadataManager.php:184Copy
  • SELECT `session_id` FROM `incbmx_session` WHERE `session_id` = :session_id LIMIT 170μs1.3KBParams/libraries/src/Session/MetadataManager.php:187Copy
  • INSERT INTO `incbmx_session` (`session_id`,`guest`,`time`,`userid`,`username`,`client_id`) VALUES (:session_id, :guest, :time, :user_id, :username, :client_id)193μs944BParams/libraries/src/Session/MetadataManager.php:260Copy
  • SELECT `id`,`rules` FROM `incbmx_viewlevels`48μs656B/libraries/src/Access/Access.php:955Copy
  • SELECT `b`.`id` FROM `incbmx_usergroups` AS `a` LEFT JOIN `incbmx_usergroups` AS `b` ON `b`.`lft` <= `a`.`lft` AND `b`.`rgt` >= `a`.`rgt` WHERE `a`.`id` = :guest73μs1.64KBParams/libraries/src/Access/Access.php:868Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`261μs20.2KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `incbmx_assets` WHERE `name` IN (:preparedArray1,:preparedArray2,:preparedArray3,:preparedArray4,:preparedArray5,:preparedArray6,:preparedArray7,:preparedArray8,:preparedArray9,:preparedArray10,:preparedArray11,:preparedArray12,:preparedArray13,:preparedArray14,:preparedArray15,:preparedArray16,:preparedArray17,:preparedArray18,:preparedArray19,:preparedArray20,:preparedArray21,:preparedArray22,:preparedArray23,:preparedArray24,:preparedArray25,:preparedArray26,:preparedArray27,:preparedArray28,:preparedArray29,:preparedArray30,:preparedArray31,:preparedArray32,:preparedArray33,:preparedArray34,:preparedArray35,:preparedArray36,:preparedArray37,:preparedArray38,:preparedArray39)211μs7.44KBParams/libraries/src/Access/Access.php:357Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `incbmx_assets` WHERE `name` LIKE :asset OR `name` = :extension OR `parent_id` = 07.92ms1.46MBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `incbmx_assets`308μs2.02KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • SELECT * FROM `incbmx_assets` WHERE `name` = 'com_content.article.2537'50μs912B/libraries/src/Table/Table.php:780Copy
  • SHOW FULL COLUMNS FROM `incbmx_content`287μs1.77KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • UPDATE `incbmx_content` SET `hits` = (`hits` + 1) WHERE `id` = '2537'141μs48B/libraries/src/Table/Table.php:1348Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `incbmx_content` AS `a` INNER JOIN `incbmx_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `incbmx_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `incbmx_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `incbmx_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `incbmx_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)206μs78.12KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`258μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `m`.`tag_id`,`t`.* FROM `incbmx_contentitem_tag_map` AS `m` INNER JOIN `incbmx_tags` AS `t` ON `m`.`tag_id` = `t`.`id` WHERE `m`.`type_alias` = :contentType AND `m`.`content_item_id` = :id AND `t`.`published` = 1 AND `t`.`access` IN (:preparedArray1,:preparedArray2)224μs3.97KBParams/libraries/src/Helper/TagsHelper.php:388Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`173μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT DISTINCT a.id, a.title, a.name, a.checked_out, a.checked_out_time, a.note, a.state, a.access, a.created_time, a.created_user_id, a.ordering, a.language, a.fieldparams, a.params, a.type, a.default_value, a.context, a.group_id, a.label, a.description, a.required, a.only_use_in_subform,l.title AS language_title, l.image AS language_image,uc.name AS editor,ag.title AS access_level,ua.name AS author_name,g.title AS group_title, g.access as group_access, g.state AS group_state, g.note as group_note FROM incbmx_fields AS a LEFT JOIN `incbmx_languages` AS l ON l.lang_code = a.language LEFT JOIN incbmx_users AS uc ON uc.id=a.checked_out LEFT JOIN incbmx_viewlevels AS ag ON ag.id = a.access LEFT JOIN incbmx_users AS ua ON ua.id = a.created_user_id LEFT JOIN incbmx_fields_groups AS g ON g.id = a.group_id LEFT JOIN `incbmx_fields_categories` AS fc ON fc.field_id = a.id WHERE ( (`a`.`context` = :context AND (`fc`.`category_id` IS NULL OR `fc`.`category_id` IN (:preparedArray1,:preparedArray2,:preparedArray3)) AND `a`.`access` IN (:preparedArray4,:preparedArray5)) AND (`a`.`group_id` = 0 OR `g`.`access` IN (:preparedArray6,:preparedArray7)) AND `a`.`state` = :state) AND (`a`.`group_id` = 0 OR `g`.`state` = :gstate) AND `a`.`only_use_in_subform` = :only_use_in_subform ORDER BY a.ordering ASC372μs6.06KBParams/libraries/src/MVC/Model/BaseDatabaseModel.php:164Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`185μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `name`,`element` FROM `incbmx_extensions` WHERE `type` = 'plugin' AND `folder` = 'finder' AND `enabled` = 1153μs656B/administrator/components/com_finder/src/Helper/LanguageHelper.php:135Copy
  • SELECT `title` FROM `incbmx_finder_taxonomy` WHERE `parent_id` = 1 AND `state` = 1 AND `access` IN (1,5)88μs648B/administrator/components/com_finder/src/Indexer/Taxonomy.php:325Copy
  • SELECT * FROM `incbmx_schemaorg` WHERE `itemId` = :itemId AND `context` = :context60μs1.55KBParams/plugins/system/schemaorg/src/Extension/Schemaorg.php:403Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `incbmx_content` AS `a` INNER JOIN `incbmx_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `incbmx_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `incbmx_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `incbmx_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `incbmx_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)166μs78.17KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT SUM(CASE WHEN `a`.`next_execution` <= :now THEN 1 ELSE 0 END) AS due_count,SUM(CASE WHEN `a`.`locked` IS NULL THEN 0 ELSE 1 END) AS locked_count FROM `incbmx_scheduler_tasks` AS `a` WHERE `a`.`state` = 163μs1.37KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:465Copy
  • warningassets - No asset found for com_content.article.2537, falling back to com_content
  • warningassets - No asset found for com_content.article.2537, falling back to com_content
  • warningassets - No asset found for com_content.article.2537, falling back to com_content
  • warningassets - No asset found for com_content.article.2537, falling back to com_content
  • warningassets - No asset found for com_content.article.2537, falling back to com_content
  • warningassets - No asset found for com_content.article.2537, falling back to com_content
  • warningassets - No asset found for com_content.article.2537, falling back to com_content
  • warningassets - No asset found for com_content.article.2537, falling back to com_content
  • warningassets - No asset found for com_content.article.2537, falling back to com_content
  • warningassets - No asset found for com_content.article.2537, falling back to com_content