Blog de programación, errores, soluciones

Chose Language:
Author: Admin/Publisher |finished | checked

PHP clase PDOStatement

La clase de PHP PDOStatement representa un prepared statement( sentencia preparada), luego de que la sentencia sea ejecutada con execute esta representara un set de resutados(result set).

Las formas de conseguir un objeto PDOStatement es utilizar uno de los siguientes métodos de la clase PDO: query o prepare.

Sinopsis / Synopsis
 class PDOStatement implements IteratorAggregate {
/* Properties */
public string $queryString;
/* Methods */
public bindColumn(
    string|int $column,
    mixed &$var,
    int $type = PDO::PARAM_STR,
    int $maxLength = 0,
    mixed $driverOptions = null
): bool
public bindParam(
    string|int $param,
    mixed &$var,
    int $type = PDO::PARAM_STR,
    int $maxLength = 0,
    mixed $driverOptions = null
): bool
public bindValue(string|int $param, mixed $value, int $type = PDO::PARAM_STR): bool
public closeCursor(): bool
public columnCount(): int
public debugDumpParams(): ?bool
public errorCode(): ?string
public errorInfo(): array
public execute(?array $params = null): bool
public fetch(int $mode = PDO::FETCH_DEFAULT, int $cursorOrientation = PDO::FETCH_ORI_NEXT, int $cursorOffset = 0): mixed
public fetchAll(int $mode = PDO::FETCH_DEFAULT): array
public fetchAll(int $mode = PDO::FETCH_COLUMN, int $column): array
public fetchAll(int $mode = PDO::FETCH_CLASS, string $class, ?array $constructorArgs): array
public fetchAll(int $mode = PDO::FETCH_FUNC, callable $callback): array
public fetchColumn(int $column = 0): mixed
public fetchObject(?string $class = "stdClass", array $constructorArgs = []): object|false
public getAttribute(int $name): mixed
public getColumnMeta(int $column): array|false
public getIterator(): Iterator
public nextRowset(): bool
public rowCount(): int
public setAttribute(int $attribute, mixed $value): bool
public setFetchMode(int $mode): bool
public setFetchMode(int $mode = PDO::FETCH_COLUMN, int $colno): bool
public setFetchMode(int $mode = PDO::FETCH_CLASS, string $class, ?array $constructorArgs = null): bool
public setFetchMode(int $mode = PDO::FETCH_INTO, object $object): bool
}

Propiedades

https://blastcoding.com/php-clase-pdostatement/#propiedades

$queryString – es el string que será utilizado

Métodos

https://blastcoding.com/php-clase-pdostatement/#metodos

La clase PDOStatement nos ofrece métodos los cuales podemos ejecutar para manipular sentencias preparadas (prepared statements), estas son una forma eficiente de ejecutar consultas SQL que se repiten con frecuencia.

muchos métodos que tenemos son para hacer binds así que me parece necesario explicar a lo que se le llama bind o bindeo o como le quiera decir.

En programación, un bind es una operación que asocia un valor a un símbolo. El símbolo puede ser una variable, una constante o una expresión.

En nuestro caso estaremos asociando valores a variables y valores de la base de datos a variables, también con los parámetros de las consultas.

bindColumn

https://blastcoding.com/php-clase-pdostatement/#bindColumn

Realiza un bind (asocia o vincula) una columna del set de resultados obtenidos con una variable

Description / Descripción
 public PDOStatement::bindColumn(
    string|int $column,
    mixed &$var,
    int $type = PDO::PARAM_STR,
    int $maxLength = 0,
    mixed $driverOptions = null
): bool

Parámetros

$column – debe ser el número(empieza en 1) o el nombre de la columna

$var – Nombre de la variable con el que la columna será asociada, por ejemplo $nombre

$type – el tipo de dato del parámetro estos son especificados por las clases:

  • PDO::PARAM_INT – Representa un parámetro de tipo entero.
  • PDO::PARAM_STR – Representa un parámetro de tipo cadena de caracteres.
  • PDO::PARAM_BOOL – Representa un parámetro de tipo booleano.
  • PDO::PARAM_NULL – Representa un parámetro de tipo nulo.
  • PDO::PARAM_LOB – Representa un parámetro de tipo Binary Large Object (BLOB).
No evites definir este parámetro bajo ningún concepto

$maxLength – longitud máxima esperada de los datos en la columna.

$driverOptions – parámetros opcionales para el driver

Retornos

true – en caso de exito

false – en caso de que falle

bindParam

https://blastcoding.com/php-clase-pdostatement/#bindParam

