[PHP] .htaccess überschreibt Variabel beim MySQL-Insert!

Eagle-PsyX-

Commander
Registriert
Juni 2006
Beiträge
2.091
Hi,

ich habe ein sehr merkwürdiges Probleme bei meinem "User-Online-Script".
Und zwar klappt es an sich, doch ich will auch den "Query_String" des jeweiligen Besuchers (bzw. später nur bei Admins) updaten.

Nun das bizarre Problem, in meiner Funktion wird die Query richtig ausgegeben:
PHP:
if($row['Anzahl']) {#Updaten
        echo $Adresse;
        $sql = "UPDATE
                    $DB
                SET
                    `Time` = '$Time', 
                    `Adresse` = '$Adresse'";

        $sql .= " WHERE
                    IP = '$IP'";
        mysql_query($sql) OR die(mysql_error());
    }
also in der zweiten Zeile.
Im Moment zum Beispiel: "site=content&cat=Neuigkeiten&show=last".
Doch in der SQL-Datenbank wird steht dann folgendes: "site=error&error=404".

Nun die Ausgabe funktioniert, paar unrelevante Zeilen später habe ich ein andere Query in der Datenbank?!

Das Komische ist, wenn ich in ".htaccess":
Code:

Code:
ErrorDocument 404 /OA/index.html?site=error&error=404

lösche funktioniert es alles perfekt.

Inwiefern kann die .htaccess direkt eine Variable in PHP/MySQL beeinflußen ?
Hat jemand eine Idee oder ein Lösungsvorschlag?

MfG
Eagle
 
Solange du nicht den kompletten Code postest, können wir hier nur herumraten.
 
Es handelt sich um ein komplettes CMS.

