ubuntuusers.de

Ajax-Script verhalten auf verschiedenen Servern unterschiedlich!?

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Ximion

Avatar von Ximion

Anmeldungsdatum:
25. November 2007

Beiträge: 1066

Wohnort: Bonn

Hallo!
Ich habe ein Riesiges Problem: Ich habe eine Ajax-Anwendung erstellt, welche folgendes Script verwendet, um Einträge in ein Gästebuch einzutragen:

  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
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
function ajax(method,strURL,variable,value,sid) {
    var xmlHttpReq = false;
    var self = this;
	

    // Mozilla/Safari
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    self.xmlHttpReq.open(method, strURL, true);
    self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	
    self.xmlHttpReq.onreadystatechange = function() {
		
	if(value == 'signgb' ){
	document.signgb.signbutton.disabled = true;
	document.getElementById('signdiv').innerHTML = '<center><img src="../images/gbook/loading.gif"><br><br><b>'+loadtext+'...</b><br></center>';
			
	}else{
	document.getElementById('entries').innerHTML = '<center><br><br><br><br><img src="../images/gbook/loading.gif"><br><br><b>'+loadtext+'...</b><br><br><br></center>';
	}
	
       if (self.xmlHttpReq.readyState == 4) {
			if(value == 'signgb' ){
			updatepage(self.xmlHttpReq.responseText,'signgb');
			}else{
            updatepage(self.xmlHttpReq.responseText,'page');
			}
	   }
        
    }
	
	if (value == 'signgb'){
	name=document.signgb.name.value;
	email=document.signgb.email.value;
	homepage=document.signgb.homepage.value;
	message=document.signgb.message.value;
	
	//Fix the "&" bug
	name2 = name.replace(/&/g, "^amp^");
	message2 = message.replace(/&/g, "^amp^");
	
	self.xmlHttpReq.send('dosign=' + pcode.charAt(0) + pcode.charAt(2) + pcode.charAt(4) + pcode.charAt(1) + pcode.charAt(5) + '&name=' + name2 + '&email=' + escape(email) + '&homepage=' + escape(homepage) + '&message=' + message2);
	}else{
    self.xmlHttpReq.send(escape(variable) + '=' + escape(value));
	}
	
}



function updatepage(str, value){
	
	//if (self.xmlHttpReq.readyState == 4) {
	if (value == 'signgb'){
    document.getElementById("signdiv").innerHTML = str;
	showdiv('signdiv');
	document.signgb.signbutton.disabled = false;
	
	//Thanks to Hiric for the fix
	if (str.length <= 2) {  
		//Create cookie
		var date = new Date();
		date.setTime(date.getTime()+(c_minute*60*1000));
		var expires = "; expires="+date.toGMTString();
		document.cookie = "signed=yes"+expires+"; path=/";

		
        hidediv('signform'); 
        ajax('POST','gb_view.php','page','1'); 
      } 
	echo("DEBUG_1");
	}else{
	echo("DEBUG_2");
	document.getElementById("entries").innerHTML = str;
	showdiv('entries');
	}
	//}
}

function hidediv(id) {
	//safe function to hide an element with a specified id
	if (document.getElementById) { // DOM3 = IE5, NS6
		document.getElementById(id).style.display = 'none';
	}
	else {
		if (document.layers) { // Netscape 4
			document.id.display = 'none';
		}
		else { // IE 4
			document.all.id.style.display = 'none';
		}
	}
	if(id == 'signform'){
	showdiv('entries');
	hidediv('signdiv');
	}
}

function showdiv(id) {
	//safe function to show an element with a specified id
		  
	if (document.getElementById) { // DOM3 = IE5, NS6
		document.getElementById(id).style.display = 'block';
	}
	else {
		if (document.layers) { // Netscape 4
			document.id.display = 'block';
		}
		else { // IE 4
			document.all.id.style.display = 'block';
		}
	}
	if(id == 'signform')
	hidediv('entries');
}
  function smiley(s){
  document.signgb.message.value = document.signgb.message.value + s;
  document.signgb.message.focus();
}

function newwindow(source,name,width,height) 
{ 
window.open(source,name,'width='+width+',height='+height+',resizable=no'); 
} 

Der Code ist nicht original von mir, sondern (peinlich...) ein Produkt von Copy&Paste. Auf meinem Webserver wird nach dem Anzeigen der "Ins Gästebuch eintragen"-Seite und Erstellen eines Eintrags, korrekt zum Gästebuch zurückgeleitet. (onClick: "javascript:ajax('POST','gb_sign.php','action','signgb');")
Die Seite soll jetzt aber auf einem anderen Server laufen, auf den ich keinen direkten zugriff habe. Dort versagt die Weiterleitung, der Gästebucheintrag wird zwar erstellt, dann aber nicht zum GB zurückgeleitet.
Hat wer eine Idee, warum das so ist? Was muss an der Webserver-Konfiguration geändert werden? Oder was ist an dem Script falsch?

DiBo33

Anmeldungsdatum:
16. Juni 2006