vincula un parámetro a una variable específica, cuando estamos hablando de un parámetro, estamos hablando de un parámetro de una consulta SQL

Description / Descripción
public PDOStatement::bindParam(
    string|int $param,
    mixed &$var,
    int $type = PDO::PARAM_STR,
    int $maxLength = 0,
    mixed $driverOptions = null
): bool

Parámetros

$param – identificador de parámetro, por ejemplo, si tu consulta SQL es algo como sigue:

$consulta = $conexion->prepare("SELECT nombre, apellido, edad FROM usuarios WHERE nombre = :name");

El valor de tu $param será ":name".

En cambio, si estás utilizando los símbolos de interrogacion ? para la consulta tu $param debera utilizar la posicion del parametro estas empiezan por 1. Ejemplo:

$consulta = $conexion->prepare("SELECT nombre, apellido, edad FROM usuarios WHERE nombre = ?");

El valor que le deberemos dar a $param en este caso será 1, ya que solo tenemos 1 parámetro este está en la primera posición.

$var – el nombre de la varaible PHP que será vinculada al parametro de la sentencia SQL

$type – el tipo de dato para el parametro, estos pueden ser:

  • PDO::PARAM_NULL: Representa un parámetro de tipo nulo.
  • PDO::PARAM_INT: Representa un parámetro de tipo entero.
  • PDO::PARAM_STR: Representa un parámetro de tipo cadena de caracteres.
  • PDO::PARAM_BOOL: Representa un parámetro de tipo booleano.
  • PDO::PARAM_LOB: Representa un parámetro de tipo Binary Large Object (BLOB).
  • PDO::PARAM_STMT: Representa un parámetro de tipo declaración.(no está soportado por ningún driver – ha sido creado para futuras aplicaciones)
  • PDO::PARAM_INPUT_OUTPUT: Representa un parámetro de entrada y salida para procedimientos almacenados

$maxLength – longitud máxima esperada de los datos en la columna.(cantidad de bytes)

$driverOptions -parámetros opcionales para el driver

Retornos

true en caso de éxito

false sí falla

bindValue

https://blastcoding.com/php-clase-pdostatement/#bindValue

Asocia un valor a un parámetro

Description / Descripción
public PDOStatement::bindValue(string|int $param, mixed $value, int $type = PDO::PARAM_STR): bool

Parámetros

$param -el identificador del parámetro puede ser un número empezando desde 1 o el nombre que se le ha dado al parámetro en la sentencia SQL,

$value – el valor que será asociado al parámetro.

$type – el tipo de dato que será el parámetro puede ser una de las siguientes constantes:

  • PDO::PARAM_NULL – Representa un parámetro de tipo nulo.
  • PDO::PARAM_INT – Representa un parámetro de tipo entero.
  • PDO::PARAM_STR – Representa un parámetro de tipo cadena de caracteres.
  • PDO::PARAM_BOOL – Representa un parámetro de tipo booleano.
  • PDO::PARAM_LOB – Representa un parámetro de tipo Binary Large Object (BLOB).
  • PDO::PARAM_STMT: Representa un parámetro de tipo declaración.(no está soportado por ningún driver – ha sido creado para futuras aplicaciones)
  • PDO::PARAM_INPUT_OUTPUT: Representa un parámetro de entrada y salida para procedimientos almacenados

Retornos

true en caso de éxito

false si falla

Las funciones bindValue() y bindParam() de PHP se utilizan para vincular parámetros a variables en una consulta SQL. La principal diferencia entre ellas es que bindParam() toma una referencia a una variable como argumento, mientras que bindValue() puede tomar una variable o un valor literal como argumento.

closeCursor

https://blastcoding.com/php-clase-pdostatement/#closeCursor

Cierra el cursor, permitiendo que se ejecute nuevamente una declaración.

Este método existe debido a que algunos drivers no soportan ejecutar un PDOStatement object cuando un objeto PDOStatement previo no termino de obtener las filas en el resultset. En caso de que este sea el caso, tendrás un error out-of-sequence y deberas utilizar closeCursor.

En los casos de los drivers de MySQL, PostgreSQL, SQLite, es probable que no necesites relizar un closeCursor

Description / Descripción
public PDOStatement::closeCursor(): bool

Retornos

true en caso de éxito

false sí falla

columnCount

https://blastcoding.com/php-clase-pdostatement/#columnCount

Retorna el número de columnas del resultado obtenido luego de la ejecución de una consulta(result set)

Description / Descripción
public PDOStatement::columnCount(): int
Sintaxis / Sintax
$sentencia->columnCount();

