Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

19.12.2014, 12:34

JavaScript: Variable ändern funktioniert nicht

Ich habe folgendes Script:

Quellcode

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
function register() {
    var name = $('input[name=register_name]').val();
    var succesfull = true;
    
    
    $('input[name=register_name]').removeClass("InputValidation");
    $('#register_name_validation').html("");
    
    name = name.replace(/\s/g, '');
    if(name.length >= 5) {
        $.post("testname.php", {name: name},
            function(data) {
                if(data == "false") {
                    $('input[name=register_name]').addClass("InputValidation");
                    $('#register_name_validation').html("Name ist schon vergeben");
                    $('#register_name_validation').addClass("TextValidation");
                    succesfull = false;
                }
            }
        );
    } else {
        $('input[name=register_name]').addClass("InputValidation");
        $('#register_name_validation').html("Der Name ist zu kurz");
        $('#register_name_validation').addClass("TextValidation");
        succesfull = false;
    }
}


Ich überprüfe zuerst ob der Name lang genug ist. Wenn ja überprüfe ich ob er bereits existiert. Wenn er nicht lange genug ist wird succesfull auf falsch gesetzt und die Elemente werden verändert. Existiert der Name bereits, werden die Elemente verändert, aber die Variable succesfull wird nicht auf falsche gesetzt. Warum klappt das nicht und was muss ich anders machen?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

19.12.2014, 13:27

Ich nehme mal an succesfull wird noch irgendwo im Code verwendet? Könnten wir den und das PHP Script mal sehen?
Hast du dir mal die Rückgabe des PHP Scripts ausgeben lassen?
Ansonsten kann ich zumindest nicht sagen ob es Fehler bei den jquery Aufrufen gibt, lass die vielleicht mal weg und teste noch mal.

3

19.12.2014, 13:36

Das wäre der PHP-Code von testname.php:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    include("sql_connect.php");
    
    $name = md5($_POST['name']);
    
    $task = "SELECT * FROM user WHERE name = '$name'";
    $result = mysql_query($task);
    if($row = mysql_fetch_object($result)) {
        echo 'false';
    } else {
        echo 'true';
    }
?>

Eigentlich klappt alles, bis auf das Variablen ändern. Könnte es daran liegen dass ich in der Funktion bei $.post nicht auf die Variable zugreifen kann? Und wenn ja, wie kann ich das Umgehen?

4

19.12.2014, 17:30

Mir fallen da in erster Linie 2 Dinge auf, zum einen prüfst du nur auf Clientseite mit JS die Länge. Diese Prüfung kann also ohne Probleme umgehen.
2. Setzt du auf die veralteten mysql_* Funktionen, hier solltest du auf mysqi_ oder PDO umsteigen. (Es geht hier nicht um die Datenbank, sondern nur um die Anbindung)

Um deinem Fehler näher zu kommen könntest du auf PHP-Seite mal das error_reporting auf E_ALL setzen und in JS dir mal mit alert() die relevanten Variablen anschauen.

PS: Wie sieht das Skript aus, das register() aufruft?
Kann es sein, dass du hier im Sichtbarkeitsbereich der Variablen das Problem hast?

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

19.12.2014, 18:02

Als Tipp: Soweit möglich immer einfache Anführungszeichen verwenden, also bspw.

Quellcode

1
$task = 'SELECT * FROM user WHERE name = \'' . $name . '\'';

Bei doppelten Anführungszeichen führt PHP noch einen Scan durch, ob darin Variablen vorkommen (wie es eben bei dir auch der Fall ist). Dies ist meistens jedoch nicht nötig und kostet unnötig Zeit. Außerdem ist eine Konkatenation mittels des Punkt Operators schon allein aus Gründen der Übersicht vorzuziehen. Zu PDO anstelle der alten mysql_* Funktionen wurde ja schon etwas gesagt. Damit kannst du obigen Query auch noch etwas schöner/sicherer schreiben:

Quellcode

1
2
3
$dbh = new PDO(...);
$stmt = $dbh->prepare('SELECT * FROM user WHERE name = ?');
$result = $stmt->execute([$name]);

Dadurch wird auch ein indirekter escape der input Daten vollzogen.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

19.12.2014, 19:13

Könnte es daran liegen dass ich in der Funktion bei $.post nicht auf die Variable zugreifen kann?

Mach doch mal ein console.log(data); in die callback Funktion und guck was in der Konsole steht (F12 unter FF und Chrome).
Und alert() würde ich nicht nutzen, ist irgendwann nervig wenn man öfter so testet :D

LInsoDeTeh

Treue Seele

Beiträge: 372

Wohnort: Essen, Deutschland

Beruf: Team Lead Inhouse-Entwicklung

  • Private Nachricht senden

7

20.12.2014, 12:04

Ich denke, es liegt daran, dass die Variable successful in der Register() Funktion deklariert wurde und dann mit einer anonymen Funktion im Callback gearbeitet wird. Könnte mir vorstellen, dass die die Variable daher nicht kennt. Versuch doch mal die successful Variable global zu definieren, also außerhalb der Register() Funktion, und schau, ob die Zuweisung dann funktioniert.

8

20.12.2014, 12:34

Toboxos
Verwendest du kein Firebug oder ähnliche Entwicklertools?
Da genügt meistens ein Blick!
Insbesondere auf die Post-Variablen und die Rückgabe des PHP-Scripts...
fka tm

9

20.12.2014, 15:06

Die zentrale Frage, die auch schon in DeKugelschiebers Antwort mitschwingt, ist, ob du succesfull innerhalb von register weiter verwendest. $.post ist asynchron. Dein Callback wird sehr wahrscheinlich erst ausgeführt, nachdem register schon komplett abgearbeitet wurde.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

10

28.12.2014, 11:39

Wie kann ich das verhindern, dass dies asynchron ausgeführt wird?

Werbeanzeige