Muchas aplicaciones con microcontroladores hacen uso de cadenas de texto o strings. Debido al gran desarrollo de la internet y Ethernet en los microcontroladores y los sistemas de mensaje movil o gsm, los mensajes de texto se utilizan ampliamente para satisfacer estas necesidades. También proyectos que se comunican con computadores o muestran información en pantallas LCD, usan mucho los strings. Muchas cámaras de vigilancia, sistemas de comunicación de radio y antenas, equipos industriales y médicos, etc, usan paginas web para dar información a los usuarios y poder ser configurados por medio de un computador portátil. En este articulo aprenderemos como controlar strings para usar en proyectos electrónicos con Arduino.

 

Es posible adicionar al sistema Arduino, una tarjeta que contenga una interface a red Ethernet. Esto hace posible crear servidores web dentro de un microcontrolador y dar información a usuarios. También es común usar páginas web para configurar y monitorear la mayoría de equipos electrónicos modernos.

Así, se está desarrollando lo que se llama Internet de la cosas (IoT). Un sistema donde los equipos eléctricos y electrónicos se pueden controlar a través de internet. Páginas web son cadenas de texto o strings que usa un lenguaje llamado HTML o Lenguaje de Marcación de Texto y para transportar las strings, usa un protocolo llamado HTTP o Protocolo de Transporte de Texto. También los sistemas de posicionamiento geográfico global o GPS usan string para dar información. Los sistemas móviles de mensajes o GSM, también utilizan strings. Todo esto usa ampliamente las strings y por eso es importante conocer cómo crearlas y manipularlas.

 

Figura 1. Placa de Arduino Uno
Figura 1. Placa de Arduino Uno

 

En la Figura 1 podemos ver la tarjeta Arduino Uno y en la Figura 2 su IDE o ambiente de desarrollo y programación.

 

Figura 2. Ambiente de desarrollo de Arduino Uno
Figura 2. Ambiente de desarrollo de Arduino Uno

 

Los programas usados en este artículo pueden ser encontrados en el menú: Archivo->Ejemplos->Strings de la IDE de Arduino. Vea la Figura 3.

 

Figura 3. Menu para codigo ejemplo con strings
Figura 3. Menu para codigo ejemplo con strings

 

Cadenas de texto o strings son un tipo de dato usado en la mayoría de los compiladores para microcontroladores. La IDE de Arduino posee una biblioteca dedicada a String. Esta biblioteca posee las siguientes funciones:

String()

charAt()

compareTo()

concat()

endsWith()

equals()

equalsIgnoreCase()

getBytes()

indexOf()

lastIndexOf()

length()

remove()

replace()

reserve()

setCharAt()

startsWith()

substring()

toCharArray()

toInt()

toFloat()

toLowerCase()

toUpperCase()

trim()

En el presente artículo estudiaremos la mayoría de ellas con programas prácticos.

Cadenas de texto son como arrays de caracteres ASCII. Eso significa que ocupan un lugar en la memoria y que un carácter sigue al otro o esta después del otro. La Figura 4 muestra ejemplos de cadenas de texto almacenados en memoria.

 

Figura 4. Ejemplos de strings en memoria
Figura 4. Ejemplos de strings en memoria

 

Hay 2 maneras de crear cadenas de texto. Una es creando un objeto o estructura a partir de la Clase String. El siguiente es un ejemplo:

String reportString = "SensorReading: 456";

En la anterior línea de código, se ha creado un String llamado: reportString y se inicializo con el texto: SensorReading: 456. Podemos notar que objetos o datos string en C++ deben ser escritos con 'S' mayúscula (upper case). Objetos en C++, son muy similares a estructuras en lenguaje C. Así podemos decir que Objetos son como variables o datos de un determinado tipo o clase. Para el caso de este artículo, trabajaremos con objetos de la clase String.

La otra manera es crear un array de caracteres y el siguiente es un ejemplo:

char nameString[] = "Jhon";

La anterior línea de código crea un array de caracteres y almacena en ella el nombre: Jhon. Esta forma de crear string es el utilizado en la programación en C. Algunas de las funciones más usadas en este estilo C de programación para manejar string son:

strset(str1, str2) // Coloca un valor de texto en el string.

strcap(str1, str2) // Junta 2 string.

strlen(str1) // Retorna cuantos caracteres tiene la string.

Una desventaja al usar cadenas de texto o string en lengua C, es que, el programador debe definir previamente un array o espacio de memoria para almacenar los caracteres del string. Caso el string en algún momento sea más grande que lo proyectado, pueden haber algunos inconvenientes. Ya en el lenguaje C++, esto es gerenciado por el propio sistema de memoria, y por ese motivo, es mejor usar string en C++.

