PHP Script funktioniert nicht ganz wie ich möchte

  • Antworten:11
  • Bentwortet
Simon N.
  • Forum-Beiträge: 13

12.11.2014, 16:01:17 via Website

Hallo und Danke an alle die sich die Zeit nehmen hier sich mit meinem Problem zu beschäftigen!

Ich möchte für ein kleines Spiel von mir eine Highscore liste hinzufügen und hab auch schon alles was ich brauche
(Datenbank, Script zum Daten einspeicher/auslesen usw), jedoch fehlt mir noch ein Script: Der zum Highscores updaten.
Dieser soll Suchen ob der Spielername schon vorhanden ist von dem der Score geupdatet werden soll und falls ja dieses tun. Falls nicht vorhanden soll er den Spieler + Score einschreiben.

Ich habe jetzt schon ewig rumprobiert und das ist dabei rausgekommen:

$con=mysqli_connect("CONNECTION","USERNAME","PASSWORT","DATENBANK");

$name = $_GET['name'];
$highscore= $_GET['highscore'];

if ($name == "" or $highscore == "")
{
echo "Fehler";
} else {

$sql = "SELECT * FROM highscores WHERE name='$name'";
$db_erg = mysqli_query( $con, $sql );
if ($db_erg = 0)
{
$q="INSERT INTO highscores (name, highscore) VALUES ('$name', '$highscore')";
if (mysqli_query($con,$q))
{
echo "Values have been inserted successfully";
} else {
echo "Error Writing Highscore";
}
} else {

  $ql = "UPDATE highscores Set highscore='$highscore' WHERE name='$name'";
  if (mysqli_query($con,$ql))
  {
      echo "Values have been Updatet successfully";
  } else {
      echo "Error Updating Highscore";
  }

}
}
mysqli_close($con);
?>

Das ganze funktioniert auch soweit, das wenn ein Spieler schon vorhanden ist, das der Score geupdatet wird.
Doch wenn jetzt der Spieler nicht vorhanden ist wird er trotzdem geupdatet (Was dann logischerweise nicht geht).

Weiß jemand wo mein Fehler liegt ?
Danke schon im vorraus

— geändert am 12.11.2014, 16:11:43

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.11.2014, 16:37:18 via Website

Hallo Simon,
Herzlich wilkommen bei uns im Forum :)
Ich habe zu deinem Code mal anmerkungen hinzugefügt:

 $con=mysqli_connect("ADRESSE","BENUTZER","PASSWORT","DATENBANK");

$name = $_GET['name'];
$highscore= $_GET['highscore'];

if ($name == "" or $highscore == "") // das or kann sollte mit einem & ersetzt werden, sonst kann ja eine von beiden vars immer noch leer sein
{
echo "Fehler";
} else {

$sql = "SELECT * FROM highscores WHERE name='$name'";
$db_erg = mysqli_query( $con, $sql );
if ($db_erg = 0) // Vergleiche immer mit ==
{
$q="INSERT INTO highscores (name, highscore) VALUES ('$name', '$highscore')";
if (mysqli_query($con,$q))
{
echo "Values have been inserted successfully";
} else {
echo "Error Writing Highscore";
}
} else {

$ql = "UPDATE highscores Set highscore='$highscore' WHERE name='$name'";
if (mysqli_query($con,$ql))
{
echo "Values have been Updated successfully";
} else {
echo "Error Updating Highscore";
}
}
}
mysqli_close($con);
?>

Werden denn irgendwo Fehler angezeigt?

— geändert am 12.11.2014, 16:44:54

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Simon N.
  • Forum-Beiträge: 13

12.11.2014, 18:02:31 via Website

Danke schon mal für die Antwort ;)

Also ich habe alles verbessert was du kommentiert hast, leider ist immer noch das selbe Problem das in jedem Fall die UPDATE
Methode aufgerufen wird.

