Highscoretabelle (mit Datenbank) fügt "von alleine" neue Einträge hinzu

  • PHP

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von siycah.

    Highscoretabelle (mit Datenbank) fügt "von alleine" neue Einträge hinzu

    Moinsen ich habe für eine Webseite ein wenig PHP Code, welcher mit einer Datenbank verbunden ist.

    Das Eingeben von Highscores durch den Nutzer durch Buttonclick klappt soweit auch gut aber:

    Problem: es werden irgendwie immer neue Einträge von alleine hinzugefügt und ich weiß nicht wieso.

    Bin mir sicher dass es am Code liegt und nicht durch Fremdmanipulation.

    Ich poste hier den Code und hoffe, wir werden draus schlauer.

    LG

    datei index.php

    PHP-Quellcode

    1. <?php
    2. // Server name must be localhost
    3. $servername = "localhost";
    4. // In my case, user name will be root
    5. $username = "root";
    6. // Password is empty
    7. $password = "";
    8. // Creating a connection
    9. $conn = new mysqli($servername,
    10. $username, $password);
    11. // Check connection
    12. if ($conn->connect_error) {
    13. die("Connection failure: "
    14. . $conn->connect_error);
    15. }
    16. $retval = mysqli_select_db($conn, 'geekdata' );
    17. if(! $retval ) {
    18. die('Could not select database: ' . mysqli_error($conn));
    19. }
    20. $sql2 = "create table IF NOT EXISTS highscore(id INT AUTO_INCREMENT,name VARCHAR(20) NOT NULL,
    21. score INT ,primary key (id))";
    22. if(mysqli_query($conn, $sql2)){
    23. }else{
    24. echo "Could not create table: ". mysqli_error($conn);
    25. }
    26. // Closing connection
    27. $conn->close();
    28. ?>


    datei indedone.php

    PHP-Quellcode

    1. <?php
    2. $servername = "localhost";
    3. $username = "root";
    4. $password = '';
    5. $dbname = "geekdata";
    6. // Create connection
    7. $conn = mysqli_connect($servername, $username, $password, $dbname);
    8. // Check connection
    9. if (!$conn) {
    10. die("Connection failed: " . mysqli_connect_error());
    11. }
    12. echo 'Hier die Highscores: <br>';
    13. $sql = "SELECT * FROM `highscore` ORDER BY `highscore`.`score` DESC";
    14. $result = mysqli_query($conn, $sql);
    15. if (mysqli_num_rows($result) > 0) {
    16. // output data of each row
    17. while($row = mysqli_fetch_assoc($result)) {
    18. echo $row["name"]. ": &nbsp;";
    19. echo $row["score"]. "<br /><br />";
    20. }
    21. } else {
    22. echo "No messages";
    23. }
    24. mysqli_close($conn);
    25. ?>



    datei indexprocess.php --> HIER WIRD DER FEHLER VERMUTET

    PHP-Quellcode

    1. ​<meta http-equiv="refresh" content="0; url=./indexdone.php" />
    2. <?php
    3. $servername = "localhost";
    4. $username = "root";
    5. $password = '';
    6. $dbname = "geekdata";
    7. $fname = $_POST['fname'];
    8. $lname = $_POST['lname'];
    9. try {
    10. $conn = new PDO("mysql:host=$servername; dbname=$dbname", $username, $password);
    11. // set the PDO error mode to exception
    12. $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    13. $sql = "INSERT INTO highscore (name, score)
    14. VALUES ('$fname', '$lname')";
    15. // use exec() because no results are returned
    16. $conn->exec($sql);
    17. echo "New record inserted";
    18. }
    19. catch(PDOException $e)
    20. {
    21. echo $sql . "<br>" . $e->getMessage();
    22. }
    23. $conn = null;
    24. ?>
    Ich habe den Verdacht, das du irgendwo die Datei in einer anderen nutzt.

    include "indexprocess.php";
    oder
    require "indexprocess.php";
    .....

    Dann wird die PHP ausgeführt und du wunderst dich dann. Lösung wäre dann das in eine Funktion zu packen und sie aufzurufen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    @INOPIAE Moinsen,
    aus dem html teil von index.php:
    um die ergebnisse einzutragen:

    PHP-Quellcode

    1. <form id="new record" action="indexprocess.php" method="POST">
    2. <table width="250px" >
    3. <tr style="display:none">
    4. <td width="50%" >
    5. <input id="nameintabelle" type="text" name="fname" id="fname" readonly >
    6. </td>
    7. <td width="50%" >
    8. <input id="scoreintabelle" type="text" name="lname" id="lname" readonly >
    9. </td>
    10. </tr>
    11. <tr >
    12. <td width="50%" style="display:none" >
    13. </td>
    14. <td width="50%" >
    15. <input onclick='eintragen()' type="submit" value="Score speichern" style="height:3rem" >
    16. </td>
    17. </tr>
    18. </table>
    19. </form>


    --> die funktion eintragen() übermittelt einfach nur die Werte, die sich über JS zusammengerechnet haben. (Punkte und Spielernamen)

    um die ergebnisse znur anzuzeigen gibt es einen link:

    PHP-Quellcode

    1. <div id="linkhighscore">
    2. <a id="link_ergebnisse" href="indexdone.php">Zu den Highscores</a>
    3. </div>


    Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von „Visual_Prog“ ()

    @ISliceUrPanties aber gerne. Die ist eigentlich sehr übersichtlich. spielerNamen ist ein String und punkte ist ein Integer.

    PHP-Quellcode

    1. function eintragen(){
    2. document.getElementById('nameintabelle').value = spielerNamen;
    3. document.getElementById('scoreintabelle').value = punkte;
    4. }


    Noch ein Hinweis, das merkwürdige ist, dass ich kein Schema dahinter finde, wie diese ungewollten Einträge sich ergeben z.B. es würde immer geschehen, wenn man den Highscore einträgt...so ist es nicht ...zumindest nicht nach meinem Wissen.
    Sondern es ist so, dass die Ergebnisse einfach nach und nach einfach so in der Datenbank und damit auf der Webseite erscheinen.
    Aber wie gesagt Fremdmanipulation ist wenig warscheinlich, dass muss da irgendwo der Fehler sein im Code.
    Moin @Visual_Prog,

    was mir in deinen PHP-Skripten fehlt, ist eine Überprüfung ob auch tatsächlich POST-Requests ankommen. Für mich riecht es ganz arg danach, als würdest du in einem deiner GET-Requests den SQL-Aufruf tätigen.




    So, hier wäre ich dann auch wieder.

    Und zwar habe ich immer sowas in der Art verwendet:
    In einer Klasse "RouteController" habe ich dann diverse Abfragen würde gewisse Routen.
    Je nach Route, habe ich dann definiert, welche REQUEST_METHOD verwendet werden muss und im gleichen Zuge habe ich dann auch die überprüfung, ob gewisse Nutze überhaupt genügend Rechte haben, sowas einzubauen.

    Die Methoden wende ich folgendermaßen an:
    In meiner index.php
    Spoiler anzeigen

    PHP-Quellcode

    1. require_once("./route_controller.php");
    2. // Determine if we're dealing with an API route
    3. if (RouteController::isApiRoute()) {
    4. // it seems so. Hand off to src/api.php and exit
    5. require_once("./src/api.php");
    6. return;
    7. } else if (RouteController::isDialogRoute()) {
    8. RouteController::handleDialogRoute();
    9. return;
    10. }


    Und dann in src/api.php
    Spoiler anzeigen

    PHP-Quellcode

    1. public static function handleRoute(string $apiRoute, string &$message): int {
    2. switch ($_SERVER["REQUEST_METHOD"]) {
    3. default:
    4. case "GET":
    5. return ApiController::handleGetRoute($apiRoute, $message);
    6. case "POST":
    7. return ApiController::handlePostRoute($apiRoute, $message);
    8. case "PUT":
    9. return ApiController::handlePutRoute($apiRoute, $message);
    10. case "DELETE":
    11. return ApiController::handleDeleteRoute($apiRoute, $message);
    12. }
    13. }
    14. // Den ganzen unnötigen Quatsch habe ich mal rausgeparst.
    15. { // Scope this
    16. $output = "";
    17. http_response_code(ApiController::handleRoute(RouteController::getRawRoute(), $output));
    18. echo json_encode((object)array( "Message" => $output ));
    19. die();
    20. }


    Ganz so kompliziert wie in meinem Fall muss man das nicht machen - ich bin auch kein professioneller PHP-Entwickler! - aber für meine Zwecke funktioniert das.

    Wichtig wäre für dich folgender Ausschnitt:

    PHP-Quellcode

    1. switch ($_SERVER["REQUEST_METHOD"]) {
    2. default:
    3. case "GET":
    4. // behandle hier deine GETs
    5. break;
    6. case "POST":
    7. // behandle hier deine Eingaben in die Datenbank
    8. break;
    9. case "PUT":
    10. // oder behandle hier deine Eingaben; aber PUT wird nicht immer unterstützt!
    11. case "DELETE":
    12. // behandle hier Fälle, wo du Einträge aus der Datenbank entfernen willst
    13. break;
    14. }
    15. }

    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems

    Selbstständiger Softwareentwickler & IT-Techniker.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „siycah“ ()

    so ich habe jetzt einmal den code abschnitt von siycah im code eingabaut und muss sagen, jetzt nach 2-3 tagen bleibt die highscoretabelle endlich ohne diese merkwürdigen zusatzeinträge :D

    ich habe noch fragen zu deinem letzten code-abschnitt (bin selber blutiger anfänger mit php):

    nutzt du das in jedem php script?
    kann man im case "GET" nicht auch eingaben in die datenbank verwalten wie beim case "POST"? oder sollen alle "INSERTS" immer mit post behandelt werden ? bin da etwas verwirrt von den kommentaren im code ^^

    kannst du das evtl näher erklären ?
    ​was mir in deinen PHP-Skripten fehlt, ist eine Überprüfung ob auch tatsächlich POST-Requests ankommen. Für mich riecht es ganz arg danach, als würdest du in einem deiner GET-Requests den SQL-Aufruf tätigen.
    ich hab doch gar kein GET -Request verwendet oder doch ? xD

    vielen Dank soweit LG

    Visual_Prog schrieb:

    so ich habe jetzt einmal den code abschnitt von siycah im code eingabaut und muss sagen, jetzt nach 2-3 tagen bleibt die highscoretabelle endlich ohne diese merkwürdigen zusatzeinträge


    Freut mich, dass ich dir eine Hilfe war!

    Visual_Prog schrieb:

    bin selber blutiger anfänger mit php

    Gut, anfangen muss man ja irgendwo :) Da mach dir mal keinen Kopf. Wir waren alle da, wo du jetzt bist.

    Visual_Prog schrieb:

    nutzt du das in jedem php script?

    Ich nutze das einmal in meiner ​index.php, wenn ich weiß dass diverse Anfragen kommen.
    Ich bin einfach mal so frei und publiziere hier ein paar meiner Links als Beispiele.

    Wenn ich eine "einfache" Seite habe, wie meine Dokumentationsplattform: docs.simonc.eu, dann benutze ich das nicht.

    Spoiler anzeigen

    Da ist folgendes das höchste der Gefühle:

    PHP-Quellcode

    1. <?php
    2. /**
    3. * The new index page for documentation.simonc.eu
    4. */
    5. // Scan for dirs containing documentation
    6. $docsPath = dirname(__FILE__)."/docs/";
    7. $scannedDirs = scandir($docsPath);
    8. ?>
    9. <ul >
    10. <?php foreach ($scannedDirs as $dir): ?>
    11. <?php if (is_dir("$docsPath/$dir") && file_exists("$docsPath/$dir/index.html")): ?>
    12. <li class="left-menu-item" >
    13. <span class="arrow right" ></span>
    14. <a href="/docs/<?php echo basename($dir, "/"); ?>/index.html" target="_blank" >
    15. <p ><?php echo basename($dir); ?></p>
    16. </a>
    17. </li>
    18. <?php endif; ?>
    19. <?php endforeach; ?>
    20. </ul>



    Wenn ich jetzt allerdings eine Seite habe, wo ich diverse DB-Anfragen tätige, dann verwende ich den oben geschrieben Code.
    In meiner ​index.php frage ich dann die Route ab, das mache ich über meine ​.htaccess, damit jeder Path an die index.php geleitet wird:

    D.h. wenn du https://xxx.simonc.eu/bla eingibst, sieht es für den Webserver so aus: https://xxx.simonc.eu/index.php/bla

    Quellcode

    1. ​RewriteEngine On
    2. RewriteCond %{REQUEST_FILENAME} !-f
    3. RewriteCond %{REQUEST_FILENAME} !-d
    4. RewriteRule ^.*$ /index.php/$1


    Viel mehr davon kann ich hier leider nicht zeigen, weil das ein Privatkundenprojekt ist :)

    Visual_Prog schrieb:

    kannst du das evtl näher erklären ?


    Das HTTP-Protokoll bietet mehrere "Methods" an, um mit einem Webserver zu kommunizieren.
    Die Standards sind:
    • GET
    Das ist immer impliziert. Rufst du google.de auf, ist der Aufruf:

    Quellcode

    1. Host: www.google.de:443
    2. GET /


    Bei GET siehst du alle Parameter in der URL.
    xxx.zzz.de/?param=foo&param2=bar
    • POST
    ​Das verwendet man üblicherweise, wenn man Daten Daten an den Server übermitteln möchte, ohne dass es es sofort offensichtlich ist, was übertragen wird.
    Dafür setzt man dann im Protokolltext die POSTDATA-Felder.
    Überlicherweise dann wie folgt:

    Quellcode

    1. Content-Type: multipart/form-data
    2. ---boundary
    3. Content-Disposition: form-data; name="param"
    4. foo
    5. ---boundary
    6. Content-Disposition: form-data; name="param2"
    7. bar


    sinngemäß fortlaufend.

    Dann gibt's noch
    PUT, wo du als Webanwendung garantierst, dass das Verhalten immer gleich ist, wenn die Daten gleich sind
    ​DELETE, was zum Löschen von Daten verwendet wird. Auch hier garantierst du bei gleichen Daten immer das gleiche Verhalten.

    Die anderen Methoden sind für die meisten Zwecke egal :)

    Visual_Prog schrieb:

    ich hab doch gar kein GET -Request verwendet oder doch ? xD


    Siehe oben :)
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems

    Selbstständiger Softwareentwickler & IT-Techniker.

    Visual_Prog schrieb:

    nämlich was diese .htaccess eigebtlich ist?


    Die .htaccess kommt bei Apache-Webservern zum Einsatz.
    Wenn du einen einfachen Webhoster hast, ohne deinen eigenen Server dahinter, dann kommst du natürlich nicht an die Apache-Konfiguration.
    Dann ist das die einzige Möglichkeit, dem Webserver eigene Einstellungen zu geben.

    Ich verwende sie in Kombination mit der Hauptconfig, um bestimmte "Unter-Konfigurationen" zu machen, oder Ordner-spezifisch Einstellungen zu ändern.
    Beispielsweise wie oben, oder dass ich den Zugriff zu bestimmten Dateien oder Ordnern verwehre.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems

    Selbstständiger Softwareentwickler & IT-Techniker.