Para el desarrollo de este artículo usaremos principalmente objetos String o el estilo de programación C++. Los resultados de los programas ejemplo pueden ser vistos en el monitor serie de la IDE. Vea la Figura 5. Son muchas las ventajas de usar objetos String. Entre ellas, una mejor legibilidad en el código escrito y funciones más poderosas para manejar string.

 

Figura 5. Terminal Serial de la IDE de Arduino
Figura 5. Terminal Serial de la IDE de Arduino

 

 

OPERADOR DE ADICION PARA STRING.

Para adicionar un valor a una cadena de texto o string, usamos el operador de adición, representado por el símbolo '+'. Como comentado anteriormente, el lenguaje de programación para Arduino es basado en la C/C++. Por este motivo, muchos tipos de datos son basados en objetos o estructuras, haciendo más fácil la programación. Tal es el caso de las cadenas de texto o string, que permiten su fácil manipulación y concatenación. En el siguiente programa crearemos 3 strings, las cuales vamos a adicionar con otras string y valores de tipo numérico. El programa puede ser encontrado en el menú: Archivo->Ejemplos->Strings->StringAdditionOperator. El diagrama de flujo puede ser observado en la Figura 6.

 

Figura 6. Diagrama de Flujo  para Operador de Adición
Figura 6. Diagrama de Flujo para Operador de Adición

 

 

// declare three Strings:

String stringOne, stringTwo, stringThree;

 

void setup() {

// initialize serial 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("You added ");

stringTwo = String("this string");

stringThree = String();

// send an intro:

Serial.println("\n\nAdding Strings together (concatenation):");

Serial.println();

}

 

void loop() {

// adding a constant integer to a String:

stringThree = stringOne + 123;

Serial.println(stringThree); // prints "You added 123"

 

// adding a constant long integer to a String:

stringThree = stringOne + 123456789;

Serial.println(stringThree); // prints "You added 123456789"

 

// adding a constant character to a String:

stringThree = stringOne + 'A';

Serial.println(stringThree); // prints "You added A"

 

// adding a constant string to a String:

stringThree = stringOne + "abc";

Serial.println(stringThree); // prints "You added abc"

 

stringThree = stringOne + stringTwo;

Serial.println(stringThree); // prints "You added this string"

 

// adding a variable integer to a String:

int sensorValue = analogRead(A0);

stringOne = "Sensor value: ";

stringThree = stringOne + sensorValue;

Serial.println(stringThree); // prints "Sensor Value: 401" or whatever value analogRead(A0) has

 

// adding a variable long integer to a String:

stringOne = "millis() value: ";

stringThree = stringOne + millis();

Serial.println(stringThree); // prints "The millis: 345345" or whatever value millis() has

 

// do nothing while true:

   while (true);

}

 

OPERADOR APENDICE Y DE CONCATENACIÓN.

Una de las operaciones más usadas es adicionar un texto al final de una string. Para esto podemos usar el operador '+='. Cuando usamos este operador, el compilador adiciona al final de la string. En el siguiente programa podemos ver varios usos de este operador. También es posible utilizar la función concat(), para hacer concatenaciones de datos. El programa ejemplo puede ser encontrado en el menú: Archivo->Ejemplos->Strings->StringAppendOperator. El diagrama de flujo puede ser observado en la Figura 7.

 

Figura 7. Diagrama de Flujo  para Operador de Concatenación
Figura 7. Diagrama de Flujo para Operador de Concatenació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("Sensor ");

stringTwo = String("value");

// send an intro:

Serial.println("\n\nAppending to a String:");

Serial.println();

}

 

void loop() {

Serial.println(stringOne); // prints "Sensor "

 

// adding a string to a String:

stringOne += stringTwo;

Serial.println(stringOne); // prints "Sensor value"

 

// adding a constant string to a String:

stringOne += " for input ";

Serial.println(stringOne); // prints "Sensor value for input"

 

// adding a constant character to a String:

stringOne += 'A';

Serial.println(stringOne); // prints "Sensor value for input A"

 

// adding a constant integer to a String:

stringOne += 0;

Serial.println(stringOne); // prints "Sensor value for input A0"

 

// adding a constant string to a String:

stringOne += ": ";

Serial.println(stringOne); // prints "Sensor value for input"

 

// adding a variable integer to a String:

stringOne += analogRead(A0);

Serial.println(stringOne); // prints "Sensor value for input A0: 456" or whatever analogRead(A0) is

 

Serial.println("\n\nchanging the Strings' values");

stringOne = "A long integer: ";

stringTwo = "The millis(): ";

 

// adding a constant long integer to a String:

stringOne += 123456789;

Serial.println(stringOne); // prints "A long integer: 123456789"

 

// using concat() to add a long variable to a String:

stringTwo.concat(millis());

Serial.println(stringTwo); // prints "The millis(): 43534" or whatever the value of the millis() is

 

// do nothing while true:

while (true);

}

 

 