Fehler gibt es keine. Es wird jedesmal (wie von mir fest gelegt im Script) die Naricht:
"Values have been Updated successfully" ausgegeben.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.11.2014, 18:08:32 via Website

Dann ist wohl irgend was an der if hier falsch:
if ($db_erg == 0)

Was steht denn in der var $db_ereg drin wenn du sie ausgibst?
Ich glaube du musst da die Zeilen zählen:http://php.net/manual/de/mysqli-result.num-rows.php
und diese dann auf die anzahl =0 prüfen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Simon N.
  • Forum-Beiträge: 13

12.11.2014, 18:31:40 via Website

Wenn ich den Code so umändere:

$sql = "SELECT * FROM highscores WHERE name='$name'";
$db_erg = mysqli_query( $con, $sql );
$output[]=$db_erg;
print(json_encode($output));

wird mir das hier ausgegeben:

[{}]Values have been Updated successfully

Also ist das ergebnis leer ??? Jetzt kapier ich's nicht mehr, weil wenn ich GENAU DIESEN CODE:

SELECT * FROM highscores WHERE name='$name';

in der Datenbank als SQL ausführe, bekomme ich meine Daten angezeigt ...

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.11.2014, 18:42:45 via Website

Hast du denn bei beiden Select befehlen die gleichen Namen benutzt ;)

Probier es doch einfach mal mit dem count Befehl, damit sollte es klappen.
Evntl lase dir mit echo die erstellten Select Befehle ausgeben und probiere diese mal direkt in der DB.

Ps: Anmerkungen ausserhalb des Problems:

if ($name == "" or $highscore == "") 

//Das kann man mit den befehlen trim und empty besser machen:

if(!empty(trim($name)) & !empty(trim($highscore)))

{[...]

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Simon N.
  • Forum-Beiträge: 13

12.11.2014, 18:50:44 via Website

Ja ich hab die gleiche Namen verwendet ;)

Und wenn ich jetzt in meinem PHP Script einen Namen verwende der schon eingetragen ist,
wird der auch upgedatet. - Was ja schon mal Positiv ist :)

Nur wenn der Name eben nicht vorhanden ist wird kein neuer Eintrag erstellt sondern es wird
auch der Teil mit dem Update ausgeführt ... :/

Ich hab noch keine Erfahrung mit count ... (sry ;)) Könntest du mir vielleicht genau schreiben wie ich das einsetze
oder wenn du grade ein gutest Tut kennst den Link schicken ? (Hab schon gesucht, bin aber leider dadurch nicht schlauer geworden)

Danke schon jetzt für deine Hilfe, echt nett!

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.11.2014, 19:07:00 via Website

so in etwa:
if(mysqli_num_rows($db_erg) ==0) //Hier wird die anzehl der vom sql ausgegebenen Zeilen gezählt und dann überprüft ob Wert =0
{...

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Simon N.
  • Forum-Beiträge: 13

12.11.2014, 19:10:36 via Website

:O
Es geht
:O
(Soll jetzt nicht kindisch kommen oder so :D)

Ok danke man! Den ganzen Tag lang bin ich dran gesessen! ;)
War ne gute Idee mal hier nachzufragen.

Vielen dank dir!

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.11.2014, 19:11:37 via App

Kein Problem :)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

12.11.2014, 19:40:32 via Website

Anmerkung am Rande:
Es ist SEHR gefährlich Daten, die über GET/POST reinkommen , direkt in ein SQL Statement einzufügen.
Damit öffnest Du SQL-Injection Tür und Tor.
Heutzutage nimmt man da eigentlich immer ein PreparedStatement, zumal das auch die Performance deutlich steigert.

Antworten
Simon N.
  • Forum-Beiträge: 13

12.01.2015, 21:02:08 via Website

Ja das weiß ich mittlerweile auch ;) Und es spart nicht nur Performance es ist auch einfacher zum schreiben meiner Meinung nach ;)

Antworten