Zur Navigation

Probleme mit MySQL Befehl "UPDATE"

1 User 539 (Ex-Mitglied)

Hallo Jörg.
Ich habe mir eine Klasse für die Datenbank geschrieben, hier der Ausschnitt, der den nächsten Code betrifft:
    function Query ($Query)
    {
        if (($this->DataSetted == 1) AND ($this->Connected == 1))
        {
            $Sql = mysql_query($Query);
            if ($Sql == false)
                return mysql_error();
            
            return $Sql;
        }
        else return false;
    }

Nun zum eigentlichen Problem: Ich habe einen Counter erstellt, in dem der IP einige Daten, wie z.B. die Zeit, der Username und die aktuelle Seite gespeichert werden. Doch bei der Seite liegt das Problem. Hier erstmal der Code aus der CounterKlasse.
    function Count ()
    {
        global $DB;
        
        $QueryString = explode("&", $_SERVER["QUERY_STRING"]);
        foreach ($QueryString as $Variable)
        {
            $Wert = explode("=", $Variable);
            
            eval("$".$Wert[0]." = \"".$Wert[1]."\";");
        }
        
        $IP  = IP();
        $Row = $DB->Get("SELECT `zeit` FROM `counter` WHERE `ip` = '".$IP."'");
        
        if ($_SESSION["Login"])
            $Name = $_SESSION["Benutzername"];
        else
            $Name = "Gast";
        
        if ($Row["zeit"] == 0)
            $DB->Query("INSERT INTO `counter` (`zeit`, `ip`, `seite`, `tag`, `monat`, `jahr`, `name`) VALUES ('".time()."', '".$IP."', '".$Seite."', '".date("j")."', '".date("n")."', '".date("Y")."', '".$Name."')");
        else
            $DB->Query("UPDATE `counter` SET `zeit` = '".time()."', `seite` = '".$Seite."', `tag` = '".date("j")."', `monat` = '".date("n")."', `jahr` = '".date("Y")."', `name` = '".$Name."' WHERE `ip` = '".$IP."'");
    }

Alles funktioniert und wird geupdated, nur das Feld "seite" bleibt immer leer. Wenn ich dort z.B. beim "UPDATE" folgendes mache:
$DB->Query("UPDATE `counter` SET `zeit` = '".time()."', `seite` = 'Little Test', `tag` = '".date("j")."', `monat` = '".date("n")."', `jahr` = '".date("Y")."', `name` = '".$Name."' WHERE `ip` = '".$IP."'");
Dann funktioniert es.
Dann dachte ich natürlich, dass die Variable $Seite leer ist, ist sie aber nicht, weil wenn ich
echo $Seite;
eingebe, wird die Seite richtig angezeigt.
Hier ein Beispiel, wie es funktioniert:
        $QueryString = explode("&", $_SERVER["QUERY_STRING"]);
        foreach ($QueryString as $Variable)
        {
            $Wert = explode("=", $Variable);
            
            eval("$".$Wert[0]." = \"".$Wert[1]."\";");
        }
        
        echo $Seite;

Ich weiß echt nichtmehr weiter.
Das Datenbankfeld ist eine VARCHAR(255).
PHP und MySQL Version: 5

MfG, Chris

21.12.2007 21:41

2 Jörg Kruse

Hallo Chris,

Fehler sehe ich auf Anhieb keine, aber ich würde zwei Dinge überprüfen:

1. enthält $Seite vielleicht Anführungszeichen, die nicht escapet sind? Die Variable sollte vor der Query in jedem Fall entsprechend vorbehandelt sein, z.B.:
$Seite = mysql_real_escape_string($Seite);
(... auch um SQL-Injection vorzubeugen)

2. bei VARCHAR(255) sollte $Seite nicht mehr als 255 Zeichen enthalten - wobei in solch einem Fall die Eingabe eigentlich aber auch nur gekürzt würde...

21.12.2007 22:58

3 User 539 (Ex-Mitglied)

Ja, natürlich benutze ich das, auch addslashes(), das hab ich aber weggemacht zum testen.
Ich dachte erst, dass es vielleicht mit trim() geht, das tuts aber auch nicht.

MfG, Chris

22.12.2007 00:00

4 Rudy

kannst Du mal

$DB->Query("UPDATE `counter` SET `zeit` = '".time()."', `seite` = '".$Seite."', `tag` = '".date("j")."', `monat` = '".date("n")."', `jahr` = '".date("Y")."', `name` = '".$Name."' WHERE `ip` = '".$IP."'");
durch

die("UPDATE `counter` SET `zeit` = '".time()."', `seite` = '".$Seite."', `tag` = '".date("j")."', `monat` = '".date("n")."', `jahr` = '".date("Y")."', `name` = '".$Name."' WHERE `ip` = '".$IP."'");
ersetzen und die Query posten?

22.12.2007 00:07

5 User 539 (Ex-Mitglied)

Komisch o_O

UPDATE `counter` SET `zeit` = '1198280597', `seite` = 'Registrieren', `tag` = '22', `monat` = '12', `jahr` = '2007', `name` = 'Gast' WHERE `ip` = '84.129.XX.XXX'

Hatte auch Registrieren.html (via ModRewrite) aufgerufen.
Das geht anscheinend.

MfG, Chris

22.12.2007 00:44

6 Jörg Kruse

Hatte auch Registrieren.html (via ModRewrite) aufgerufen.
Das geht anscheinend.

Das sollte keinen Unterschied machen - es sei denn, dein Browser holt die (defekte) Seite aus dem Browser-Cache - den würde ich probehalber mal leeren

22.12.2007 13:16

7 User 539 (Ex-Mitglied)

Tut er nicht.
Habs mit Opera, Firefox und IE 6+7 probiert, es will einfach nicht!

MfG, Chris

27.12.2007 00:50

8 Jörg Kruse

Aber unter Registrieren.html wird der Wert eingetragen?

Wie schaut denn die entsprechende Modrewrite Regel aus, die diese URL erzeugt und wie die Original-URL, mit der der Eintrag nicht funktioniert? Gibt es in der .htaccess vieleicht noch eine Rule, die den Query String killt?

27.12.2007 01:17

9 User 539 (Ex-Mitglied)

Hi.
Sorry für die verspätete Antwort!

.htaccess
RewriteEngine On
RewriteRule ^(.*).html/(.*)/(.*)/(.*)/(.*)$ index.php?Seite=$1&Variable1=$2&Variable2=$3&Variable3=$4&Variable4=$5
RewriteRule ^(.*).html/(.*)/(.*)/(.*)$ index.php?Seite=$1&Variable1=$2&Variable2=$3&Variable3=$4
RewriteRule ^(.*).html/(.*)/(.*)$ index.php?Seite=$1&Variable1=$2&Variable2=$3
RewriteRule ^(.*).html/(.*)$ index.php?Seite=$1&Variable1=$2
RewriteRule ^(.*).html$ index.php?Seite=$1

php_flag register_globals off
php_flag session.use_trans_sid 0

Das mit dem QueryString habe ich komplett entfernt, da gibt es einfach zuviele Sicherheitseinbußen.

MfG,
Chris

13.01.2008 01:44 | geändert: 13.01.2008 01:45

10 Jörg Kruse

Hallo Chris,

ich kann da keine Rule erkennen, die den Query String abhängt.

Die Variante registrieren.html funktioniert jetzt aber?

13.01.2008 02:25