CANBIO DE MINUSCULAS (LOWER CASE) A MAYUSCULAS (UPPER CASE) .

La biblioteca para manejo de texto o string, posee instrucciones o funciones para pasar de minúsculas para mayúsculas. En el siguiente ejemplo, construimos un texto minúsculo: "" y con la función toUpperCase(); lo convertimos para mayúsculas, es decir para: "". Después el programa crea un string mayúsculo y lo pasamos para minúscula. El programa ejemplo puede ser encontrado en el menú: Archivo->Ejemplos->Strings->StringCaseChanges. El diagrama de flujo puede ser observado en la Figura 8.

 

Figura 8. Diagrama de Flujo  para Minúsculas y Mayúsculas
Figura 8. Diagrama de Flujo para Minúsculas y Mayúsculas

 

 

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 case changes:");

Serial.println();

}

 

void loop() {

// toUpperCase() changes all letters to upper case:

String stringOne = "";

Serial.println(stringOne);

stringOne.toUpperCase();

Serial.println(stringOne);

 

// toLowerCase() changes all letters to lower case:

String stringTwo = "";

Serial.println(stringTwo);

stringTwo.toLowerCase();

Serial.println(stringTwo);

 

 

// do nothing while true:

while (true);

}

 

 

CONSIGUIENDO (GET) Y COLOCANDO (SET) CARACTERES EN UN STRING.

Para conocer o conseguir un carácter de una determinada posición en una string, se puede usar la función string.charAt(n). Es parámetro 'n' que recibe la función, es la posición del carácter en la string. La función retorna el valor del carácter. Para colocar (set) el valor de un carácter en una string, usamos la función string.setCharAt(index, c). El parámetro index es la posición del carácter. El parámetro 'c' es el valor del carácter que se desea modificar. El siguiente programa usa estas funciones para conseguir y colocar el valor de caracteres en una string y puede ser encontrado en el menú: Archivo->Ejemplos->Strings->StringCharacters. El diagrama de flujo puede ser observado en la Figura 9.

 

Figura 9. Diagrama de Flujo  para Conseguir y Colocar Caracteres
Figura 9. Diagrama de Flujo para Conseguir y Colocar Caracteres

 

 

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

}

 

Serial.println("\n\nString charAt() and setCharAt():");

}

 

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

}

 

Serial.println("\n\nString charAt() and setCharAt():");

}

 

void loop() {

// make a String to report a sensor reading:

String reportString = "SensorReading: 456";

Serial.println(reportString);

 

// the reading's most significant digit is at position 15 in the reportString:

char mostSignificantDigit = reportString.charAt(15);

 

String message = "Most significant digit of the sensor reading is: ";

Serial.println(message + mostSignificantDigit);

 

// add blank space:

Serial.println();

 

// you can also set the character of a String. Change the : to a = character

reportString.setCharAt(13, '=');

Serial.println(reportString);

 

// do nothing while true:

while (true);

}

En la 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 2 en MIC032S.

 

 