debugDumpParams

https://blastcoding.com/php-clase-pdostatement/#debugDumpParams

Vuelca un comando preparado de SQL. Tal como su nombre indica, sirve para hacer debug sobre una consulta para identificar algún problema

Description / Descripción
public PDOStatement::debugDumpParams(): void

errorCode

https://blastcoding.com/php-clase-pdostatement/#errorCode

Obtiene el SQLSTATE asociado con la última operación en el gestor de sentencia

Description / Descripción
public PDOStatement::errorCode(): string

errorInfo

https://blastcoding.com/php-clase-pdostatement/#errorInfo

Obtiene información del error asociado con la última operación del gestor de sentencia en forma de array

Description / Descripción
public PDOStatement::errorInfo(): array

los elementos del array contendrán la siguiente información:

0Código de error de SQLSTATE (un identificador alfanumérico de cinco caracteres definido en el estándar ANSI SQL).
1Código de error específico del controlador.
2Mensaje de error específico del controlador.

execute

https://blastcoding.com/php-clase-pdostatement/#execute

Ejecuta una sentencia preparada realizada con PDO::prepare(), el método execute puede recibir como parámetros los valores para los placeholders en forma de array el cual puede ser asociativo o numérico dependiendo del placeholder utilizado :name o ? respectivamente.

Description / Descripción
public PDOStatement::execute(array $input_parameters = ?): bool
Sintaxis / Sintax
$sentencia->execute();
$sentencia->execute($parameters);

Parámetros

$inputs_parameters – por defecto $inputs_parameter es opcional, en caso de pasarle valores se debe utilizar un array asociativo o numerico dependiendo de como estén marcados los placeholder

//caso en que los placeholders esten marcados por ?
$inputs_parameter=array("juan","bolivia");

En caso de que estemos utilizando placeholder con nombres:

//caso en que los placeholders esten marcados por ?
$inputs_parameter=array(":name"=>"juan",":pais"=>"bolivia");
Mi recomendación es que utilices bindParam o bindValue en vez de poner los parámetros de esta manera

Retornos

true en caso de éxito

false sí falla

fetch

https://blastcoding.com/php-clase-pdostatement/#fetch

obtiene la próxima fila que se encuentra en el resultado (resultset)

Description / Descripción
public PDOStatement::fetch(int $mode = ?, int $cursorOrientation = PDO::FETCH_ORI_NEXT, int $cursorOffset = 0): mixed

Parámetros

$mode – Controla como será devuelta la próxima fila. El valor de $mode debe ser una de las siguientes constantes:

El valor por defecto de $mode es PDO::FETCH_BOTH
  • PDO::FETCH_ASSOC
  • PDO::FETCH_BOTH
  • PDO::FETCH_BOUND
  • PDO::FETCH_CLASS
  • PDO::FETCH_INTO
  • PDO::FETCH_LAZY
  • PDO::FETCH_NAMED
  • PDO::FETCH_NUM
  • PDO::FETCH_OBJ
  • PDO::FETCH_PROPS_LATE

Puedes ver más sobre lo que hacen estas constantes en https://www.php.net/manual/en/pdo.constants.php. Las constantes más utilizadas son: PDO::FETCH_ASSOC, PDO::FETCH_NUM, PDO::FETCH_OBJ.

$cursorOrientation – el valor de este parámetro determinará que fila será devuelta, su valor debe ser una de las siguientes constantes:

PDO::FETCH_ORI_NEXT – Este es el valor predeterminado. Indica que el cursor se moverá a la siguiente fila.

PDO::FETCH_ORI_PRIOR – Indica que el cursor se moverá a la fila anterior.

PDO::FETCH_ORI_FIRST – Indica que el cursor se moverá a la primera fila.

PDO::FETCH_ORI_LAST – Indica que el cursor se moverá a la última fila.

PDO::FETCH_ORI_ABS – Indica que el cursor se moverá a una fila específica. Necesitarás proporcionar un número de fila válido.

PDO::FETCH_ORI_REL – Indica que el cursor se moverá a una fila relativa a su posición actual. Necesitarás proporcionar un número de filas relativas válido.

$cursorOffset – Su valor por defecto es 0, este valor especifica el número de la fila que se desea obtener y se utiliza en conjunto con el parámetro $cursorOrientation si este tiene como valor a PDO::FETCH_ORI_ABS o PDO::FETCH_ORI_REL

$cursorOrientation = PDO::FETCH_ORI_ABS

Si $cursorOrientation tiene como valor PDO::FETCH_ORI_ABS, este valor especifica el número absoluto de la fila del conjunto de resultados que se desea obtener.

