2017-09-25 11 views
0

J'essaie d'aller chercher des données dans ma base de données MySQL en utilisant PDO::FETCH_OBJ et json_encode mais cela ne fonctionne pas car j'ai ajouté un champ DATE dans la table MySQL.PHP fetchAll PDO :: FETCH_OBJ et json_encode renvoie invalide JSON

C'est ce que mon code ressemble à:

$app->get('/api/teams', function(Request $request, Response $response) { 
$sql = "SELECT * FROM teams"; 

try { 
    $db = new db(); 

    $db = $db->connect(); 

    $stmt = $db->query($sql); 
    $teams= $stmt->fetchAll(PDO::FETCH_OBJ); 
    $db = null; 
    echo json_encode($teams); 

    } catch(PDOException $e) { 
     echo '{"error": {"text": '.$e->getMessage().'}'; 
    } 
}); 

Avant ajouté le DATE -field, cela a fonctionné parfaitement bien et il rentrait un tableau avec un tas d'objets. Maintenant, il ne renvoie aucune donnée du tout. Même si, par exemple, j'appelle /api/teams/25 - je reçois les données correctes, même avec les données de date. Donc, cela "seulement" échoue quand je veux recevoir toutes les équipes/données à la fois. Est-ce que quelqu'un peut me dire ce qui ne va pas et comment le réparer?

Je peux aussi dire que j'ai essayé de le faire:

foreach($teams as $team){ 
    echo json_encode($team); 
} 

Mais ce retour des données JSON invalides, ce qui était un tas d'objets sans séparation par des virgules

EDIT

Mon DB SCHEMA ressemble à ceci,

id (int(11), primary_key, auto_increment) 
team (varchar(255)) 
country (varchar(255)) 
league (varchar(255)) 
creation_day (date) 

** EDIT 2 **

Le JSON invalide qui les foreach retours -example, ressemble à ceci:

{"id":"27", "Bayern München", "country":"Germany", "league": "Bundesliga, "creation_day": "2016-10-14"} {"id":"28", "Borussia Dortmund", "country":"Germany", "league": "Bundesliga, "creation_day": "2016-10-14"} 

..et ainsi de suite

+0

pouvez-vous publier votre schéma? –

+0

@JeffPuckett quel schéma? – Steve

+0

schéma de base de données –

Répondre

0

Le problème est que vous n'êtes pas un émettait Document JSON, mais plusieurs qui sont juste brisés ensemble. Ce n'est pas valide. Il suffit de faire ceci:

echo json_encode($teams); 
+0

ehhh ... mais c'est ce que je fais? – Steve

+0

Vous le faites dans une boucle, vous produisez des documents N JSON, pas un document JSON valide. Généralement, lorsque vous produisez des résultats JSON, vous avez droit à un appel et un seul appel à 'json_encode', donc si vous avez besoin de restructurer vos données pour les faire fonctionner dans JSON, vous le faites avant de passer l'appel. Dans votre cas, vous semblez avoir un tableau, donc c'est bien de le transmettre directement, pas besoin d'itérer. – tadman

+0

dans le post, j'ai écrit "j'ai aussi essayé" ...'echo json_encode ($ teams) 'ne renvoie rien - depuis que j'ai ajouté le champ 'Date' dans la table MySQL – Steve

0

PDO :: FETCH_OBJ: retourne un objet anonyme avec les noms de propriétés qui correspondent aux noms de colonnes dans votre jeu de résultats

http://php.net/manual/en/pdostatement.fetch.php

Je soupçonnez que votre l'utilisation de PDO::FETCH_OBJ est la source de votre problème. Je vous suggère de changer cela à PDO::FETCH_ASSOC si vous cherchez simplement à afficher le résultat entier en JSON.

Ainsi, votre exemple de code ressemblerait à ceci:

$app->get('/api/teams', function(Request $request, Response $response) { 
$sql = "SELECT * FROM teams"; 

try { 
    $db = new db(); 

    $db = $db->connect(); 

    $stmt = $db->query($sql); 
    $teams= $stmt->fetchAll(PDO::FETCH_ASSOC); // <-- This changes 
    $db = null; 
    echo json_encode($teams); 

    } catch(PDOException $e) { 
     echo '{"error": {"text": '.$e->getMessage().'}'; 
    } 
}); 

La raison pour laquelle je crois que c'est votre problème est parce que JSON nécessite un certain format, donc si vous ne recevez pas une sortie de votre echo alors les chances sont votre JSON était invalide.Si vous voulez tester, vous pouvez vérifier ce que vous recevez de retour json_encode:

json_encode

Renvoie une chaîne encodée JSON en cas de succès ou si une erreur survient.

http://php.net/json_encode