Motivo del error
El error ocurre porque estás haciendo las cosas al revés. En tu código $stmt
es un recurso que apunta a los datos, pero no son los datos, por lo tanto no es correcto que intentes meter los elementos del array dentro de $stmt
haciendo esto:
array_push($stmt, "nuevo", "elemento"); #Mal hecho, $stmt no es un array
Es importante entender esto para no ir de bruces con PDO. Ten en cuenta que $stmt
se crea invocando al método prepare
, aquí:
$stmt = Conexion::conectar()->prepare("//Consulta");
Si lees el Manual de PHP verás que prepare
no devuelve un array, sino un objeto que apunta a los datos:
Si el servidor de la base de datos prepara con éxito la sentencia,
PDO::prepare()
devuelve un objeto PDOStatement. Si no es
posible, PDO::prepare()
devuelve FALSE o emite una excepción
PDOException (dependiendo del manejo de errores).
Solución
Tienes que leer $stmt
mediante un método fetch
, guardar esa lectura en un array y luego agregar el nuevo dato al array que obtuviste con fetch
.
Por ejemplo:
static public function mdlMostrarUsuarios(){
$stmt = Conexion::conectar()->prepare("//Consulta");
$stmt -> execute();
$mData=$stmt -> fetch();
#Aquí, a los datos recuperados agregamos una clave "nuevo" y un valor "elemento"
$mData["nuevo"]="elemento";
return $mData;
}
También puedes hacerlo al revés, creando primero el array y luego agregando dentro de él el resultado del fetch
.
$mData=array("nuevo"=>"elemento");
#Atento aquí a los [] antes del signo de =
$mData[]=$stmt -> fetch();
Otras consideraciones
Conviene que pongas de forma explícita el tipo de fetch
que necesitas para los datos, ya que, si no está configurado previamente de otro modo, fetch
devuelve por defecto un array asociativo y un array numérico, haciendo que tengas en tus resultados datos que quizá nunca utilizarás y que recargarían la memoria en caso de uso masivo en conexiones concurrentes o en bucles. Para hacer esto, sólo tienes que pasar el fetch style como parámetro a fetch
. Por ejemplo, para que te cree un array asociativo, que es lo que se suele usar más a menudo:
$mData=$stmt -> fetch(PDO::FETCH_ASSOC);
También, para apuntar lo que comenta @quevedo, puedes optar por otro método para obtener los datos que es fetchAll
, pero este método tiene algunas diferencias con fetch
que debes conocer. Podría ser útil cuando no esperas una cantidad excesiva de filas/columnas en los resultados, porque si son muchas filas, su uso podría desbordar la memoria porque este método mete de golpe todos los datos en una variable. Para profundizar más sobre la diferencia entre ambos métodos, puedes leer esta respuesta.
Hay también un método fetchColumn
, que es útil por ejemplo cuando necesitas una columna en específico, por ejemplo en consultas del tipo SELECT COUNT(*) FROM ...