| Autor |
Nachricht |
DerBaer
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.11.2008
Beiträge: 146
|
DerBaer Mitglied
11:00:59 10.03.2010 Titel: |
[gelöst] Browsergame - direktes 1 vs. 1 |
Zitieren |
Hi,
ihr habt die Frage sicherlich schon unendlich oft gehört: Welche Programmiersprache?
Ich würde für mein Browsergame HTML, JS, PHP und MySQL verwenden(sollte normalerweise funktionieren, oder?^^)
Allerdings will ich erreichen, dass 2 Leute direkt gegeneinander antreten können und jeder abwechselnd Aktionen durchführen kann. Also sowas wie Schach.
Meine Frage ist jetzt, ob sowas mit den "einfachen" Websprachen geht, oder ob man Flash oder so braucht.
Das Problem liegt ja dabei, dass der Browser von Spieler 1 nicht weiß, wann der Spieler 2 was gemacht hat. Also müsste man regelmäßig nachfragen => Refresh => hässlich.
Dann hab ich gelsen, man kann AJAX verwenden. Aber das ist doch dann auch nur regelmäßiges Abfragen, oder nicht(leider stand nicht dabei, wie man es realisiert)?
Eigentlich denke ich es ist nicht möglich, aber vielleicht(hoffentlich) irre ich mich?
PS.: Ich würde mich nachtürlich in neue Gebiete erstmal einarbeiten und weiß, dass ein BG lange braucht. Also bitte keine Antworten wie: "Vergiss es. Schaffst du sowieso nicht." oder so |
_________________ Die 3 größten Gefahren für einen Informatiker: Licht, frische Luft und Termine
Zuletzt bearbeitet von DerBaer am 12:50:33 10.03.2010, insgesamt 1-mal bearbeitet |
|
 |
Unregistrierter
|
Unregistrierter
11:10:20 10.03.2010 Titel: |
|
Zitieren |
Hallo,
ja, grundsätzlich ist der Ansatz korrekt und auch der Einwurf mit AJAX geht in die richtige Richtung. Regelmäßige Request müssten den Status des jeweils anderen Spielers abfragen. Da du MySQL verwenden willst, macht es die ganze Sache sogar recht einfach. Eine Statusänderung des Gegenspielers könnte so ohne Weiteres in die Datenbank geschrieben und von dort auch wieder gelesen werden.
LG |
|
|
|
 |
TdZ
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.07.2007
Beiträge: 242
|
TdZ Mitglied
11:16:02 10.03.2010 Titel: |
|
Zitieren |
Genau wie RandomAccess sagt gehen deine Überlegungen eigentlich genau in die richige Richtung. Du kannst AJAX verwenden, um in einem periodischen Zeitabstand nachzufragen, ob der Gegenspieler seinen Zug gemacht hat. Dies geschieht über die Abfrage eines oder mehrerer Werte in einer zentralen Datenbank, auf die beide Spieler (natürlich indirekt) Zugriff haben. |
_________________ A picture is worth 0x100000 DWORDs.
|
|
 |
Jockelx
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.12.2009
Beiträge: 547
|
Jockelx Mitglied
11:16:46 10.03.2010 Titel: |
|
Zitieren |
Hi,
wie soll das Spiel denn aussehen?
Also im Sinne von: Wie synchron muss das denn sein?
Wenn es reicht einmal pro Sekunde zu refreshen, dann ist Ajax sicherlich gut.
Dann würdest du halt sekündlich eine Anfrage ala 'Gibt's was neues' schicken und der Server gibt nur ein yes oder no oder sowas zurück und bei yes käme dann ein
wirklicher Refresh-Aufruf.
Wenn es scheller aktuell sein muss, dann wirst du wohl ein Java-Applet oder Silverlight oder sowas nehmen müssen,
dass ein permanente Verbindung (in beide Richtungen) offen halten kann.
Silverlight kann glaube ich mittlerweile sogar Peer2Peer, was dann die schnellste Variante wäre. |
|
|
|
 |
DerBaer
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.11.2008
Beiträge: 146
|
DerBaer Mitglied
11:24:25 10.03.2010 Titel: |
|
Zitieren |
also 1 Sekunde reicht schon(soll eine Art Kartenspiel werden).
Ich dachte nur, das auch der 1 Skunde refresh problematisch werden kann, aber wenn ihr meint, das frisst nicht die ganze Bandbreite und so,d ann versuche ich das mal.
Danke euch allen |
_________________ Die 3 größten Gefahren für einen Informatiker: Licht, frische Luft und Termine
|
|
 |