Aber nagut, ich schneide mal alle relevante Fakten Zusammen:
PHP:
$Config["Query"]			=	rawurldecode($_SERVER['QUERY_STRING']);	//URL-Query
#...#
function user_online ($DB,$IP,$Query,$Time) {
$Adresse = mysql_real_escape_string($Query);
    $sql = "SELECT
                COUNT(*) as Anzahl
            FROM
                $DB
            WHERE
                IP = '$IP'";
    $result = mysql_query($sql) OR die(mysql_error());
    $row = mysql_fetch_assoc($result);
    if($row['Anzahl']) {#Updaten
        $sql = "UPDATE
                    $DB
                SET
                    `Time` = '$Time', 
					`Adresse` = '$Adresse'";
	if(Logged AND isset($_SESSION["ID"])) {
		$sql .= ", `ID` = '".$_SESSION["ID"]."'";
	} else {
		$sql .= ", `ID` = NULL";
	}
        $sql .= " WHERE
                    IP = '$IP'";
        mysql_query($sql) OR die(mysql_error());
    } else {	#Eintragen
        $sql = "INSERT INTO $DB
                    (IP, Time, Adresse, ID)
                VALUES
                    ('$IP', $Time, '$Adresse', ";
	if(Logged AND isset($_SESSION["ID"])) {
		$sql .= "'".$_SESSION["ID"]."'";
	} else {
		$sql .= "NULL";
	}
		$sql .= ")";
        mysql_query($sql) OR die(mysql_error());
    }
	#Löschen
    $sql = "DELETE FROM
                $DB
            WHERE
                DATE_SUB($Time, INTERVAL 5 MINUTE) > Time";
    mysql_query($sql) OR die(mysql_error());

	#Zählen
    $sql = "SELECT
                COUNT(*) as Anzahl
            FROM
                $DB";
    $result = mysql_query($sql) OR die(mysql_error());
    $row = mysql_fetch_assoc($result);

$result = $row['Anzahl'];
return $result;
}
#...#
$Status["User_online"] = user_online($DataBase["User_online"],$Config["IP"],$Config["Query"],$Config["TimeStamp"]);

Das komische ist, dass wenn ich die Query in der Funktion mehrmals ausgebe, danach und davor stimmt sie! Aber in der MySQL Datenbank kommt sie einfach ANDERS an. Und zwar so wie es in der .htaccess steht. Habe die besagte Zeile in .htaccess gerade 'als Kommentar' defeniert, und es klappt alles perfekt...

Es kann daher eigentlich gar kein PHP-Fehler sein, sondern irgendwie einer in der "Übertragung" zwischen PHP und MySQL. Auch wenn ich die Variabel gleich nach dem Header ausgebe und als letzten Text nach allem, stimmt sie immer :-((
 
Zuletzt bearbeitet:
Wird denn der Update oder der Insertbefehl ausgeführt? Wäre es möglich, dass dein Browser (z.B. in einem Frame) unbewusst tatsächlich eine nichtexistente Adresse aufruft und es daher die richtige Adresse überschreibt?
 
Hi BerniG,

ja der Befehl wird ausgeführt, nur wird anstatt der richtigen Variabel "site=error&error=404" gespeichert. IP/ID und ein Zeitstempel werden richtig gespeichert, ledeglich die Adresse nicht.
Insofern ist es ja unlogisch dass ein Frame geöffnet wird, vorallem weil es von EINER Zeile in .htaccess abhängig ist. Aber nein, der Browser öffnet explezit keine Frame oder führt keine PHP-Header-Weiterleitung durch.

Das letzte mal als ich so ein kuriösen Probleme hatte, dabei hat PHP korrupte ZIP-Dateien erstellt ab einer gewissen Größe, wurde das Problem das in PHP 5.2.8 war, in 5.2.9 behoben.
Kann es wirklich sein dass ich schon wieder in ein PHP-Bug gefallen bin?

Ich werde morgen den Fehler einmal isolieren, also unabhängig vom CMS und euch präsentieren.
 
Zuletzt bearbeitet: (hab falsche PHP Version angegeben)
Eagle-PsyX- schrieb:
Ich werde morgen den Fehler einmal isolieren, also unabhängig vom CMS und euch präsentieren.


Ja, das wollte ich auch gerade vorschlagen, denn sehen wir ja, ob wir den Fehler reproduzieren können.
 
Sehr interessant, anscheinend liegt der Fehler irgendwo an meinem komplexem CMS.

Also das funktioniert wieder:
PHP:
<?php

## Datenbank: test; Tabelle: IP (Varchar{15}); Time (INT(13)); Adresse (TEXT); ID(INT{255}) ##
$MySQL["Connection"] = @mysql_connect("localhost","-","-") or die ();
$MySQL["Database"] = @mysql_select_db("-") or die (); 
mysql_query('SET NAMES utf8');
mysql_query("SET CHARACTER SET utf8");

$Config["Query"] = rawurldecode($_SERVER['QUERY_STRING']);

$Status["User_online"] = user_online("test",$_SERVER['REMOTE_ADDR'],$Config["Query"],gmmktime());

echo $Config["Query"]."<br />";
echo $Status["User_online"];

function user_online ($DB,$IP,$Query,$Time) {
$Adresse = mysql_real_escape_string($Query);
    $sql = "SELECT
                COUNT(*) as Anzahl
            FROM
                $DB
            WHERE
                IP = '$IP'";
    $result = mysql_query($sql) OR die(mysql_error());
    $row = mysql_fetch_assoc($result);
    if($row['Anzahl']) {#Updaten
        $sql = "UPDATE
                    $DB
                SET
                    `Time` = '$Time', 
					`Adresse` = '$Adresse'";
	if(Logged AND isset($_SESSION["ID"])) {
		$sql .= ", `ID` = '".$_SESSION["ID"]."'";
	} else {
		$sql .= ", `ID` = NULL";
	}
        $sql .= " WHERE
                    IP = '$IP'";
        mysql_query($sql) OR die(mysql_error());
    } else {	#Eintragen
        $sql = "INSERT INTO $DB
                    (IP, Time, Adresse, ID)
                VALUES
                    ('$IP', $Time, '$Adresse', ";
	if(Logged AND isset($_SESSION["ID"])) {
		$sql .= "'".$_SESSION["ID"]."'";
	} else {
		$sql .= "NULL";
	}
		$sql .= ")";
        mysql_query($sql) OR die(mysql_error());
    }
	#Löschen
    $sql = "DELETE FROM
                $DB
            WHERE
                DATE_SUB($Time, INTERVAL 5 MINUTE) > Time";
    mysql_query($sql) OR die(mysql_error());

	#Zählen
    $sql = "SELECT
                COUNT(*) as Anzahl
            FROM
                $DB";
    $result = mysql_query($sql) OR die(mysql_error());
    $row = mysql_fetch_assoc($result);

$result = $row['Anzahl'];
return $result;
}

@mysql_close($MySQL["Connection"]) or die ();

?>
.htaccess
Code:
ErrorDocument 404 /OA/index.html?site=error&error=404

Edit: Also so langsam kann ich den Fehler hier in meinem CMS isolieren :D Ich poste den dafür verantwortlichen Code wenn ich ihn finde.
Edit #2: Hab den Fehler gefunden :-/
Okay, hab doch eine externe Abfrage, mehr oder weniger:
PHP:
if($Config["Stats"]["Status"])	{
echo '
<script type="text/javascript" src="'.$Config["Stats"]["Path"].'track.php?mode=js"></script>
<noscript><img src="'.$Config["Stats"]["Path"].'track_noscript.php" border="0" alt="" width="1" height="1" /></noscript>';
}

Der Pfad war falsch für die Statistik, dennoch merkwürdig, dass die Query erst beim Insert-Befehl falsch ist :-/
Ergänzung ()

Irengdwie scheint es doch nicht ganz gelöst zu sein, jetzt ging es auf einigen Seiten, aber nicht auf allen.

Code:
<link rel="stylesheet" type="text/css" media="screen" href="Template/<?php echo $Config["Style"]; ?>/Style.css" />
Dadran liegt es! Obwohl der Pfad stimmt?!
 
Zuletzt bearbeitet:
Dachte ich auch, habs probiert und hatte kein Style mehr :)
Edit: Aber dann ist der Fehler weg?!

Es ist komisch, es funktioniert jetzt so bei allen Inhalten die nicht direkt im CMS drine sind, d.h. Administration etc., da wird die Query richtig dargestellt.
Dummerweise besteht meine CMS aus 6 PHP Dateien die ingesammt 19 KiB reinen Text umfassen, >450 Zeilen :-(

Edit #2: Wenn ich die Datei aus der CMS *leere*, die den Inhalt ausgibt funktioniert es. Interessant, und noch eine Runde 30 Minuten isolieren spielen.. :D

Sind beide Zeilen weg, funktioniert es perfekt.
Ist nur eine Zeile weg (egal welche), bringt es nichts.
PHP:
echo $CMS["Content"];
echo '<div class="onlyprint">Gedruckt auf : '.$Config["Server"].'index.php?'.htmlspecialchars($Config["Query"]).'</div>';
Hier wird auch nur nochmal die Query ausgeben, aber ja nicht mal als Link.
 

Anhänge

  • screen.jpg
    screen.jpg
    100,8 KB · Aufrufe: 145
  • screen2.jpg
    screen2.jpg
    47,4 KB · Aufrufe: 180
Zuletzt bearbeitet:
Du hast irgendwo eine Verlinkung drinnen, die einen 404 erzeugt.


Da hilft nur einzelnes zerlegen, Live HTTP Headers einschalten und gleichzeitig ein tail -f auf die apache logs richten.
 
Könntest du mir verraten wie ich das "tail -f" auf die Apache Logs (ein)richte?^^ Oder einen Link zeigen?

Ein 404-Link könnte es nur in Form eines Strings, oder ein falscher HTML-Link sein[was ja auch noch ein String wäre], das dürfte doch aber gar nicht so zur Last fallen?

Edit: Ok habe mir Firebug festgestellt, das in Hintergrundbild im Stylesheet falsch verlinkt war, hab es korregiert, aber der Bug ist immer noch nicht weg (evtl. liegts noch im Cache).

Edit #2: Es lag wirklich am Cache. Es scheint jetzt alles perfekt zu klappen, nur ein kleines Hintergrundbild war im Stylesheet falsch verlinkt. Kann mir aber jemand erklären wieso die Query von einer PHP-Datei nur(!) bei Insert-Befehl für MySQL-Datenbanken *verfälscht* wird wegen eines Stylesheets?

Ich möchte mich noch bei euch bedanken, dir mir hier zur Rat standen, trotz des bizzaren/kuriösen/skurillen Fehler :D
 
Zuletzt bearbeitet: (-Fertig-)
Du kannst die Apache Logs auch einfach normal anschauen (z.B. in Notepad++). An den Request musst du dann ja sehen wodurch der 404 generiert wird (schalte die 404 Umleitung kurz ab, um das zu testen).
 
Hab ich schon längst gemacht ;-) So hab ich nur bestätigt bekommen dass NUR eine Datei 404 Status hatte.

PS: Ich benutze seit Jahre nur Notepad++ (ah übrigens, bin ich der einzige der 5.4.3 benutzt und das Programm manchmal einfriert)?
 
Zuletzt bearbeitet:
Ich benutze 5.4.4 und da friert eigentlich nichts ein (hab iirc direkt von 5.4.2 geupdated).
 
Eagle-PsyX- schrieb:
Kann mir aber jemand erklären wieso die Query von einer PHP-Datei nur(!) bei Insert-Befehl für MySQL-Datenbanken *verfälscht* wird wegen eines Stylesheets?
Die Query selbst wird überhaupt nicht verfälscht.
Dein Browser ruft die normale HTML-Seite auf => Insert in die DB ist korrekt
x Millisekunden später:
Dein Browser ruft die fehlerhafte Seite auf. Das Ganze wird über die htaccess umgeleitet und läuft anschließend ebenfalls über dein PHP-Script. Auch hier wird der Insert korrekt gemacht nur ist es hier eben die 404-URL! Der paar Millisekunden alte Eintrag von vorher wird damit überschrieben.
 
Ahso intressant, dann war das keine Einbildung dass ich für ein Augenblick den richtigen URL gesehen habe und als die Seite fertiggeladen war plötzlich wieder der 404-URL da steht.
 
Zurück
Oben