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 / Synopsisclass 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/#metodosLa 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.
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/#bindColumnRealiza un bind (asocia o vincula) una columna del set de resultados obtenidos con una variable
Description / Descripciónpublic 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).
$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/#bindParamvincula 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ónpublic 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/#bindValueAsocia un valor a un parámetro
Description / Descripciónpublic 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
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/#closeCursorCierra 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ónpublic PDOStatement::closeCursor(): bool
Retornos
true
en caso de éxito
false
sí falla
columnCount
https://blastcoding.com/php-clase-pdostatement/#columnCountRetorna el número de columnas del resultado obtenido luego de la ejecución de una consulta(result set)
Description / Descripciónpublic PDOStatement::columnCount(): intSintaxis / Sintax
$sentencia->columnCount();
debugDumpParams
https://blastcoding.com/php-clase-pdostatement/#debugDumpParamsVuelca un comando preparado de SQL. Tal como su nombre indica, sirve para hacer debug sobre una consulta para identificar algún problema
Description / Descripciónpublic PDOStatement::debugDumpParams(): void
errorCode
https://blastcoding.com/php-clase-pdostatement/#errorCodeObtiene el SQLSTATE asociado con la última operación en el gestor de sentencia
Description / Descripciónpublic PDOStatement::errorCode(): string
errorInfo
https://blastcoding.com/php-clase-pdostatement/#errorInfoObtiene información del error asociado con la última operación del gestor de sentencia en forma de array
Description / Descripciónpublic PDOStatement::errorInfo(): array
los elementos del array contendrán la siguiente información:
0 | Código de error de SQLSTATE (un identificador alfanumérico de cinco caracteres definido en el estándar ANSI SQL). |
1 | Código de error específico del controlador. |
2 | Mensaje de error específico del controlador. |
execute
https://blastcoding.com/php-clase-pdostatement/#executeEjecuta 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.
public PDOStatement::execute(array $input_parameters = ?): boolSintaxis / 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");
Retornos
true
en caso de éxito
false
sí falla
fetch
https://blastcoding.com/php-clase-pdostatement/#fetchobtiene la próxima fila que se encuentra en el resultado (resultset)
Description / Descripciónpublic 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:
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
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.
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/#fetchAllObtiene todas las filas que aún queden en el result set.
Description / Descripciónpublic 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);
$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.
$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
.
$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/#fetchColumnRetorna una sola columna de la siguiente fila en el set de resultados (resultset)
Description / Descripciónpublic 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/#fetchObjectobtiene la siguiente fila dando como retorno un objeto que la representara.
Description / Descripciónpublic 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/#getAttributeObtine un atributo de una sentencia, actualmente no existen atributos genericos pero si tenemos los atributos del driver constantes PDO::ATTR_*
.
public PDOStatement::getAttribute(int $name): mixed
getColumnMeta
https://blastcoding.com/php-clase-pdostatement/#getColumnMetaobtiene la metadata de una columna de un resultset
Description / Descripciónpublic 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/#getIteratorobtiene un objeto Iterator que permite hacer iteraciones sobre el resultset
Description / Descripciónpublic 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/#nextRowsetAvanza a la proxima fila en un resultado obtenido al correr una sentencia que da como resultado multiples filas(fetchall por ejemplo)
Description / Descripciónpublic PDOStatement::nextRowset(): bool
rowCount
https://blastcoding.com/php-clase-pdostatement/#rowCountRetorna el numero de filas afetadas por la ultima sentencia SQL
Description / Descripciónpublic PDOStatement::rowCount(): int
setAttribute
https://blastcoding.com/php-clase-pdostatement/#setAttributeEstablece un atributo de sentencia, Este atributo puede ser cualquier constante PDO::ATTR_*
public PDOStatement::setAttribute(int $attribute, mixed $value): bool
setFetchMode
https://blastcoding.com/php-clase-pdostatement/#setFetchModeConfigura 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ónpublic 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
$colno
este parámetro se utiliza cuando $mode = PDO::FETCH_COLUMN
para especiicar la columna que se desea obtener.
$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