2009-05-08 2 views
1

Ich benutze die JQuery .ajax-Methode, um die Ergebnisse einer einfachen PHP-Abfrage in XML (die ich in diesem Projekt mehrmals ohne Problem). Das XML-Ergebnis, das ich in meinem Hauptprojekt erhalte, unterscheidet sich jedoch von dem, was ich erwarte (wie durch einfaches Betrachten der PHP-Datei getestet), wenn ich die Ergebnisse in der Firebug-Konsole anschaue. Ich habe das auch wieder getestet, indem ich eine neue PHP-Datei erstellt habe, deren einzige Funktion es ist, den Ajax-Aufruf auszuführen, und die Ergebnisse sind wie erwartet korrekt.Verschiedene AJAX XML-Ergebnisse aus derselben PHP-Datei mit denselben POST-Parametern unter Verwendung von JQuery

[Update]: Ich habe es gerade wieder getestet, und ich habe die korrekten Ergebnisse von meinem Projekt erhalten, aber wenn ich die Seite aktualisiere, bekomme ich wieder die falschen Ergebnisse.

Aus Gründen der Tests vereinfacht ich den Prozess durch alle POST-Daten zu entfernen und den Erfolg Callback-Funktion, aber ich habe noch andere Ergebnisse ..

Hier sind die Code-Schnipsel:

Die Ajax JQuery nennen (verwendet sowohl in der Testdatei und in meinem Projekt ist):

$.ajax({ 
     url:"./lib/ajax_friends.php", 
     type:"POST", 
    // data:{action : "getFriends", userID: userID} , 
     dataType: 'xml', 
     sync:false, 
     error:function(request){alert("error")}, 
     success:function(theXML){ 
     } 
    }) 

der PHP-Code ist:

$userID='11'; 
    $sql = "SELECT ID, name, pic_square FROM users WHERE ID = $userID"; 
    $result = mysql_query($sql) or die(mysql_error()); 

    $xml = ""; 
    while($array = mysql_fetch_array($result)) { 
     $ID = $array['ID']; 
     $Name = $array['name']; 
     $pic_square = $array['pic_square']; 
     $xml .= "<Friend>"; 
     $xml .= "<ID>$ID</ID>"; 
     $xml .= "<Name>$Name</Name>"; 
     $xml .= "<Pic>$pic_square</Pic>"; 
     $xml .= "</Friend>"; 
    } 

    header('Content-Type: application/xml; charset=ISO-8859-1'); 
    header("Cache-Control: no-cache, must-revalidate"); 
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 

    echo "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"; 
    echo "<Friends>"; 
    echo $xml; 
    echo "</Friends>"; 

Hinweis: Ich habe versucht, die Header Ändern einer vollständigen Aktualisierung zu erzwingen, aber es half noch nicht

Testdatei Die Header von Firebug der Test PHP-Datei (die die richtigen Ergebnisse zurückgibt):

Response Headers 
Date  

Fri, 08 May 2009 18:53:34 GMT 

Server 

Apache/2.2.9 (Unix) mod_ssl/2.2.9 OpenSSL/0.9.7l DAV/2 PHP/5.2.6 

X-Powered-By  

PHP/5.2.6 

Cache-Control 

no-cache, must-revalidate 

Expires 

Mon, 26 Jul 1997 05:00:00 GMT 

Content-Length 

200 

Keep-Alive 

timeout=5, max=98 

Connection 

Keep-Alive 

Content-Type  

application/xml; charset=ISO-8859-1 

Request Headers 
Host  

localhost 

User-Agent 

Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.10) Gecko/2009042315 Firefox/3.0.10 

Accept 

application/xml, text/xml, */* 

Accept-Language 

en-us,en;q=0.5 

Accept-Encoding 

gzip,deflate 

Accept-Charset 

ISO-8859-1,utf-8;q=0.7,*;q=0.7 

Keep-Alive 

300 

Connection 

keep-alive 

X-Requested-With  

XMLHttpRequest 

Referer 

http://localhost/~Seeff/testajax.php 

Cookie 

a7c768c2549daf4a7f69b9916bab5a38=4555bf36cf1b308f19a12f8da6944b80; a7c768c2549daf4a7f69b9916bab5a38_user 
=507514167; a7c768c2549daf4a7f69b9916bab5a38_ss=kKgqsUlOrFArzo9Nrv2Zyg__; a7c768c2549daf4a7f69b9916bab5a38_session_key 
=3.qPXakpbNIIX_bvndm_5gnA__.86400.1241895600-507514167; a7c768c2549daf4a7f69b9916bab5a38_expires=1241895600 
; fbsetting_a7c768c2549daf4a7f69b9916bab5a38=%7B%22connectState%22%3A1%2C%22oneLineStorySetting%22%3A1 
%2C%22shortStorySetting%22%3A1%2C%22inFacebook%22%3Afalse%7D 

Und die Antwort ist:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Friends><Friend><ID>12</ID><Name>XXX 
</Name><Pic>http://something</Pic></Friend></Friends> 

Hauptprojekt Die Firebug-Header aus dem Ajax-Aufruf von meinem Hauptprojekt sind:

Response Headers 
Date  

Fri, 08 May 2009 18:53:41 GMT 

Server 

Apache/2.2.9 (Unix) mod_ssl/2.2.9 OpenSSL/0.9.7l DAV/2 PHP/5.2.6 

X-Powered-By  

PHP/5.2.6 

Cache-Control 

no-cache, must-revalidate 

Expires 

Mon, 26 Jul 1997 05:00:00 GMT 

Content-Length 

74 

Keep-Alive 

timeout=5, max=98 

Connection 

Keep-Alive 

Content-Type  

application/xml; charset=ISO-8859-1 

Request Headers 
Host  

localhost 

User-Agent 

Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.10) Gecko/2009042315 Firefox/3.0.10 

Accept 

application/xml, text/xml, */* 

