PHP JQuery unexpected token error

DreamGamer

Lieutenant
Registriert
Feb. 2017
Beiträge
543
Hallo, ich brauche mal wieder Hilfe nehme aktuell an einer Coding Challenge teil wie schon im letzten Post erwähnt^^ Und meine Zeit wird knapp und ich finde den Fehler einfach nicht. Ich habe ein php und ein Javascript Script bei php function über ajax per JSON eine "GET" abfrage (POST) und in PHP wird von der Datenbank per POST daten etwas abgefragt und halt an Javascript zurück gegeben. Dafür habe ich dieses folgende PHP Skript was auch normal ohne POST Daten problemlos funktioniert:
PHP:
<?php

header('Content-Type: application/json');

if($_SERVER["REQUEST_METHOD"] == "POST") {
require("config.php");
$javascriptResultArray = array();

if (isset($_POST["answer1"]) && isset($_POST["answer2"]) && isset($_POST["answer3"]) && isset($_POST["answer4"]) && isset($_POST["answer5"]) && isset($_POST["answer6"])) {
$answer1 = $_POST["answer1"]; // yes or no
$answer2 = $_POST["answer2"]; // age
$answer3 = $_POST["answer3"]; // time
$answer4 = $_POST["answer4"]; // weather
$answer5 = $_POST["answer5"]; // efort
$answer6 = $_POST["answer6"]; // categories

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
$javascriptResultArray["error"] = "Error: No MySQL connection!";
} else {
if ($answer4 == "3") {
$sql = "SELECT DISTINCT name FROM freetimeactivities WHERE effort='" . $answer5 . "' AND time='" . $answer3 . "' AND category='" . $answer6 . "' HAVING SUM(minAge) <= " . $answer2;
$result = $conn->query($sql);
} else {
$sql = "SELECT DISTINCT name FROM freetimeactivities WHERE effort='" . $answer5 . "' AND time='" . $answer3 . "' AND category='" . $answer6 . "' AND weather='" . $answer4 . "' HAVING SUM(minAge) <= " . $answer2;
}

if ($result->num_rows > 0) {
$resultsNames = array();
while($row = $result->fetch_assoc()) {
array_push($resultsNames, $row["name"]);
}

$string = implode(",", $resultsNames);
$javascriptResultArray["result"] = $string;
} else {
$javascriptResultArray["noActivity"] = true;
}
}

} else {
$javascriptResultArray["error"] = "Missing POST datas!";
}

echo json_encode($javascriptResultArray);
}

?>

Wie gesagt dies funktioniert und ich finde dort auch keinen Fehler. In Javascript habe ich ajax am laufen per POST dies sieht so aus:

Code:
$.ajax({
type: "POST",
url: 'php/getResult.php',
dataType: 'json',
data: {
answer1: answers["1"],
answer2: answers["2"],
answer3: answers["3"],
answer4: answers["4"],
answer5: answers["5"],
answer6: answers["6"]
},
success: function (obj, textstatus) {
if ( !("error" in obj) && !("noActivity" in obj)) {
console.log("Namen: " + obj.result);
} else if ("noActivity" in obj) {
addMessage(botName, obj.noActivity);
} else {
console.log(obj.error);
}
},
error: function(jqXHR, textStatus, errorMessage) {
console.log("(jqXHR)Unknown Error: " + jqXHR);
console.log("(textStatus)Unknown Error: " + textStatus);
console.log("(errorMessage)Unknown Error: " + errorMessage);
}
});

Sobald ich die url zu einem anderen PHP script ändert kommt der Fehler außerdem nichtmehr... Der Fehler sieht außerdem wiefolgt aus:

(jqXHR)Unknown Error: [object Object]
(textStatus)Unknown Error: parsererror
(errorMessage)Unknown Error: SyntaxError: Unexpected token < in JSON at position 0

Leider finde ich aber nichts zu dem Syntax Fehler und weiß nicht was gemeint ist... bei der JSON ausgabe ist kein "<" vorhanden. Weiß einer wofür der Fehler steht? Freue mich über jede Hilfe weil ich halt unter Zeitdruck stehe ^^