heini
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.09.2007
Beiträge: 326
|
heini Mitglied
11:36:47 10.03.2010 Titel: |
|
Zitieren |
Ich vermute, dass ein 5-sekuendliches Update genuegt, da er sein Spiel mit Schach und aehnlichem verglichen hat.
Damit mehrere Spiele gleichzeitig stattfinden koennen, brauchst du zunaechst eine Spielertabelle, eine Sitzungstabelle und eine Tabelle, wo alle Spielablaeufe gespeichert werden.
Folgender Ablauf:- Bei Anmeldungen gibt es Benutzernamen.
- Jeder Benutzername wird in der DB mit einer Session-ID verknuepft.
- Ist ein bestimmter Timeout nicht abgelaufen, gilt der Benutzer als online.
- In einer Liste kann man ein Spiel eroeffnen.
- Andere Spieler koennen beitreten.
- Ist die Spielerliste voll, beginnt das Spiel.
Mit der Session-ID sowie mit AJAX laesst sich das Ganze unkompliziert realisieren. |
_________________ „Justiz für alle!“
|
|
 |
Unregistrierter
|
Unregistrierter
11:43:25 10.03.2010 Titel: |
|
Zitieren |
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:
| Zitat: |
--> 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 aus
|
Beispiel vereinfacht:
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <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 ... */
}
}
| |
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <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 ... */
}
}
| |
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <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 Code: | <?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"
?>
| |
| PHP Code: | <?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"
?>
| |
| PHP Code: | <?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 |
Zuletzt bearbeitet von Unregistrierter am 11:44:05 10.03.2010, insgesamt 1-mal bearbeitet |
|
 |
DerBaer
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.11.2008
Beiträge: 146
|
DerBaer Mitglied
12:50:16 10.03.2010 Titel: |
|
Zitieren |
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 |
_________________ Die 3 größten Gefahren für einen Informatiker: Licht, frische Luft und Termine
Zuletzt bearbeitet von DerBaer am 12:53:16 10.03.2010, insgesamt 1-mal bearbeitet |
|
 |
Christoph
Moderator
Benutzerprofil
Anmeldungsdatum: 30.04.2001
Beiträge: 5711
|
Christoph Moderator
16:22:39 10.03.2010 Titel: |
|
Zitieren |
| RandomAccess85 schrieb: | // request.php:
| PHP Code: | <?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"
?>
| |
| PHP Code: | <?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"
?>
| |
| PHP Code: | <?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. |
_________________ Wenn Word für Längeres geeignet wäre, würde es nicht Word, sondern Sentence, Page oder Article heißen.
|
|
 |
Unregistrierter
|
Unregistrierter
10:03:16 11.03.2010 Titel: |
|
Zitieren |
Hallo,
Das ist natürlich absolut korrekt und sollte auch dringend beachtet werden.
Angepasst könnte das dann so aussehen:
| PHP Code: | <?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"
?>
| |
| PHP Code: | <?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"
?>
| |
| PHP Code: | <?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 |
|
|
|
 |
heini
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.09.2007
Beiträge: 326
|
heini Mitglied
23:44:49 11.03.2010 Titel: |
|
Zitieren |
Sauberer finde ich das hier, da hier keine unnoetige Fehlermeldung von PHP erscheint:| PHP Code: | 1 2 3 4 5 6 7 8 | 1 2 3 4 5 6 7 8 | <?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"
?>
| |
| PHP Code: | 1 2 3 4 5 6 7 8 | <?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"
?>
| |
| PHP Code: | 1 2 3 4 5 6 7 8 | <?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"
?>
| |
|
_________________ „Justiz für alle!“
|
|
 |
Shade Of Mine
Moderator
Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 17736
|
Shade Of Mine Moderator
23:52:16 11.03.2010 Titel: |
|
Zitieren |
| 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... |
_________________ A language that doesn't affect the way you think about programming is not worth knowing.
|
|
 |
heini
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.09.2007
Beiträge: 326
|
heini Mitglied
23:56:56 11.03.2010 Titel: |
|
Zitieren |
| 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. |
_________________ „Justiz für alle!“
|
|
 |
