PHP Datenbank per JSON übermitteln

Ja genau ... nicht -.-

Deshalb ja ein eigener JSON-Encoder, da der die ganze Zeit max. eine Datenbankzeile im RAM haben muss.
Und max_execution_time, wenn die auf 30 Sekunden (default) ist, dann kannste da locker 1 Mio. Zeilen rauspumpen, da das Warten nicht zur Execution-time dazuzählt. BTW: Ein SQL-Request gibt fast immer ein Cursor, kein Array zurück. Daher sind wenig große Anfragen auch effizienter als viele kleine, weil das Konzept des Cursors schon für viel ausgelegt ist.
Aber schon klar, ein schnelles fetchAll() und schon kann man wunderbar kreuz und quer durch die Ergebnisse stromern.

Und alle Datensätze hab ich nie gesagt, sondern nur, wenn der Client schon weiß, welche er wirklich braucht, dass er diese dann gleich auf einmal holt.

Ach ja: Teile und herrsche ist mal an der Stelle definitiv falsch.
 
Bezüglich Clients habe ich persönlich nur Erfahrungen mit Android. Habe viel darüber gelesen und weiss dass z.b. eine Liste mit vielen Einträgen nur die sichtbaren Einträge rendert. Dies aus Gründen des Speicherverbrauchs. Beim durchscrollen durch die Einträge werden sie on-the-fly erstellt und abgebildet. Daher sollten die Listeneinträge immer identisch sein, damit im Hintergrund ein vor-instanzierter Container verwendet werden kann und die Einträge nur eingefüllt werden müssen.
(Ich spreche hierbei von der Standart-Implementation. Natürlich könnte man auch eigene ListViews mit anderem Verhalten definieren)

Das obige bedeuted aber, dass ich selbst bei einer Liste mit mehreren hundert Einträgen nicht vorzu laden kann. Quasi jeden Eintrag separat zu laden macht daher keinen Sinn und würde ein unerträgliches Ruckeln generieren. Abfragen von unter 20 Datensätzen empfinde ich somit als unnötig.

Dazu kommt dass ich auf den Stromverbrauch achten muss. Android besitzt mehrere Power-States für die Antennen. Full-Power, Low-Power, Standby. Den Google Vortrag der sich mit dem Thema grosse Downloads vs kleine Downloads beschäftig möchte ich hierbei nicht vorenthalten:
http://www.youtube.com/watch?v=PwC1OlJo5VM#t=17m17s
(Der Link würde auf 17m17s springen, aber ich glaube die Einbindung des Videos hier in CB kann das so nicht..)
Dauert einige Minuten, aber falls sich jemand dafür interessiert.


Zurück zur API:
Ich habe bis anhin die Facebook-Api im grösseren Stil verwendet. Da bin ich natürlich verwöhnt, weil diese zimlich umfangreich ist.
Grundsätzlich versuche ich sowenig Daten wie möglich zu übertragen, aber soviel wie nötig. Aufgrund des vorzu renderns von Android hole ich die Daten aus der SQLite-DB von Android mittels Cursor. Die Daten die dort drin sind wurden erstmalig nahezu komplett geholt. Danach lade ich nur noch die ID und das "geändert Datum/Zeit". Anhand dieser wähle ich die zu updatenden Objekte und frage nur noch diese an.

Was ich mir also von der Api wünsche ist sicher ein kompletter Datensatz laden zu können. Bis z.b. 250 Einträge. (variert, je nach Grösse der Einträge natürlich) und ein selektives Laden. schön wäre auch wenn ich eine Liste der zu ladenden Einträge (IDs) mitgeben könnte und das Api mir dann diese zur Verfügung stellt. Das wäre so mein Wunsch.. Zu realisieren mittels sql und whereis id = xx or whereis id =xx.. Denke ich mir zumindest..

aber irgendwie habe ich dennoch mühe mit der umsetzung von PHP nach JSON.. werde mir eure tipps/code dann später nochmals durchlesen..
 
Zuletzt bearbeitet:
Also das heißt, es gibt zwei Anfragen
/getall.php
/getchangedsince.php?last=2012-29-07_17:00

und für selektives Laden
POST /getselected.php
[1,2,3,45,342]

PHP:
$db=new PDO(...);
$db->execute("create temporary table temp(id int primary key)");
$prep=$db->prepare("insert ignore into temp values(?)");
foreach(json_decode(file_get_contents("php://input")) as $t){
$prep->bindParam(1,$t);
$prep->execute();
}
echo json_encode($db->query("select * from ... where id in (select id from temp)")->fetchAll(PDO::FETCH_ASSOC));

Aber 250 Datensätze sind pillepalle, da kannste ruhig die Version nehmen mit echo json_encode($daten);
 
Zurück
Oben