compañer@s.
He creado un sitio web con vue y como back, con PHP. Comprobé que todo estuviera bien antes de subirlo al servidor y entonces lo hice. Cuando ya estaba en internet, me di cuenta que las consultas que traían varios registros, me devolvía falso, pero los que devuelven un único registro, funciona perfecto.
He durado días haciendo pruebas y he notado que el json_encode me devuelve false (comprobado con var_dump
), pero sin esta función, me devuelve todos los datos como deben ser (sin formato json, claro).
Nota: Utilizo MVC (la V es Vue), PDO y POO.
Esta es la conexión:
<?php
class conexion {
private $host = "localhost";
private $db_name = "bd_name";
private $user = "root";
private $pass = "pass";
private static $conexion = null;
private $conn;
private function __construct() {
try {
$this->conn = new PDO("mysql:host=$this->host;dbname=$this->db_name", $this->user, $this->pass);
} catch (PDOException $e) {
echo "Error: " . $e;
}
}
public static function obtenerInstancia() {
if(!self::$conexion) {
self::$conexion = new Conexion();
}
return self::$conexion;
}
public function getPrepareStatement($sql) {
return $this->conn->prepare($sql);
}
public function getFetch($PreparedStatement, $option) {
$PreparedStatement->setFetchMode(PDO::FETCH_ASSOC);
if ($PreparedStatement->execute()) {
return !$option ? $PreparedStatement->fetch() : $PreparedStatement->fetchAll();
}else {
return $PreparedStatement->errorInfo();
}
}
}
Así recibo el dato que envía vue (a través de axios) para inicializar la clase:
<?php
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
header('Content-type: application/json');
require_once '../controlador/controladorResultados.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$_POST = json_decode(file_get_contents("php://input"), true);
extract($_POST);
$controlador = new controladorResultados();
if (isset($_POST['consultarRedes']) && !empty($_POST['consultarRedes']) && $consultarRedes == true) {
print_r($controlador->consultarRedesConocimiento());
}
}
Esta es la clase:
<?php
header('Content-type: application/json');
require_once 'capsulas/proyectos.php';
require_once '../modelo/modeloResultados.php';
require_once 'controladorValidacion.php';
/**
* Clase que controla los datos de los resultados de investigación.
*/
class controladorResultados extends controladorValidacion {
private $modelo;
public function __construct() {
$this->modelo = new modeloResultados();
}
public function consultarRedesConocimiento() {
//Esto es lo que me devuelve falso. Sin el json_encode, en el servidor, me devuelve lo datos, pero no me sirve el formato de PHP.
return json_encode($this->modelo->consultarRedesConocimientoBD("redes_conocimiento"), JSON_UNESCAPED_UNICODE);
}
}
Y este es el modelo y cómo traigo la consulta:
<?php
require_once 'conexion.php';
/**
* Clase que conecta con la base de datos.
*/
class modeloResultados {
private $conexion;
public function __construct() {
$this->conexion = conexion::obtenerInstancia();
}
public function consultarRedesConocimientoBD($tabla) {
$sql = "SELECT * FROM $tabla";
try {
$PreparedStatement = $this->conexion->getPrepareStatement($sql);
return $this->conexion->getFetch($PreparedStatement, true);
} catch (PDOException $e) {
return "Error: " . $e;
}
}
}
Adjunto imagen de un console.log(response.data), cuando retorno un var_dump()
sin json_encode()
.
Esto es sólo un ejemplo, pero ninguna consulta que traiga más de 2 registros, me funciona, pero los que son de registro único, sí me los trae.
¿Cómo puedo resolver esto, o si alguien me puede decir que este es problema del servidor?