MFG DreamGamer

Und sorry das der Code so unübersichtlich aussieht normal sieht der nicht so aus^^ Wer den CODE in normal sehen möchte hier sieht er normal aus: https://hastebin.com/exoluciyop.js
 
Wie sicher bist du dir, dass der Aufruf des PHP Scripts nur das letzte echo() als Ausgabe hat?
 
Wie meinst du das? Es ist nur die eine Echo ausgabe die am ende den Array weiter gibt. Der immer einen Wert hat. Oder was meinst du?
 
Dann mach doch mal dataType: 'text' in deinem Ajax-Call und schau mit dem Debugger, was wirklich vom Server zurückkommt.
 
Der Fehler tritt dann auf, wenn du an Position 0 (also an der ersten Position) ein "<" hast. Ich frage einmal ganz blöd: Bist du dir sicher, dass dein Request nicht einfach das PHP-File Plain zurück gibt? Weil "<?php" und so ;)

Schau dir das doch mal im Browser an. Wenn du da in die Entwickler-Tools gehst, auf den Network-Tab switcht und dort XHR auswählst, dann siehst du dann den Call. Wenn du den auswählst, kannst du dir den Response anschauen.
 
Ich sehe zum Beispiel Zeile 31 die Möglichkeit, das Result nach Rows zu fragen, welches nicht unbedingt existieren muss, falls die Query fehlschlägt.

Das würde Fehlerausgaben im PHP erzeugen und deinen JSON Rückgabewert zerstören.
 
Bitte was :D Es gibt ein Debug tool für Javascript kenne das nur PHP mit Xdebug. Wie soll dies denn mit Javascript gehen? #BinSehrErfahren xD
 
Du hast doch sicherlich eine HTML-Datei, welche du im Browser aufrufst oder? Wenn dem so ist, dann machst du da einmal einen rechts-Klick im Browser, und wählst "Untersuchen" aus (zumindest im Chrome). Da gibt es dann besagten Network-Tab etc. ;)
 
Na du kannst in jedem gängigen Browser Haltepunkte im Javascript setzen.
Das geht manuell (z. B. in Chrome Developerkonsole mit F12 öffnen, unter Sources deine Datei suchen, mit Klick auf die Zeilennummer nen Haltepunkt setzen).

Oder du schreibst einfach debugger; in eine Zeile im Javascript, dann hält dein Browser ganz von alleine an dieser Zeile an (vorrausgesetzt, de Entwicklerkonsole, F12 ist offen).
 
@Tion1392 OMG als ob es so eine funktioniert gibt O.o Ich komme mir so dumm vor ich Programmiere Webseiten seit 5 Jahren xD Dort steht ein Fehlercode ... und zwar das eine Variable undefiniert ist ... Cool im PHP script fehlt in Zeile 70 ein MySQL Befehlt :D @Krafty Jap das ist wohl der Fehler ^^ Jetzt geht alles Sollte mir vllt. die Developer Tools mehr anschauen Danke für eure Hilfe ihr habt mir so stark geholfen :D Danke wirklich Danke :D!!!
 
Ich will ja nicht meckern und die "Zeit ist knapp" hast Du ja mehrfach erwähnt.
Dennoch würde ich dringend raten den Code allgemein einem ordentlichen Audit und anschließendem Refactoring zu unterziehen.
Mal von nicht vorhandenen Architekturmodellen usw. komplett weg: Da sind dicke fette Sicherheitslücken drinnen (SQL Injection). Veröffentlichen würde ich die API oder was das sein soll in der vorliegenden Form auf gar keinen Fall.

Grüße
 
Welche sicherheits lücken meinst du denn? Der Nutzen hat ja nur die brechtigungen sachen abzufragen nicht zu schreiben. @ayngush
 
Ok ^^ Danke für den Hinweis werde mich dadrum noch kümmern bevor ich es veröffentliche :D
 
