## Ejecución de consultas

Las consultas pueden ser ejecutadas con las funciones mysqli::query(), mysqli::real_query() y mysqli::multi_query(). La función mysqli::query() es la más común, y combina la ejecución de la consulta con una recuperación de su juego de resultados en memoria tamponada, si lo hay, en una sola llamada. Llamar a la función mysqli::query() es idéntico a llamar a la función mysqli::real_query() seguida de una llamada a la función mysqli::store_result().

Ejemplo #1 Ejecución de consultas

    <?php

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new mysqli("example.com", "user", "password", "database");

    $mysqli->query("DROP TABLE IF EXISTS test");
    $mysqli->query("CREATE TABLE test(id INT)");

Juegos de resultados en memoria tamponada

Después de la ejecución de la consulta, los resultados pueden ser recuperados completamente de una vez o bien ser leídos línea por línea. La memoria tamponada del juego de resultados del lado-cliente permite al servidor liberar los recursos asociados con el resultado de la consulta tan pronto como sea posible. En general, los clientes son lentos para recorrer los juegos de resultados. Sin embargo, se recomienda utilizar la memoria tamponada de los juegos de resultados. La función mysqli::query() combina tanto la ejecución de la consulta como la memoria tamponada del juego de resultados.

Las aplicaciones PHP pueden navegar libremente en los resultados en memoria tamponada. La navegación es rápida ya que los juegos de resultados están almacenados en la memoria del cliente. Tenga en cuenta que a menudo es más sencillo realizar esta operación por el cliente que por el servidor.

Ejemplo #2 Navegación en resultados en memoria tamponada

    <?php

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new mysqli("example.com", "user", "password", "database");

    $mysqli->query("DROP TABLE IF EXISTS test");
    $mysqli->query("CREATE TABLE test(id INT)");
    $mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");

    $result = $mysqli->query("SELECT id FROM test ORDER BY id ASC");

    echo "Orden inverso...\n";
    for ($row_no = $result->num_rows - 1; $row_no >= 0; $row_no--) {
        $result->data_seek($row_no);
        $row = $result->fetch_assoc();
        echo " id = " . $row['id'] . "\n";
    }

    echo "Orden del juego de resultados...\n";
    foreach ($result as $row) {
        echo " id = " . $row['id'] . "\n";
    }

El ejemplo anterior mostrará:

    Orden inverso...
     id = 3
     id = 2
     id = 1
    Orden del juego de resultados...
     id = 1
     id = 2
     id = 3

Juegos de resultados no en memoria tamponada

Si la memoria del cliente es un recurso limitado, y la liberación de los recursos del servidor tan pronto como sea posible para mantener una carga del servidor baja no es necesaria, los resultados no en memoria tamponada pueden ser utilizados. La navegación a través de resultados no en memoria tamponada no es posible hasta que todas las líneas no hayan sido leídas.

Ejemplo #3 Navegación en resultados no en memoria tamponada

    <?php

    $mysqli->real_query("SELECT id FROM test ORDER BY id ASC");
    $result = $mysqli->use_result();

    echo "Orden del juego de resultados...\n";
    foreach ($result as $row) {
        echo " id = " . $row['id'] . "\n";
    }

Tipos de datos de los valores del juego de resultados

Las funciones mysqli::query(), mysqli::real_query() y mysqli::multi_query() se utilizan para ejecutar consultas no preparadas. A nivel del protocolo cliente-servidor MySQL, la orden `COM_QUERY` así como el protocolo texto son utilizados para la ejecución de la consulta. Con el protocolo texto, el servidor MySQL convierte todos los datos de un juego de resultados en cadenas de caracteres antes de enviarlos. La biblioteca cliente mysql recibe todos los valores de las columnas en forma de cadena de caracteres. Ninguna otra conversión del lado-cliente se realiza para recuperar el tipo nativo de las columnas. En su lugar, todas las valores son proporcionados en la forma de cadena de caracteres PHP.

Ejemplo #4 El protocolo texto devuelve cadenas de caracteres por omisión

    <?php

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new mysqli("example.com", "user", "password", "database");

    $mysqli->query("DROP TABLE IF EXISTS test");
    $mysqli->query("CREATE TABLE test(id INT, label CHAR(1))");
    $mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')");

    $result = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
    $row = $result->fetch_assoc();

    printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
    printf("label = %s (%s)\n", $row['label'], gettype($row['label']));

El ejemplo anterior mostrará:

    id = 1 (string)
    label = a (string)

Es posible convertir columnas de tipo enteros y números de punto flotante en números PHP definiendo la opción de conexión `MYSQLI_OPT_INT_AND_FLOAT_NATIVE`, si se utiliza la biblioteca mysqlnd. Si está definida, la biblioteca mysqlnd verificará las metadatos de los tipos de las columnas en el juego de resultados y convertirá las columnas SQL numéricas en números PHP, si el valor está dentro del intervalo permitido de PHP. De esta manera, por ejemplo, las columnas SQL INT son devueltas en la forma de entero.

Ejemplo #5 Tipos nativos de datos con mysqlnd y la opción de conexión

    <?php

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    $mysqli = new mysqli();
    $mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
    $mysqli->real_connect("example.com", "user", "password", "database");

    $mysqli->query("DROP TABLE IF EXISTS test");
    $mysqli->query("CREATE TABLE test(id INT, label CHAR(1))");
    $mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')");

    $result = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
    $row = $result->fetch_assoc();

    printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
    printf("label = %s (%s)\n", $row['label'], gettype($row['label']));

El ejemplo anterior mostrará:

    id = 1 (integer)
    label = a (string)

Ver también

- mysqli::__construct()
- mysqli::options()
- mysqli::real_connect()
- mysqli::query()
- mysqli::multi_query()
- mysqli::use_result()
- mysqli::store_result()

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open