19.139MBMemory Usage44.65msRequest 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" => 1741915263 "last" => 1741915263...
registry
array:3 [ "data" => [] "initialized" => false "separator" => "." ]
user
array:21 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (85.86KB) (208μs)
  • afterInitialise (1.14MB) (3.56ms)
  • afterRoute (179.16KB) (973μs)
  • beforeRenderComponent com_content (100.65KB) (424μs)
  • Before Access::preloadComponents (all components) (33.5KB) (182μs)
  • After Access::preloadComponents (all components) (107.06KB) (477μs)
  • Before Access::preloadPermissions (com_content) (1.57KB) (8μs)
  • After Access::preloadPermissions (com_content) (16.19MB) (21.46ms)
  • Before Access::getAssetRules (id:8 name:com_content) (480.16KB) (2.14ms)
  • After Access::getAssetRules (id:8 name:com_content) (7.36KB) (27μs)
  • afterRenderComponent com_content (504.91KB) (6.15ms)
  • afterDispatch (2.25KB) (69μs)
  • beforeRenderRawModule mod_articles_category (Banco de Circuitos) (423.33KB) (1.74ms)
  • afterRenderRawModule mod_articles_category (Banco de Circuitos) (15.43KB) (406μs)
  • beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (117μs)
  • afterRenderRawModule mod_finder (Busca_inteligente) (63.1KB) (1.4ms)
  • beforeRenderModule mod_articles_category (Banco de Circuitos) (9.98KB) (716μs)
  • afterRenderModule mod_articles_category (Banco de Circuitos) (5.39KB) (75μs)
  • beforeRenderModule mod_finder (Busca_inteligente) (6.39KB) (334μs)
  • afterRenderModule mod_finder (Busca_inteligente) (4.44KB) (61μs)
  • afterRender (336.8KB) (4.03ms)
  • 1 x After Access::preloadPermissions (com_content) (16.19MB) (48.06%)
    21.46ms
    1 x afterRenderComponent com_content (504.91KB) (13.78%)
    6.15ms
    1 x afterRender (336.8KB) (9.03%)
    4.03ms
    1 x afterInitialise (1.14MB) (7.97%)
    3.56ms
    1 x Before Access::getAssetRules (id:8 name:com_content) (480.16KB) (4.79%)
    2.14ms
    1 x beforeRenderRawModule mod_articles_category (Banco de Circuitos) (423.33KB) (3.89%)
    1.74ms
    1 x afterRenderRawModule mod_finder (Busca_inteligente) (63.1KB) (3.14%)
    1.40ms
    1 x afterRoute (179.16KB) (2.18%)
    973μs
    1 x beforeRenderModule mod_articles_category (Banco de Circuitos) (9.98KB) (1.6%)
    716μs
    1 x After Access::preloadComponents (all components) (107.06KB) (1.07%)
    477μs
    1 x beforeRenderComponent com_content (100.65KB) (0.95%)
    424μs
    1 x afterRenderRawModule mod_articles_category (Banco de Circuitos) (15.43KB) (0.91%)
    406μs
    1 x beforeRenderModule mod_finder (Busca_inteligente) (6.39KB) (0.75%)
    334μs
    1 x afterLoad (85.86KB) (0.47%)
    208μs
    1 x Before Access::preloadComponents (all components) (33.5KB) (0.41%)
    182μs
    1 x beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (0.26%)
    117μs
    1 x afterRenderModule mod_articles_category (Banco de Circuitos) (5.39KB) (0.17%)
    75μs
    1 x afterDispatch (2.25KB) (0.15%)
    69μs
    1 x afterRenderModule mod_finder (Busca_inteligente) (4.44KB) (0.14%)
    61μs
    1 x After Access::getAssetRules (id:8 name:com_content) (7.36KB) (0.06%)
    27μ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.45ms1.65MB
  • SELECT @@SESSION.sql_mode;32μs968B/libraries/src/Session/MetadataManager.php:184Copy
  • SELECT `session_id` FROM `incbmx_session` WHERE `session_id` = :session_id LIMIT 194μ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)198μs944BParams/libraries/src/Session/MetadataManager.php:260Copy
  • SELECT `id`,`rules` FROM `incbmx_viewlevels`54μ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` = :guest76μ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`245μ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)319μ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.61ms1.46MBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `incbmx_assets`348μs2.02KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • SELECT * FROM `incbmx_assets` WHERE `name` = 'com_content.article.2533'72μs912B/libraries/src/Table/Table.php:780Copy
  • SHOW FULL COLUMNS FROM `incbmx_content`291μs1.77KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • UPDATE `incbmx_content` SET `hits` = (`hits` + 1) WHERE `id` = '2533'129μ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)160μs62.13KBParams/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`193μ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)236μ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 ASC425μ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`215μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `name`,`element` FROM `incbmx_extensions` WHERE `type` = 'plugin' AND `folder` = 'finder' AND `enabled` = 1162μ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)94μs648B/administrator/components/com_finder/src/Indexer/Taxonomy.php:325Copy
  • SELECT * FROM `incbmx_schemaorg` WHERE `itemId` = :itemId AND `context` = :context68μ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)174μs62.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` = 182μs1.37KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:465Copy
  • warningassets - No asset found for com_content.article.2533, falling back to com_content
  • warningassets - No asset found for com_content.article.2533, falling back to com_content
  • warningassets - No asset found for com_content.article.2533, falling back to com_content
  • warningassets - No asset found for com_content.article.2533, falling back to com_content
  • warningassets - No asset found for com_content.article.2533, falling back to com_content
  • warningassets - No asset found for com_content.article.2533, falling back to com_content
  • warningassets - No asset found for com_content.article.2533, falling back to com_content
  • warningassets - No asset found for com_content.article.2533, falling back to com_content
  • warningassets - No asset found for com_content.article.2533, falling back to com_content
  • warningassets - No asset found for com_content.article.2533, falling back to com_content