$cursorOrientation = PDO::FETCH_ORI_REL

En cambio, si $cursorOrientation tiene como valor PDO::FETCH_ORI_REL, este valor especifica la fila a obtener relativa a la posición del cursor antes de que se llame a PDOStatement::fetch().

Retornos

mixed – dependerá de $mode lo que retornara

false – en caso de error o si no existen más filas por devolver.

fetchAll

https://blastcoding.com/php-clase-pdostatement/#fetchAll

Obtiene todas las filas que aún queden en el result set.

Description / Descripción
public PDOStatement::fetchAll(int $mode = PDO::FETCH_DEFAULT): array
public PDOStatement::fetchAll(int $mode = PDO::FETCH_COLUMN, int $column): array
public PDOStatement::fetchAll(int $mode = PDO::FETCH_CLASS, string $class, ?array $constructorArgs): array
public PDOStatement::fetchAll(int $mode = PDO::FETCH_FUNC, callable $callback): array

Parámetros

$mode – controla el contenido de el array retornado como en el metodo fetch, su valor por defecto es PDO::FETCH_BOTH

PDO::FETCH_COLUMN retornará un array constituido por todos los valores de una sola columna, deberás especificar que columna con el parámetro $column.

Puedes obtener los resultados únicos de una columna combinando con PDO::FETCH_UNIQUE esto lo puedes hacer utilizando |

$resultados = $stmt->fetchAll(PDO::FETCH_COLUMN | PDO::FETCH_UNIQUE)

Para devolver un array asociativo agrupado por los valores de una columna específica, puedes combinar PDO::FETCH_COLUMN y PDO::FETCH_GROUP con |. Los siguientes son parámetros dinámicos que dependen del modo de obtención. No pueden ser utilizados con parámetros nombrados.

$resultados = $stmt->fetchAll(PDO::FETCH_COLUMN | PDO::FETCH_GROUP);
$mode = PDO::FETCH_COLUMN

$column – este parámetro es utilizado cuando $mode tiene como valor PDO::FETCH_COLUMN, con $column indicaras que columna deseas obtener siendo 0 la primera columna.

$mode = PDO::FETCH_CLASS

$class – Este parámetro se deberá de usar en caso de que en $mode se esté utilizando el valor PDO::FETCH_CLASS será el nombre de la clase en la que se mappearan las columnas de la fila a propiedades con nombre en la clase.

$constructorArgs – Arguments of custom class constructor when the $mode parameter is PDO::FETCH_CLASS.

$mode = PDO::FETCH_FUNC

$callback – debes de utilizar este parámetro en caso de que este utilizando como valor en $mode PDO::FETCH_FUNC el valor de $callback será una función propia proporcionada por el usuario donde se usaran los valores de columnas como parámetros.

Retornos

array – retorna un array dependiendo del modo utilizando en $mode

fetchColumn

https://blastcoding.com/php-clase-pdostatement/#fetchColumn

Retorna una sola columna de la siguiente fila en el set de resultados (resultset)

Description / Descripción
public PDOStatement::fetchColumn(int $column_number = 0): mixed

Parametro

$column_number – el numero de la columna que se quiere obtener la primera columna es 0 y tambien el valor por defecto si no se especifica tambien es 0.

Retorno

mixed – el retorno dependera del tipo de datos que sea la columna

false – si no existen más filas

fetchObject

https://blastcoding.com/php-clase-pdostatement/#fetchObject

obtiene la siguiente fila dando como retorno un objeto que la representara.

Description / Descripción
 public PDOStatement::fetchObject(?string $class = "stdClass", array $constructorArgs = []): object|false

Parametros

$class – nombre de la clase que se utilizara so no se especifica utilizara stdClass

$constructorArgs – un array que posee los parametros que se le pasaran al constructor de la clase especificada en $class

Retornos

object – retorna una instancia de la clase especificada con $class

false – en caso de que falle.

getAttribute

https://blastcoding.com/php-clase-pdostatement/#getAttribute

Obtine un atributo de una sentencia, actualmente no existen atributos genericos pero si tenemos los atributos del driver constantes PDO::ATTR_*.

Description / Descripción
public PDOStatement::getAttribute(int $name): mixed

getColumnMeta

https://blastcoding.com/php-clase-pdostatement/#getColumnMeta

obtiene la metadata de una columna de un resultset

Description / Descripción
public PDOStatement::getColumnMeta(int $column): array|false

Parametro

$column – es el numero de la columna, empezando por 0

Retorno

