404 Fehler bei AJAX Request: PHP-Datei wird nicht gefunden?
Folgendes:
Der Code, den ich in dieser Frage gepostet habe, habe ich minimal geändert (das PHP jetzt auch in eine separate Datei gepackt) und jetzt scheint der Button zu reagieren. So weit, so gut. Jetzt habe ich mir gedacht, dass es nützlich sein könnte, Fehler in einem alert auszugeben. Da ich nicht wusste, wie ich das anstelle, habe ich auch danach online gesucht und wurde fündig.
Nun zum eigentlichen Problem:
Mir wird ein 404-Fehler zurückgegeben, obwohl die Datei, die im Request angegeben wurde, existiert.
Ich habe auch dazu bereits im Internet nach Beiträgen gesucht und im weitesten Sinn ähnliche Beiträge gefunden. Aber keiner der Tipps, die ich dort gefunden habe, von denen ich der Meinung war, dass sie vielleicht helfen würde, hat etwas gebracht.
In einem der Kommentare (auf bspw. Stackoverflow) hieß es, man solle sich mit Werkzeugen wie Fiddler die Requests ansehen. Das habe ich gemacht, aber wirklich schlau werde ich daraus auch nicht.
Hier das JavaScript des Buttons:
<script>
$(document).on('click', '#removeButton', function() {
$.ajax({
// type: "GET",
url: "removeProject.php",
// data: [id: selectedProjectID],
success: function() {
alert("Success");
},
error: function(jqXHR, textStatus, errorThrown) {
alert(jqXHR.status);
alert(textStatus);
alert(errorThrown);
} // error
}) // ajax
}); // function
</script>
Hier der Inhalt der removeProject.php-Datei:
<?php
require_once '../sqlGenerator.php';
$dbh = new PDO("mysql:dbname=" . $db . ";host=localhost", $user, $pass);
$query = "SELECT * FROM TABLE_SELECTED_PROJECT";
$selectedProjectID = mysql_query($query);
$sql = "DELETE FROM " . TABLE_PROJECT_NAME . " WHERE " . COL_PROJECT_ID . " = " . $selectedProjectID;
try {
$statement = $dbh->prepare($sql);
$statement->execute();
}
catch (PDOException $e) {
exit("Datenbank-Fehler: " . $e->getMessage());
} // trycatch
?>
Am URL-Pfad kann es nicht liegen, da habe ich bereits alles Mögliche ausprobiert. Die Dateien befinden sich beide im gleichen Ordner.
Was könnte der Grund sein?
2 Antworten
404 sagt die URL gibt es nicht. Daran ist nicht zu rütteln. Das passt schon so. Du musst also schauen was an der per AJAX angesprochenen URL nicht stimmt. Schau dazu am besten in der Entwicklerkonsole deines Browsers nach wohin der Request genau geht und vergleiche das mit dem eigentlichen Ziel was Du im Sinn hast.
Am url-Pfad kann es nicht liegen, da habe ich bereits alles Mögliche ausprobiert.
Zumindets nicht nur am URL-Pfad. Ich würde zum Testen empfehlen, einen absoluten Pfad zu verwenden, laut inet ist die URL relativ zum Root, nicht zum derzeitigen Ordner:
https://stackoverflow.com/questions/2363511/relative-vs-absolute-urls-in-jquery-ajax-requests
man solle sich mit Werkzeugen wie Fiddler die Requests ansehen
Oder mit der Browserkonsole, das dürfte auch ausreichen. Relevant ist die angefragte Adresse. Ist diese korrekt?
In diesem Falle womöglich schon, hängt ganz vom konkreten Grund ab.
Siehst du in der Browserkonsole eine Fehlermeldung?
Wenn du der Onclick-Methode zusätzlich ein alert hinzufügst, das unbedingt ist, siehst du diesen dann?
An sich kann "Keine Reaktion" hier bedeuten, dass die Seite gefunden und aufgerufen wird, der Aufruf aber ewig dauert, was schonmal besser wäre, als ein 404er, bei dem die Seite ja garnicht erst gefunden wird.
Habe jetzt der onClick-Methode wie vorgeschlagen ein alert hinzugefügt. Es wird nicht ausgeführt.
Die Console hat mir auch einen Fehler ausgegeben, den ich nicht ganz verstehe:
Uncaught SyntaxError: Invalid hexadecimal escape sequence
at b (jquery-3.4.1.min.js:2)
at Ie (jquery-3.4.1.min.js:2)
at k.fn.init.append (jquery-3.4.1.min.js:2)
at k.fn.init.<anonymous> (jquery-3.4.1.min.js:2)
at _ (jquery-3.4.1.min.js:2)
at k.fn.init.html (jquery-3.4.1.min.js:2)
at Object.<anonymous> (jquery-3.4.1.min.js:2)
at c (jquery-3.4.1.min.js:2)
at Object.fireWith [as resolveWith] (jquery-3.4.1.min.js:2)
at l (jquery-3.4.1.min.js:2)
Außerdem steht da das DevTools die SourceMap nicht laden kann und das hier:
HTTP error: status code 404, net::ERR_HTTP_RESPONSE_CODE_FAILURE
Wie sieht dein Onklick jetzt aus?
SourceMap
Ich habe keine Ahnung, welche SourceMap damit gemeints ein könnte oder sollte.
So:
$(document).on('click', '#removeButton', function(){
alert("test")
$.ajax({
url: "C:\xampp\htdocs\ScrumManagerMKII2020\scrumProject\removeProject.php",
success: function(){
alert("Success");
},
error: function(jqXHR, textStatus, errorThrown) {
alert(jqXHR.status);
alert(textStatus);
alert(errorThrown);
} //error
}) //ajax
}); //function & onClick
Es muss sich um eine URL handeln. Das hier ist allerdings keine URL sondern ein Datepfad.
Entwedre machst du das mittels "file://" oder, indem du "localhost" verwendest und den Pfad relativ zu "htdocs" angibst.
localhost/ScrumManagerMKII2020/scrumProject/removeProject.php
Woops. Mein Fehler. xD
Jetzt bekomme ich dreimal "test" ausgegeben und wieder zweimal jeweils "404", "error" und "Not found"
Wenn du dieselbe URL aber direkt in deinen Browser eingibst siehst du die Seite?
Wird dir in der Browserkonsole bei Klick auf den Button die Anfrage angezeigt? Evtl. musst du dort zuvor noch "XHR" aktivieren, dmait du das siehst.
Steht dort die korrekte URL?
versuchs mal mit:
http://localhost/ScrumManagerMKII2020/scrumProject/removeProject.php
Mit
http://localhost/ScrumManagerMKII2020/scrumProject/removeProject.php
wird mir statt des Errors "Success" ausgegeben, also scheint das das Problem gewesen zu sein. :) Gelöscht wird da zwar trotzdem nichts, aber das ist zumindest ein erfreulicher Anfang. Danke für deine Hilfe. Jetzt muss ich noch herausfinden, warum der Datenbankeintrag des Testprojekts nicht gelöscht wird.
Zwei Anmerkungen zu deinem PHP-Skript:
1) Du baust dir ein PDO-Objek auf, nutzt es hier:
$selectedProjectID = mysql_query($query);
aber gar nicht. Alle Funktionen, die mit mysql_ beginnen (nicht zu verwechseln mit mysqli_), solltest du übrigens vermeiden, denn sie sind veraltet / wurden in PHP 7 entfernt.
2) Wenn du wie hier:
$sql = "DELETE FROM " . TABLE_PROJECT_NAME . " WHERE " . COL_PROJECT_ID . " = " . $selectedProjectID;
try {
$statement = $dbh->prepare($sql);
// ...
den SQL Query mit all seinen dynamischen Werten (ID) im Vorfeld manuell zusammenbaust und an prepare übergibst, ist es derselbe Effekt, als würdest du den Query mit der query-Methode an die Datenbank schicken. Die dynamischen Werte werden nicht explizit maskiert.
Nutze stattdessen Platzhalter:
$sql = "DELETE FROM " . TABLE_PROJECT_NAME . " WHERE " . COL_PROJECT_ID . " = :selectedProjectId";
$statement = $dbh->prepare($sql);
$success = $statement->execute(array(":selectedProjectId" => $selectedProjectID));
Das Ergebnis von execute zu prüfen, sollte übrigens ausreichen. Das try-catch würde ich persönlich nicht als notwendig erachten.
Danke für den Tipp. Werde ich umgehend ausprobieren.
Das habe ich schon versucht, dann gibt es gar keine Reaktion mehr. Als ob der Button gar nicht mehr reagieren würde. Ist das dann besser?
Tut mir leid, wenn ich dumme Fragen stelle. Ich bin JS und PHP Anfänger.