Beiträge: 1827

Wenn der Eintrag richtig erfolgt, dann ist der evtl. Fehler nicht im clientseitigem Script zu suchen, sondern im serverseitigem (sprich deiner php-Datei).

Ximion

(Themenstarter)
Avatar von Ximion

Anmeldungsdatum:
25. November 2007

Beiträge: 1066

Wohnort: Bonn

Ich tippe inzwischen drauf, dass die .htaccess-Datei der Joomla!-Installation im verzeichnis darunter das Problem verursacht...
Der relevante PHP-Teil ist IMO fehlerlos:

 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<div id="signform" style="display:none;">
		<font size="1"><? echo $la17; ?>.</font>
		<br>

		<form name="signgb">
		<table border="0" cellpadding="0" cellspacing="2" width="100%" id="table1">
		<tr>
		<td valign="top"><? echo $la11; ?>: *</td>
		<td valign="top"><input type="text" name="name" size="30"></td>
		</tr>
		<tr>
		<td valign="top"><? echo $la12; ?>:</td>
		<td valign="top"><input type="text" name="email" size="30"></td>
		</tr>
		<tr>
		<td valign="top"><? echo $la13; ?>:</td>
		<td valign="top"><input type="text" name="homepage" size="30" value="http://"></td>
		</tr>
		<tr>
		<td valign="top"><? echo $la14; ?>: *</td>
		<td valign="top"><textarea rows="5" name="message" cols="35"></textarea><br>
		  <a href="javascript:smiley(' :p ');"><img src="../images/gbook/s1.gif" alt=":p" border="0"></a>
		  <a href="javascript:smiley(' :) ');"><img src="../images/gbook/s2.gif" alt=":)" border="0"></a>
		  <a href="javascript:smiley(' :a ');"><img src="../images/gbook/s3.gif" alt=":a" border="0"></a>
		  <a href="javascript:smiley(' :o ');"><img src="../images/gbook/s4.gif" alt=":o" border="0"></a>
		  <a href="javascript:smiley(' :s ');"><img src="../images/gbook/s5.gif" alt=":s" border="0"></a>
		  <a href="javascript:smiley(' :r ');"><img src="../images/gbook/s6.gif" alt=":r" border="0"></a>
		  <a href="javascript:smiley(' :v ');"><img src="../images/gbook/s7.gif" alt=":v" border="0"></a>
		  <a href="javascript:smiley(' :h ');"><img src="../images/gbook/s8.gif" alt=":h" border="0"></a>
		  <a href="javascript:smiley(' ;) ');"><img src="../images/gbook/s9.gif" alt=";)" border="0"></a>
		  <a href="javascript:smiley(' :m ');"><img src="../images/gbook/s10.gif" alt=":m" border="0"></a>
		</td>
		</tr>
		<tr>
		<td valign="top">&nbsp;</td>
		<td valign="top">&nbsp;</td>
		</tr>
		<tr>
		<td valign="top">&nbsp;</td>
		<td valign="top"><input type="button" value="<? echo $la18; ?>" name="signbutton" onClick="javascript:ajax('POST','gb_sign.php','action','signgb');"> <input type="reset" value="<? echo $la19; ?>" name="B2"> <input type="button" value="<? echo $la20; ?>" name="" onClick="javascript:hidediv('signform');"></td>
		</tr>
		</table>
		</form>

		<br><div id="signdiv">
		</div>

		<br>	

		</div> <!-- end hiddend sign form -->

		<div id="entries"> 
		</div>

		<script language="Javascript" type="text/javascript">
		var pcode = '<? echo $pcode; ?>';
		ajax('POST','gb_view.php','page','1','<? echo $token; ?>');
		</script>

DiBo33

Anmeldungsdatum:
16. Juni 2006

Beiträge: 1827

Ich tippe eher auf die gb_sign.php oder wo soll die Weiterleitung stattfinden?

Ximion

(Themenstarter)
Avatar von Ximion

Anmeldungsdatum:
25. November 2007

Beiträge: 1066

Wohnort: Bonn

Die gb_sign trägt nur den Inhalt ein... Woran liegt es denn typischerweise, dass ein Script auf dem einen Server läuft und auf dem Anderen nicht?
Ich tippe inzwischen auf die .htaccess-Datei in der Joomla!-Installation im verzeichnis darüber, dass die eventuell das Verhalten beeinflusst.
Wie kann ich die .htaccess-Einstellungen des vorigen Verzeichnisses rückgängig machen?

DiBo33

Anmeldungsdatum:
16. Juni 2006

Beiträge: 1827

Wie kann ich die .htaccess-Einstellungen des vorigen Verzeichnisses rückgängig machen?

Indem du eine weitere .htaccess im eigentlichen Verzeichnis erstellt welche die Optionen ändert.

Aber du sprichst die ganze Zeit davon das die .htaccess von Jomla in einem Verzeichnis unterhalb deines Scripts liegt, somit hat diese doch gar keinen Einfluss.

