[gelöst] Browsergame - direktes 1 vs. 1
-
Hallo,
AJAX Request's beinhalten erstmal nur Text/XML-Daten. Die Sorgen garantiert nicht für Performance-Probleme (wenn doch hat der Entwickler etwas falsch gemacht). Den Anschließenden "Refresh" kannst du dir theoretisch sparen wenn der Rest des Spiels auf HTML / JS basiert.
Schema:
--> Javascript sendet AJAX Request an Server
--> PHP empfängt Request und wertet aus (Datenbankzugriff, Überprüfung, Ausgabe)
--> Clientseitig wartet AJAX auf eine Antwort
--> PHP ist fertig mit Auswerten und zeigt Ergebnis an (echo "Ergebnis ist da";)
--> AJAX empfängt Ergebnis (getResponse.requestText // requestXML) -> getResponse ist dabei der "Verweis" auf XMLRequest(AJAX)-Objekt.
--> Javascript verarbeitet Ergebnis und führt angepasste Funktionen ausBeispiel vereinfacht:
<script> var getRequest = XMLHttpObjectRequest(); function XMLHttpObjectRequest() { var request; if (window.XMLHttpRequest) request = new XMLHttpRequest(); else if (window.ActiveXObject) request = new ActiveXObject("Microsoft.XMLHTTP"); return request; } function sendRequest() // Abfrage auf Änderungen { if (getRequest.readyState==4 || getRequest.readyState==0) { url = "request.php"; getRequest.onreadystatechange = getAnswer; // Request gesendet, was dann? getRequest.open("POST" /*Methode*/, url, true); getRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); getRequest.send(/* Platz für Parameter z.B.: */ "id=1"); } } function getAnswer() // Antwort abwarten und auswerten { if (getRequest.readyState==4 || getRequest.readyState==0) { var response = getRequest.responseText; //responseXML alert(response); // Ausgabe der Antwort des Servers als "alert" /* ... Hier kann die Antwort dann Ausgewertet und verarbeitet werden ... */ } }
// request.php:
<?php // request erhalten und z.B. ID übergeben bekommen // Anhand der ID findet zum Beispiel eine Datenbankabfrage statt $result = mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id='".$_POST['id']."'"); echo ($result[0]['ergebnis']); // Das bekommt der Client als "responseText" ?>
LG
-
Vielen Dank.
Das sieht doch wunderbar aus.
Jetzt werde ich aber erstmal Datenbank , Grundgerüst, etc. aufbauen.;)Wird später dann später vermutlich noch Probleme geben, aber ich close diesen Beitrag erstmal.
Mfg
DerBaer
-
RandomAccess85 schrieb:
// request.php:
<?php // request erhalten und z.B. ID übergeben bekommen // Anhand der ID findet zum Beispiel eine Datenbankabfrage statt $result = mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id='".$_POST['id']."'"); echo ($result[0]['ergebnis']); // Das bekommt der Client als "responseText" ?>
Es ist natürlich klar, dass man das so *niemals* macht. Damit ermöglichst du eine SQL injection. Was du mindestens machen musst, ist, $_POST['id'] nach int zu casten.
Auch in Beispiel-Code halte ich es für wichtig, das zu beachten. Denn Beispiel-Code landet leider viel zu oft per copy&paste in Produktiv-Code.
-
Hallo,
Das ist natürlich absolut korrekt und sollte auch dringend beachtet werden.
Angepasst könnte das dann so aussehen:
<?php // request erhalten und z.B. ID übergeben bekommen // Anhand der ID findet zum Beispiel eine Datenbankabfrage statt $id = (int)$_POST['id']; // Damit wird in dem Fall sichergestellt das $_POST['id'] auch tatsächlich vom Typ "integer" ist. $result = mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id=$id"); echo ($result[0]['ergebnis']); // Das bekommt der Client als "responseText" ?>
LG
-
Sauberer finde ich das hier, da hier keine unnoetige Fehlermeldung von PHP erscheint:
<?php // request erhalten und z.B. ID übergeben bekommen // Anhand der ID findet zum Beispiel eine Datenbankabfrage statt if(is_numeric($_POST['id'])) { // Damit wird in dem Fall sichergestellt das $_POST['id'] auch tatsächlich numerisch ist. $result = mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id=".$_POST['id']); } echo ($result[0]['ergebnis']); // Das bekommt der Client als "responseText" ?>
-
heini schrieb:
Sauberer finde ich das hier, da hier keine unnoetige Fehlermeldung von PHP erscheint:
$result ist kein array -> und wieder n fehler...
user eingaben bitte ORDENTLICH validieren...
-
Shade Of Mine schrieb:
$result ist kein array -> und wieder n fehler...
Ja, das ist was anderes. Ist nicht mein Code. Habe darauf nicht geachtet. Mir ging es nur um das is_numeric, was die Benutzereingabe insofern auf Gueltigkeit ueberprueft, als dass es eine Zahl sein muss. Damit erhaelt man keine SQL-Fehlermeldung, keine PHP-Fehlermeldung und bei Falscheingaben schlicht und ergreifend kein Ergebnis.
-
heini schrieb:
Shade Of Mine schrieb:
$result ist kein array -> und wieder n fehler...
Ja, das ist was anderes. Ist nicht mein Code. Habe darauf nicht geachtet. Mir ging es nur um das is_numeric, was die Benutzereingabe insofern auf Gueltigkeit ueberprueft, als dass es eine Zahl sein muss. Damit erhaelt man keine SQL-Fehlermeldung, keine PHP-Fehlermeldung und bei Falscheingaben schlicht und ergreifend kein Ergebnis.
es sei denn ich uebergebe als id 0123
is_numeric ist eben kein guter test. besser ist es den parameter zu nehmen wie er ist und zu escapen und den sql server bestimmen zu lassen ob da ein gültiger wert raus kommt.
-
Shade Of Mine schrieb:
es sei denn ich uebergebe als id 0123
Was ist am Oktalwert 123 denn so besonders?
-
Hallo,
Sorry mein Fehler!
$result = mysql_fetch_array(mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id=".$_POST['id'])); echo ($result['ergebnis']);
Was du uns allerdings mit 0123 sagen willst ist mir schleierhaft! Davon ausgehend die ID sei Integer, gibt es sowieso keine voranstehende 0
LG
-
RandomAccess85 schrieb:
Hallo,
Sorry mein Fehler!
$result = mysql_fetch_array(mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id=".$_POST['id'])); echo ($result['ergebnis']);
Was du uns allerdings mit 0123 sagen willst ist mir schleierhaft! Davon ausgehend die ID sei Integer, gibt es sowieso keine voranstehende 0
LG
0123 wirft bei mysql nen syntax error ohne quotes wegen der null ... php interpretiert es aber als octalen zahlenwert.
(wenn ich nicht falsch liege :D)
-
PRIEST schrieb:
0123 wirft bei mysql nen syntax error ohne quotes wegen der null ... php interpretiert es aber als octalen zahlenwert.
(wenn ich nicht falsch liege :D)
exakt.
deshalb: bitte bitte bitte user eingaben ordentlich validieren.
wenn ihr so dumme sachen wie is_numeric macht, dann führt das zwangsweise zu Bugs. Denn niemand kann die ganzen implikationen kennen die daraus entstehen. es erwartet ja auch niemand dass man sie alle kennt - es ist ja auch unnötig.
man validiert korrekt und es gibt keine probleme:
if(!isset($_POST['id'])) throw new exception(); $id = $_POST['id']; $result = sql_query( "SELECT text AS ergebnis FROM tabelle WHERE id=':id:'", array('id' => $id) ); //prepared statement benutzen oder anderweitig escapen if($result===false) throw new exception(); //im idealfall wirft sql_query bereits diese exception $result=mysql_fetch_assoc(); if($result===false) throw new exception(); //im idealfall wirft fetch direkt eine exception echo ($result['ergebnis']);
toller ist das ganze natürlich wenn man die sachen etwas mehr kapselt. zb auch keine rohen sql queries mehr im code stehen lässt, etc. aber was essentiell ist: validieren der eingabe.
desto mehr und besser man kapselt, desto weniger muss man selber tun.
bei mir könnte das zB so aussehen:
require_input($_POST, 'id'); $result=$db->query('some query', array('id' => $_POST['id']))->fetch_single(); echo $result['ergebnis'];
-
Shade Of Mine schrieb:
PRIEST schrieb:
0123 wirft bei mysql nen syntax error ohne quotes wegen der null
exakt.
Also bei mir nicht. Hab's mit PHPMyAdmin auf meinem Heimserver nachgespielt.
Meines Erachtens nach aber wuerde bei dem Versuch einen Nicht-Zahlenwert in Integer zu casten eine Fehlermeldung in PHP auswerfen, und genau das wollte ich damit nur vermeiden.
-
heini schrieb:
Also bei mir nicht. Hab's mit PHPMyAdmin auf meinem Heimserver nachgespielt.
Dann haben sie das in mysql irgendwann mal angepasst. früher war es jedenfalls so, dass 01 ein fehler war.
jedenfalls wird 01 mit mysql 5 korrekt verstanden, lediglich als dezimal zahl, während es in php eine oktal zahl ist.
Meines Erachtens nach aber wuerde bei dem Versuch einen Nicht-Zahlenwert in Integer zu casten eine Fehlermeldung in PHP auswerfen, und genau das wollte ich damit nur vermeiden.
nein. so ein cast schlägt nie fehl:
v
ist zb ein sehr naiver test ob $v eine zahl ist.
-
Shade Of Mine schrieb:
nein. so ein cast schlägt nie fehl:
v
ist zb ein sehr naiver test ob $v eine zahl ist.Kann man so nicht sagen
$v = (int)"Hallo" ? "ok" : "failed";
... ergibt zum Beispiel "failed".
LG
-
RandomAccess85 schrieb:
$v = (int)"Hallo" ? "ok" : "failed";
Das ist etwa das Glieche, wie:
$v=0; echo ($v ? "ok" : "failed");
Das Problem ist einfach, dass 0 mit false gleichgesetzt wird. Da "Hallo" keine Zahl enthaelt, wird das zur 0 und damit bei der Abfrage als false gewertet. Anders wuerde es damit laufen:
$v = (int)"Hallo"; if($v!==false) echo "ok"; else echo "failed";
Wichtig ist der !== Operator.
-
RandomAccess85 schrieb:
Shade Of Mine schrieb:
nein. so ein cast schlägt nie fehl:
v
ist zb ein sehr naiver test ob $v eine zahl ist.Kann man so nicht sagen
$v = (int)"Hallo" ? "ok" : "failed";
... ergibt zum Beispiel "failed".
Und?
Der cast ist nicht fehlgeschlagen, du hast 0 als Wert erhalten.
-
Hallo,
na um die Fehlerbehandlung kann man sich - wenn man schon an der Stelle ist - auch selbst kümmern.
$v = (int)"Hallo" ? "ok" : "failed"; // $v = failed $v = (int)1 ? "ok" : "failed"; // $v = ok
*zu faul zum Einloggen
LG
-
RandomAccess85* schrieb:
Hallo,
na um die Fehlerbehandlung kann man sich - wenn man schon an der Stelle ist - auch selbst kümmern.
$v = (int)"Hallo" ? "ok" : "failed"; // $v = failed $v = (int)1 ? "ok" : "failed"; // $v = ok
*zu faul zum Einloggen
LG
$v = (int)0 ? "ok" : "failed"; // v = (int)"123abc" ? "ok" : "failed"; // $v = ok
-
Ok,
ich verstehe den Einwand
LG