2010-10-11 5 views
2

J'ai le code PHP suivant:PHP SQLite JSON données Duplication

$testMessage = "TESTMESSAGE"; 

$db = new SQLite3('messages.sq3'); 
$db->exec('CREATE TABLE messages(id INTEGER PRIMARY KEY, message CHAR(255));'); 
$db->exec("INSERT INTO messages (message) VALUES ('$testMessage');"); 

$results = $db->query('SELECT * FROM messages ORDER BY id DESC LIMIT 5'); 

while ($row = $results->fetchArray()) { 
    print_r($row); 
} 

Le print_r résultant:

Array ([0] => 1 [id] => 1 [1] => TESTMESSAGE [message] => TESTMESSAGE) 

Pourquoi ces données dupliquées? Est-ce juste la façon dont le tableau est présenté ou y a-t-il vraiment deux copies de la chaîne TESTMESSAGE? En inspectant le fichier sqlite, j'en vois seulement un réellement stocké là. J'essaye de sérialiser la sortie par l'intermédiaire de JSON et cette duplication mène à la sérialisation.

Répondre

1

La valeur par défaut est d'avoir les données avec les clés numériques et de chaîne, fusionnées dans le même tableau.

Vous devez utiliser $results->fetchArray(SQLITE3_NUM) ou $results->fetchArray(SQLITE3_ASSOC) pour obtenir respectivement les clés numériques et les clés de chaîne. La valeur par défaut est SQLITE3_BOTH, que j'ai toujours détesté.

1

$ row [1] et $ row ['message'] vous donneront les mêmes données. C'est parce que sur la technique utilise l'index numérique de la colonne et l'autre utilise le nom. Ils sont tous deux inclus dans la colonne afin que vous puissiez utiliser l'une ou l'autre manière pour y accéder. Il n'indique aucune sorte de duplication dans la base de données elle-même.

Ici vous pouvez voir la documentation et comment dire à PHP quelle version vous voulez. Par défaut, il vous donne les deux: http://php.net/manual/en/sqlite3result.fetcharray.php