Der HTTP_X_REQUESTED_WITH-Header wird von allen aktuellen Browsern gesendet, die AJAX-Anfragen unterstützen.
if ( !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' )
{
# Ex. check the query and serve requested data
}
Ich denke, isset() ist in dieser Situation geeigneter als !empty(). Trotzdem ein nützliches Snippet. :)
Praktisch das Allerwichtigste, was empty() tut, ist sicherzustellen, dass isset() falsch ist. Die Verwendung von isset() und empty() ist in dieser Weise redundant. empty() gibt für eine nicht gesetzte Variable immer false zurück (und es gibt keine Fehlermeldung).
Von PHP.net zu
empty()(http://php.net/manual/en/function.empty.php)Damit Sie keine Meldung über die Existenz der Variable oder des Attributs erhalten, sollten Sie sowohl isset() als auch !empty() verwenden.
if (isset($_SERVER['HTTP_X_REQUESTED_WITH'] && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
{
# z.B. die Abfrage prüfen und angeforderte Daten bereitstellen
}
Dir fehlt die schließende Klammer bei isset, hihi.
*Syntax-Hure*
Tolles und praktisches Snippet, jedoch würde ich gerne wissen, ob die Verwendung dieses Ansatzes bei der Arbeit mit synchronisierten (normalen Anfragen) und asynchronen (AJAX-Anfragen) Anfragen auf derselben Seite erhebliche Nachteile hat.
Die Aussage „Der HTTP_X_REQUESTED_WITH-Header wird von allen aktuellen Browsern gesendet, die AJAX-Anfragen unterstützen.“ ist zu 100 % falsch.
Der Browser sendet diesen Header nicht, JavaScript-Bibliotheken tun es. Bibliotheken wie jQuery, Prototype und Mootools.
Hallo zusammen,
Ich möchte die Verfügbarkeit einer Internetverbindung vor jeder AJAX-Anfrage prüfen. Wenn die Verbindung verfügbar ist – fortfahren, andernfalls eine Pop-up-Nachricht anzeigen – Netz nicht verfügbar.
Ich habe das JavaScript geschrieben, um die Netzverbindung zu prüfen. Aber um zu prüfen, ob eine Anfrage eine AJAX-Anfrage oder eine normale Anfrage ist, habe ich den folgenden Filter in meinen JavaScript-Code eingefügt:
if (isset($_SERVER[‘HTTP_X_REQUESTED_WITH’] && !empty($_SERVER[‘HTTP_X_REQUESTED_WITH’]) && strtolower($_SERVER[‘HTTP_X_REQUESTED_WITH’]) == ‘xmlhttprequest’))
Ich habe folgenden Fehler erhalten:
$_SERVER ist nicht definiert
Kann mir jemand korrigieren, wenn ich falsch liege.
@Suresh, das ist PHP-Code, den du versuchst, innerhalb von JavaScript auszuführen. $_SERVER ist nur für PHP verfügbar, daher erhältst du „undefined“.
Standardmäßig verwendet Ajax den Header: Accept:application/json, text/javascript, */*
und Nicht-Ajax hat Header wie Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
CSS-Header: Accept:text/css,*/*; es hängt von der Datei ab, die du anforderst.
Wenn du PHP-Frameworks wie CodeIgniter verwendest, kannst du $this->input->is_ajax_request() verwenden. Siehe http://codeigniter.com/user_guide/libraries/input.html
Übrigens ist $_SERVER[‘HTTP_X_REQUESTED_WITH’] der beste Weg, um AJAX-Anfragen zu erkennen.
Du solltest David Walsh dafür danken, denn ich weiß, dass du es von irgendwoher hast und es nicht selbst geschrieben hast, Chris.
http://davidwalsh.name/detect-ajax
Es ist nicht notwendig, isset() mit empty() zu kombinieren, da empty() keine Fehlermeldung ausgibt.
http://php.net/manual/en/function.empty.php
Meiner Meinung nach ist es nicht der richtige Weg, um zu erkennen, ob eine Anfrage von „ajax“ kam. Eine Anfrage ist eine Anfrage und das Ergebnis unterscheidet sich nur im gewünschten Dokumententyp, was Idham erwähnte. Wenn also HTML, XML oder JSON gewünscht wird, gib es in diesem Typ aus. In PHP erhältst du diese Information aus $_SERVER[„HTTP_ACCEPT“], welches für jeden Anfragetyp existiert. Vielleicht hilft das am Anfang.
$t = $_SERVER[„HTTP_ACCEPT“];
if(strpos($t, ‘application/json’) !== false){
// JSON wird gewünscht
}
elseif(strpos($t, ‘application/xml’) !== false){
// XML wird gewünscht
}
else{
// Fallback zu HTML
}
@kokuswolf danke, das war eine nützliche Aufschlüsselung dessen, was vor sich geht. Ich habe immer David Walshs Version verwendet, die Chris hier neu postet. Aber ich habe bemerkt, dass seine Bedingung Schwierigkeiten hat, einige Anfragen von bestimmten Node-basierten AJAX-Bibliotheken (insbesondere Axios in meiner Erfahrung) zu erkennen. Ich denke, deine einfachere
$_SERVER['HTTP_ACCEPT']-Prüfung wird das Problem jedoch lösen!Danke Chris! Genau das habe ich gesucht :)
Das ist eine schwache Methode, leicht mit cURL zu täuschen.