Sicher?

folgendes würde ich dann lieber nicht via POST-Data an das Skript senden:

Code:
{
    'answer1': "kill", 
    'answer2': "that",
    'answer3': "entire",
    'answer4': "thing",
    'answer5': "' OR 1=1; DELETE FROM freetimeactivities; --",
    'answer6': "now"
}
 
Wenn du den Code, den du oben gepostet hast, veröffentlichen willst, mit der Intention, dass andere das nutzen können, solltest mal mit jemanden sprechen, der sich mit Security etc. auskennt! Ich bin erstmal von einem Übungsscript ausgegangen, aber wie ayngush schon ganz richtig anmerkt, SQL-Injections und was es da sonst noch so gibt, sollte vorher bedacht werden.

Zusätzlich solltest du da dann noch einmal mit dem Fokus auf Programmstabilität drüber gehen. Über Architektur will ich jetzt mal nichts sagen ;)
 
@anygush wie soll ich denn dann die Daten übergeben und ich habe aktuell als Lösung das ich schaue ob die Post Daten möglich sind es gibt ja für jede antwort nur bestimmt antwort möglichkeiten ist dies nicht eine Lösung?
 
Ein paar Links:
http://www.phptherightway.com/#pdo_extension
https://blog.codinghorror.com/flattening-arrow-code/
https://en.wikibooks.org/wiki/Computer_Programming/Coding_Style/Minimize_nesting

Und ein Refactoring-Versuch des PHP-Codes
DISCLAIMER: Der folgende Code ist komplett ungetestet :)
Code:
<?php
header('Content-Type: application/json');
require("config.php");

if($_SERVER["REQUEST_METHOD"] !== "POST") {
    echo json_encode(["error" => "Method not allowed!"]);
    exit();
}

if (!isset($_POST["yesNo"]) || !isset($_POST["age"]) || !isset($_POST["time"]) || !isset($_POST["weather"]) || !isset($_POST["effort"]) || !isset($_POST["categories"])) {
    echo json_encode(["error" => "Missing POST data!"]);
    exit();
}

$yesNo = $_POST["yesNo"];
$age = $_POST["age"];
$time = $_POST["time"];
$weather = $_POST["weather"];
$effort = $_POST["effort"];
$categories = $_POST["categories"];

// Create connection
try {
    $pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
} catch (PDOException $e) {
    echo json_encode(["error" => "Error: No MySQL connection!", "message" => $e->getMessage()]);
    die();
}

if ($weather === "3") {
    $stmt = $pdo->prepare('SELECT DISTINCT name FROM freetimeactivities WHERE effort=:effort AND time=:time AND category=:category HAVING SUM(minAge) <= :age');
} else {
    $stmt = $pdo->prepare('SELECT DISTINCT name FROM freetimeactivities WHERE effort=:effort AND time=:time AND category=:category AND weather=:weather HAVING SUM(minAge) <= :age');
    $stmt->bindParam(':weather', $weather);
}

$stmt->bindParam(':effort', $effort);
$stmt->bindParam(':time', $time);
$stmt->bindParam(':category', $categories);
$stmt->bindParam(':age', $age);
$stmt->execute();

$response = array();

if ($stmt->execute()) {
    $names = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
    $response["result"] = implode(",", $names);
    $response["activity"] = true;
} else {
    $response["activity"] = false;
}

echo json_encode($response);
 
DreamGamer schrieb:
ich habe aktuell als Lösung das ich schaue ob die Post Daten möglich sind es gibt ja für jede antwort nur bestimmt antwort möglichkeiten ist dies nicht eine Lösung?

Du darfst nicht davon ausgehen, dass dein Server-Skript nur von einem Client angesprochen wird, über den du die Kontrolle hast. Wer will, craftet sich seinen Request einfach so zusammen, wie ayngush es getan hat und postet ihn deinem Server eiskalt um die Ohren.

Der Server muss immer sicher unabhängig von seinen Clients sein!
 
Zurück
Oben