array con los metadatos los cuales son los siguientes:

  • name – El nombre de la columna en la base de datos.
  • table – El nombre de la tabla a la que pertenece la columna.
  • native_type – El tipo de datos nativo de la columna.
  • driver:decl_type – El tipo de datos SQL de la columna.
  • flags – Las marcas establecidas para la columna.
  • len – La longitud de la columna.
  • precision – La precisión numérica de la columna.
  • pdo_type – El tipo de datos de la columna según las constantes PDO::PARAM_*.

false – en caso de que la columna requerida no exista o no existan resultados

getIterator

https://blastcoding.com/php-clase-pdostatement/#getIterator

obtiene un objeto Iterator que permite hacer iteraciones sobre el resultset

Description / Descripción
public PDOStatement::getIterator(): Iterator

En teoria puedes hacer algo como esto con getIterator. No he probado este metodo pero talvez lo hagamos en el futuro

// Conectarse a la base de datos
$pdo = new PDO("mysql:host=localhost;dbname=mi_base_de_datos", "usuario", "contraseña");

// Preparar la consulta
$sql = "SELECT * FROM usuarios";
$stmt = $pdo->prepare($sql);

// Ejecutar la consulta
$stmt->execute();

// Obtener el objeto Iterator
$iterator = $stmt->getIterator();

// Iterar sobre el conjunto de resultados
while ($iterator->valid()) {
    // Obtener el elemento actual
    $row = $iterator->current();

    // Imprimir el elemento actual
    echo $row["id"] . " - " . $row["name"] . PHP_EOL;

    // Avanzar al siguiente elemento
    $iterator->next();
}

nextRowset

https://blastcoding.com/php-clase-pdostatement/#nextRowset

Avanza a la proxima fila en un resultado obtenido al correr una sentencia que da como resultado multiples filas(fetchall por ejemplo)

Description / Descripción
public PDOStatement::nextRowset(): bool

rowCount

https://blastcoding.com/php-clase-pdostatement/#rowCount

Retorna el numero de filas afetadas por la ultima sentencia SQL

Description / Descripción
public PDOStatement::rowCount(): int

setAttribute

https://blastcoding.com/php-clase-pdostatement/#setAttribute

Establece un atributo de sentencia, Este atributo puede ser cualquier constante PDO::ATTR_*

Description / Descripción
public PDOStatement::setAttribute(int $attribute, mixed $value): bool

setFetchMode

https://blastcoding.com/php-clase-pdostatement/#setFetchMode

Configura el modo de fetch(obtención) para la sentencia actual. Por lo general esto lo hacemos directamente cuando llamamos fetch, pero tenga en cuenta que también lo podemos hacer de esta manera. Este método tiene relevancia al hacer múltiples consultas.

Description / Descripción
public PDOStatement::setFetchMode(int $mode): bool
public PDOStatement::setFetchMode(int $mode = PDO::FETCH_COLUMN, int $colno): bool
public PDOStatement::setFetchMode(int $mode = PDO::FETCH_CLASS, string $class, ?array $constructorArgs = null): bool
public PDOStatement::setFetchMode(int $mode = PDO::FETCH_INTO, object $object): bool

Parámetros

$mode debe ser una de las siguientes constantes:

  • PDO::FETCH_ASSOC
  • PDO::FETCH_BOTH
  • PDO::FETCH_BOUND
  • PDO::FETCH_CLASS
  • PDO::FETCH_COLUMN
  • PDO::FETCH_INTO
  • PDO::FETCH_LAZY
  • PDO::FETCH_NAMED
  • PDO::FETCH_NUM
  • PDO::FETCH_OBJ
  • PDO::FETCH_PROPS_LATE
$mode = PDO::FETCH_COLUMN

$colno este parámetro se utiliza cuando $mode = PDO::FETCH_COLUMN para especiicar la columna que se desea obtener.

$mode = PDO::FETCH_CLASS

$class – En caso de que utilizes $mode = PDO::FETCH_CLASS con este parametro diremos la clase que utilizaremos por ejemplo Usuario o Usuario::class no una clase inicializada $usuario.

$constructorArgs – Es probable que necesites inicializar algunos parametros de la clase especificada en $class, en este parametros deberemos pasar un array con esos parametros.

En caso de no especificar una clase se utilizara la clase stdClass

$mode = PDO::FETCH_INTO

$object este es el objeto donde se mapeara.

Retornos

true en caso de exito

false si falla

Category: php
Something wrong? If you found an error or mistake in the content you can contact me on Twitter | @luisg2249_luis.
Last 4 post in same category