Shade Of Mine
Moderator
Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 17736
|
Shade Of Mine Moderator
00:07:28 12.03.2010 Titel: |
|
Zitieren |
| 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. |
_________________ A language that doesn't affect the way you think about programming is not worth knowing.
|
|
 |
heini
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.09.2007
Beiträge: 326
|
heini Mitglied
00:21:42 12.03.2010 Titel: |
|
Zitieren |
| Shade Of Mine schrieb: | | es sei denn ich uebergebe als id 0123 | Was ist am Oktalwert 123 denn so besonders? |
_________________ „Justiz für alle!“
|
|
 |
Unregistrierter
|
Unregistrierter
09:07:29 12.03.2010 Titel: |
|
Zitieren |
Hallo,
Sorry mein Fehler!
| PHP Code: | $result = mysql_fetch_array(mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id=".$_POST['id']));
echo ($result['ergebnis']);
| |
| PHP Code: | $result = mysql_fetch_array(mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id=".$_POST['id']));
echo ($result['ergebnis']);
| |
| PHP Code: | $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 |
|
|
|
 |
PRIEST
Mitglied
Benutzerprofil
Anmeldungsdatum: 07.12.2005
Beiträge: 1515
|
PRIEST Mitglied
10:13:27 12.03.2010 Titel: |
|
Zitieren |
| RandomAccess85 schrieb: | Hallo,
Sorry mein Fehler!
| PHP Code: | $result = mysql_fetch_array(mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id=".$_POST['id']));
echo ($result['ergebnis']);
| |
| PHP Code: | $result = mysql_fetch_array(mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id=".$_POST['id']));
echo ($result['ergebnis']);
| |
| PHP Code: | $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 ) |
_________________ >> C makes it easy to shoot yourself in the foot, C++ makes it harder, but when you do, it blows away your whole leg. <<
|
|
 |
Shade Of Mine
Moderator
Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 17736
|
Shade Of Mine Moderator
11:27:24 12.03.2010 Titel: |
|
Zitieren |
| 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 ) |
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:
| PHP Code: | 1 2 3 4 5 6 7 8 9 10 11 12 | 1 2 3 4 5 6 7 8 9 10 11 12 | 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']);
| |
| PHP Code: | 1 2 3 4 5 6 7 8 9 10 11 12 | 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']);
| |
| PHP Code: | 1 2 3 4 5 6 7 8 9 10 11 12 | 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:
| PHP Code: | require_input($_POST, 'id');
$result=$db->query('some query', array('id' => $_POST['id']))->fetch_single();
echo $result['ergebnis'];
| |
| PHP Code: | require_input($_POST, 'id');
$result=$db->query('some query', array('id' => $_POST['id']))->fetch_single();
echo $result['ergebnis'];
| |
| PHP Code: | require_input($_POST, 'id');
$result=$db->query('some query', array('id' => $_POST['id']))->fetch_single();
echo $result['ergebnis'];
| |
|
_________________ A language that doesn't affect the way you think about programming is not worth knowing.
Zuletzt bearbeitet von Shade Of Mine am 11:28:56 12.03.2010, insgesamt 1-mal bearbeitet |
|
 |
heini
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.09.2007
Beiträge: 326
|
heini Mitglied
13:25:08 12.03.2010 Titel: |
|
Zitieren |
| 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. |
_________________ „Justiz für alle!“
|
|
 |
Shade Of Mine
Moderator
Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 17736
|
Shade Of Mine Moderator
14:00:18 12.03.2010 Titel: |
|
Zitieren |
| 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.
| Zitat: | | 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==(int)$v
ist zb ein sehr naiver test ob $v eine zahl ist. |
_________________ A language that doesn't affect the way you think about programming is not worth knowing.
|
|
 |
Unregistrierter
|
Unregistrierter
14:12:33 12.03.2010 Titel: |
|
Zitieren |
| Shade Of Mine schrieb: |
nein. so ein cast schlägt nie fehl:
$v==(int)$v
ist zb ein sehr naiver test ob $v eine zahl ist. |
Kann man so nicht sagen
| PHP Code: | | $v = (int)"Hallo" ? "ok" : "failed";
| |
| PHP Code: | | $v = (int)"Hallo" ? "ok" : "failed";
| |
| PHP Code: | | $v = (int)"Hallo" ? "ok" : "failed";
| |
... ergibt zum Beispiel "failed".
LG |
|
|
|
 |
heini
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.09.2007
Beiträge: 326
|
heini Mitglied
14:17:43 12.03.2010 Titel: |
|
Zitieren |
| RandomAccess85 schrieb: | | PHP Code: | | $v = (int)"Hallo" ? "ok" : "failed"; | |
| PHP Code: | | $v = (int)"Hallo" ? "ok" : "failed"; | |
| PHP Code: | | $v = (int)"Hallo" ? "ok" : "failed"; | |
| Das ist etwa das Glieche, wie:| PHP Code: | $v=0;
echo ($v ? "ok" : "failed"); | |
| PHP Code: | $v=0;
echo ($v ? "ok" : "failed"); | |
| PHP Code: | $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:| PHP Code: | $v = (int)"Hallo";
if($v!==false) echo "ok";
else echo "failed"; | |
| PHP Code: | $v = (int)"Hallo";
if($v!==false) echo "ok";
else echo "failed"; | |
| PHP Code: | $v = (int)"Hallo";
if($v!==false) echo "ok";
else echo "failed"; | |
Wichtig ist der !== Operator. |
_________________ „Justiz für alle!“
Zuletzt bearbeitet von heini am 14:18:12 12.03.2010, insgesamt 1-mal bearbeitet |
|
 |
Shade Of Mine
Moderator
Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 17736
|
Shade Of Mine Moderator
14:19:50 12.03.2010 Titel: |
|
Zitieren |
| RandomAccess85 schrieb: | | Shade Of Mine schrieb: |
nein. so ein cast schlägt nie fehl:
$v==(int)$v
ist zb ein sehr naiver test ob $v eine zahl ist. |
Kann man so nicht sagen
| PHP Code: | | $v = (int)"Hallo" ? "ok" : "failed";
| |
| PHP Code: | | $v = (int)"Hallo" ? "ok" : "failed";
| |
| PHP Code: | | $v = (int)"Hallo" ? "ok" : "failed";
| |
... ergibt zum Beispiel "failed".
|
Und?
Der cast ist nicht fehlgeschlagen, du hast 0 als Wert erhalten. |
_________________ A language that doesn't affect the way you think about programming is not worth knowing.
|
|
 |
RandomAccess85*
Unregistrierter
|
RandomAccess85* Unregistrierter
16:01:44 12.03.2010 Titel: |
|
Zitieren |
Hallo,
na um die Fehlerbehandlung kann man sich - wenn man schon an der Stelle ist - auch selbst kümmern.
| PHP Code: | $v = (int)"Hallo" ? "ok" : "failed"; // $v = failed
$v = (int)1 ? "ok" : "failed"; // $v = ok
| |
| PHP Code: | $v = (int)"Hallo" ? "ok" : "failed"; // $v = failed
$v = (int)1 ? "ok" : "failed"; // $v = ok
| |
| PHP Code: | $v = (int)"Hallo" ? "ok" : "failed"; // $v = failed
$v = (int)1 ? "ok" : "failed"; // $v = ok
| |
*zu faul zum Einloggen
LG |
|
|
|
 |
Shade Of Mine
Moderator
Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 17736
|
Shade Of Mine Moderator
16:37:28 12.03.2010 Titel: |
|
Zitieren |
| RandomAccess85* schrieb: | Hallo,
na um die Fehlerbehandlung kann man sich - wenn man schon an der Stelle ist - auch selbst kümmern.
| PHP Code: | $v = (int)"Hallo" ? "ok" : "failed"; // $v = failed
$v = (int)1 ? "ok" : "failed"; // $v = ok
| |
| PHP Code: | $v = (int)"Hallo" ? "ok" : "failed"; // $v = failed
$v = (int)1 ? "ok" : "failed"; // $v = ok
| |
| PHP Code: | $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 = failed
$v = (int)"123abc" ? "ok" : "failed"; // $v = ok |
_________________ A language that doesn't affect the way you think about programming is not worth knowing.
Zuletzt bearbeitet von Shade Of Mine am 16:38:22 12.03.2010, insgesamt 1-mal bearbeitet |
|
 |
Unregistrierter
|
Unregistrierter
16:56:46 12.03.2010 Titel: |
|
Zitieren |
Ok,
ich verstehe den Einwand
LG |
|
|
|
 |