Accept-Language 

en-us,en;q=0.5 

Accept-Encoding 

gzip,deflate 

Accept-Charset 

ISO-8859-1,utf-8;q=0.7,*;q=0.7 

Keep-Alive 

300 

Connection 

keep-alive 

X-Requested-With  

XMLHttpRequest 

Referer 

http://localhost/~Seeff/ 

Cookie 

a7c768c2549daf4a7f69b9916bab5a38=4555bf36cf1b308f19a12f8da6944b80; a7c768c2549daf4a7f69b9916bab5a38_user 
=507514167; a7c768c2549daf4a7f69b9916bab5a38_ss=kKgqsUlOrFArzo9Nrv2Zyg__; a7c768c2549daf4a7f69b9916bab5a38_session_key 
=3.qPXakpbNIIX_bvndm_5gnA__.86400.1241895600-507514167; a7c768c2549daf4a7f69b9916bab5a38_expires=124 
1895600 

Und die Antwort ist:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Friends></Friends> 

So aus irgendeinem Grund, der innere XML-Knoten wird aus den Ergebnissen weggelassen, wenn sie aufgerufen aus dem Hauptprojekt.

Ich vermute, dass es etwas in meinem Hauptprojekt gibt, das in irgendeiner Weise stören muss, aber ich kann es einfach nicht herausfinden. Jede Hilfe wird sehr geschätzt!

+0

Heilige tl; dr! (nicht wirklich, ich versuche es) – cgp

+0

Sind beide Abfragen die gleiche Datenbank in den gleichen Umgebungen? – Chad

Antwort

0

Meine Vermutung ist, dass Sie mysql_fetch_assoc anstelle von mysql_fetch_array verwenden sollten. mysql_fetch_array gibt Ihnen eine Array-Struktur mit numerischen Indizes. Wo mysql_fetch_assoc Ihnen das $ array [column_name] geben wird, wie Sie es suchen.

+0

Es ist ein guter Punkt, den Sie machen, aber ich habe versucht, die Änderung und habe immer noch das gleiche Problem .. –

0

Ich denke, dass es ein mysql Verbindungsproblem ist; die Auswahl läuft sowieso nicht. Fügen Sie zum Debuggen ein Echo "hallo" zu while {} hinzu und prüfen Sie, ob es überhaupt angezeigt wird oder nicht :)

+0

es sieht aus wie die Auswahl ausgeführt wird, denn wenn ich die PHP-Datei selbst ausführen, gibt es die richtigen Ergebnisse, aber wenn ich Rufen Sie es über AJAX, die Ergebnisse sind unterschiedlich (obwohl keine Parameter gesendet werden) –

+0

versuchen, einige Daten mit Ajax zu buchen. Ich hatte das gleiche mit einem Web-Service-Anruf auf .net; Ich denke, "getFriends" ist eine Methode, aber sie wird überhaupt nicht aufgerufen. – balint

0

Klicken Sie im Firebug mit der rechten Maustaste auf den AJAX-Anruf und wählen Sie dann "In neuem Tab öffnen". Firefox sollte das XML für Sie schön formatieren (wenn Sie header("Content-Type: application/xml") tun, wie Sie sollten). Sehen Sie sich die Anfrage an, die gesendet wird (im Feld "Standort"). Laden Sie es ein paar Mal neu. Drucken Sie die Daten in der PHP-Datei, von der Sie denken, dass sie eingestellt werden sollte.

Es tut mir leid, ich kann nicht mehr helfen, aber es klingt wie ein dummer Fehler irgendwo.

Alternativ können Sie einfach die Daten als Array erstellen und dann JSON (meine bevorzugte Methode) verwenden.

Auf mehr Sache, sollten Sie nie Parametereinspritzung in SQL tun. Bery sehr gefährlich. Verwenden Sie etwas wie PDO.

$userID='11'; 
$PDO = new PDO("mysql:dbname=mydb", "uname", "pword"); 

$stmt = $PDO->prepare("SELECT ID, name, pic_square FROM users WHERE ID = :userID"); 
$stmt->execute(array("userID" => $userID)) or die (print_r($PDO->errorInfo(), TRUE)); 

$output = array(); 
while($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) { 
    $output = $row; 
} 

header('Content-Type: application/json; charset=ISO-8859-1'); 
header("Cache-Control: no-cache, must-revalidate"); 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 

print json_encode($output); 
0

Scheint so, als ob Sie keine Daten von der db erhalten. Was passiert, wenn Sie dies einfach tun

echo "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"; 
echo "<Friends>"; 
echo "<Test>Hello</Test>"; 
echo "</Friends>"; 

stattdessen? Wenn es sich wirklich um ein Cache-Problem handelt, sollte das Hinzufügen eines zufälligen Parameters zur URL den Browser zur Aktualisierung zwingen. D. h bedeutet dies sollte funktionieren:

$.ajax({ 
    url:"./lib/ajax_friends.php?random987398792374", 
... 

Viel Glück!