Woran liegt es denn typischerweise, dass ein Script auf dem einen Server läuft und auf dem Anderen nicht?

An der manigfaltigen Einstellung der Server, Stichpunkte:

* register_globals
* short_open_tags
* output_buffer
ebenso Versionsunterschiede von PHP.

Ximion

(Themenstarter)
Avatar von Ximion

Anmeldungsdatum:
25. November 2007

Beiträge: 1066

Wohnort: Bonn

DiBo33 schrieb:

Aber du sprichst die ganze Zeit davon das die .htaccess von Jomla in einem Verzeichnis unterhalb deines Scripts liegt, somit hat diese doch gar keinen Einfluss.

Ich meinte darüber ^^

Übermorgen habe ich wieder die Chance, auf den Server zuzugreifen, mal sehen, ob ich was finde.

Ximion

(Themenstarter)
Avatar von Ximion

Anmeldungsdatum:
25. November 2007

Beiträge: 1066

Wohnort: Bonn

Liegt definitiv nicht an der Htaccess. Das Gästebuch basiert auf dem hnGuestbook ⮷ , was ich leicht verändert habe. Eigentlich dachte ich, ich wäre schuld und irgend eine meiner Abänderungen würde zu dem Verhalten führen, ist aber nicht so.
Selbst das originale Script zeigt das gleiche Verhalten.

DiBo33

Anmeldungsdatum:
16. Juni 2006

Beiträge: 1827

Aaarg, da rollen sich ja die Fußnägel hoch.

Entferne in jeder php-Datei das letzte ?>

Ximion

(Themenstarter)
Avatar von Ximion

Anmeldungsdatum:
25. November 2007

Beiträge: 1066

Wohnort: Bonn

Echt? Ich bin kein PHP-Entwickler, die paar Brocken, die ich kann sinn Trial-and-Error Produkte. Schließt das ?> nicht einen <?php - Block? Soll das wirklich aus allen Dateien raus, auch wenn am Ende noch etwas HTML-Code kommt? Und kann das echt die Ursache für das problem sein?
(Fragen über Fragen 😀 )

DiBo33

Anmeldungsdatum:
16. Juni 2006

Beiträge: 1827

Schließt das ?> nicht einen <?php - Block?

Ja, das letzte ist allerdings optional und es wird von php.net sogar geraten das letzte ?> weg zu lassen

Soll das wirklich aus allen Dateien raus, auch wenn am Ende noch etwas HTML-Code kommt?

Nein, wenn danach noch HTML-Code kommt dann nicht, aber ich habe jetzt keine Datei gesehen in der das der Fall war. Insbesondere in den Dateien gb_config.php, gb_english.php und gb_sign.php musst du diese entfernen.

Und kann das echt die Ursache für das problem sein?

Das ist die Ursache

	//Thanks to Hiric for the fix
	if (str.length <= 2) {  

Dadurch das in einigen Dateien nach dem letzten ?> noch Zeilenumbrüche vorhanden sind ist die Länge von str größer als 2.

Edit: Gerade nochmal gesehen, in den Admin-Dateien sind danach noch HTML-Ausgaben, also nur die drei o.g. ändern.

Ximion

(Themenstarter)
Avatar von Ximion

Anmeldungsdatum:
25. November 2007

Beiträge: 1066

Wohnort: Bonn

Vielen Dank! Darauf muss man erstmal kommen! Ich probiere das morgan mal aus!
Nochmal danke für deine Mühe! (Auf diese Ursache wäre ich niemals gekommen 😬)
Eine Frage aber hätte ich noch: Warum war das Verhalten des Scriptes bzw. die Länge des Strings auf verschiedenen Servern unterschiedlich?

DiBo33

Anmeldungsdatum:
16. Juni 2006

Beiträge: 1827

Unterschiedliche Einstellungen des output_buffering und/oder unterschiedlich Zeilenende.

Ximion

(Themenstarter)
Avatar von Ximion

Anmeldungsdatum:
25. November 2007

Beiträge: 1066

Wohnort: Bonn

👍 Super! Läuft alles! Vielen, vielen Dank!

ryiden

Avatar von ryiden

Anmeldungsdatum:
2. Juni 2006

Beiträge: 826

Wohnort: Mos Eisley

Zusätzlich noch eine kleine Anmerkung, Du solltest Deinen Code öfters durch JSLint (http://www.jslint.com/) prüfen lassen. JavaScript-Fehler führen meist zu unterschiedlichem Verhalten auf unterschiedlichen Browsern. Hier ein Auszug der Fehler, die JSLint bei Deinem Skript festgestellt hat:

Problem at line 35 character 6: Missing semicolon.

}

Problem at line 56 character 20: 'updatepage' was used before it was defined.

function updatepage(str, value){

Problem at line 85 character 17: 'hidediv' was used before it was defined.

function hidediv(id) {

Problem at line 104 character 17: 'showdiv' was used before it was defined.

function showdiv(id) {

Problem at line 119 character 5: Expected '{' and instead saw 'hidediv'.

hidediv('entries');
Antworten |