PHP JQuery unexpected token error

@r15ch13 Ist PDO sicherer oder weshalb PDO? :D Außer PDO ist der Code ja kaum anders oder? :D Und einfach die möglichen Antwort möglichkeiten abzufragen ist nicht sicher oder doch? Weil eig. kann ja dann nichts anderes Abgefragt werden als die antwort möglichkeiten die im Formular vorhanden sind oder liege ich da falsch? Und Thx für den Code @r15ch13 ^^
Ergänzung ()

@ mental.dIseASe Ja aber ich wollte ja als Sicherung eine IF abfrage machen die Kontrolliert ob die POST Daten alles nur Zahlen sind außer die 1. die darf nur yes oder no sein und die Letzte darf nur ein begriff aus der Datenbank sein müsste dies nicht gehen bzw. die Sicherheitslücke beheben?
 
Das können alles nur sekundäre Maßnahmen sein. Merke: wenn SQL, dann Prepared Statements! Was du dann noch für Validierungen davor klemmst, ist zweitrangig. Immer zuerst Prepared Statements.
 
@mental.dIseASe ohh stimmt ja Prepared Statements gab es ja auch noch stimmt :D die werde ich auf jedenfall bentuzen aber wenn ich Prepared Statements benutze und alle Antwort möglichkeiten nocheinmal Abfrage ist es dann sicher?
 
Jeder kann die Daten die vom Formular gesendet werden manipulieren. (siehe Beispiel von ayngush)
Durch die Prepared-Statements von PDO werden SQL Injektionen (Link von benneque) verhindert.
 
@r15ch13 Ok Also wenn ich jetzt Prepared Statements benutze sind alle Sicherheitslücken beseitigt?
 
Kurze Frage nochmals habe lange nichtmehr mit Prepared Statements gearbeitet ^^ Weiß jemand wieso dieser Fehler auftritt?
Fatal error: Call to a member function bindParam() on boolean on line 40

Code:
$stmt = $conn->prepare("SELECT DISTINCT name FROM freetimeactivities WHERE (effort=:effort AND time=:time AND category=:category) HAVING SUM(minAge) <= :age");
!! Zeile 40 ->$stmt->bindParam(":effort", $effort);
$stmt->bindParam(":time", $time);
$stmt->bindParam(":categories", $categories);
$stmt->bindParam(":age", $age);
$stmt->execute();
 
Ich habe keine Ahnung von PHP, aber ich vermute, es liegt daran, dass du in deinem Statement einen Parameter namens "category" definierst, aber dann versuchst, ihn als "categories" zu binden.

Edit: achso Zeile 40. Kein Plan.
 
@ mental.dIseASe Oh stimmt ups :D Behoben danke dafür aber leider behebt dies nicht mein Problem in Zeile 40 :/
 
Hm, scheint als waere $stmt aus irgendeinem Grund ein Boolean. :confused_alt:
 
@r15ch13 Also ich habe nirgendwo anders $stmt festgelegt das sind alle zeilen die damit etwas zu tun haben :/
Ergänzung ()

Also im Internet lese ich nur dass, das Statement false ist wenn ein Fehler bei der Abfrage ist... Nur hat die SQL Abfrage ja zuvor immer funktioniert :/ Es hat keiner mehr eine idee oder? Weil meine Zeit wird knapp ._. #r.i.p
 
Naja, den vermutlich fehlerhaften Teil des Codes hast Du ja nicht gepostet. Wie baust Du die Verbindung auf - PDO oder MySQLi? Wenn MySQLi dann musst Du das SQL-Statement umschreiben, da MySQLi keine named Parameters unterstützt, Du diese aber benutzt.
 
@Andreas_ Stimmt ich baue über MySQLi meine verbindung auf:
Code:
$conn = new mysqli($servername, $username, $password, $dbname);
Wie kann ich dies denn anders lösen? Möchte mich in den nächsten Tagen nicht mti PDO befassen weil wenn ich mich dort einlese kostet mich das zu viel Zeit ^^
Ergänzung ()

:O Habe die Lösung gefunden wie es mit MySQLi geht :D Danke für die Hilfe schreibe jetzt erstmal ne menge um :D Falls jemand das selbe problem später hat und wissen möchte wie es geht hier ist es sehr gut erklärt ^^ http://php.net/manual/de/mysqli.prepare.php
 
@Andreas_ Ja habe aber nichtnur Select abfragen und kannte dies bei MySQLi schon weshalb ich wegen dem zeitdruck mit jetzt nicht durchlesen wollte und es geht ja jetzt alles mit MySQLi ^^ also fast alles habe jetzt die Abfrage so:
PHP:
<?php

if ($weather == "3") {
	if ($stmt = $conn->prepare("SELECT DISTINCT name FROM freetimeactivities WHERE effort=? AND time=? AND category=? HAVING SUM(minAge) <= ?")) {
		$stmt->bind_param("ssss", $effort, $time, $category, $age);
		$stmt->execute();
		$stmt->bind_result($result);
	} else {
		$javascriptResultArray["error"] = "Error: Statement($stmt) = false";
		die();
	}
} else {
	if ($stmt = $conn->prepare("SELECT DISTINCT name FROM freetimeactivities WHERE effort=? AND time=? AND category=? AND weather=? HAVING SUM(minAge) <= ?")) {
		$stmt->bind_param("sssss", $effort, $time, $category, $weather, $age);
		$stmt->execute();
		$stmt->bind_result($result);
	} else {
		$javascriptResultArray["error"] = "Error: Statement($stmt) = false";
		die();
	}
}

if ($stmt->num_rows > 0) {
	$resultsNames = array();
	while ($stmt->fetch()) {
		array_push($resultsNames, $result);
	}

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

?>

Alle Variablen sind richtig übergeben worden aber warum auch immer werden immer 0 einträge zurück gegeben kp warum wenn ich mit den Variablen die SQL Abfrage selber durchfüre kriege ich antworten... Habe ich noch etwas Falsch beim Prepared Statement?
 
Bevor Du $stmt->bind_result() oder $stmt->num_rows verwendest, solltest Du $stmt->store_result() aufrufen.
 
Zuletzt bearbeitet:
Ich poste dir hier mal, wie die Methode meines mysqli Wrappers aussieht.

PHP:
function pQuery($pquery, $pargs) {
		$types = "";
		$tmp_arr = array();
		foreach ($pargs AS $arg) {
			if (is_int($arg)) {
				$types .= 'i';
			} elseif (is_float($arg)) {
				$types .= 'd';
			} elseif (is_string($arg)) {
				$types .= 's';
			} else {
				$types .= 'b';
			}
			$$arg = $arg;
			$tmp_arr[] = &$$arg;
		}
		if (count($tmp_arr) > 0) {
			array_unshift($tmp_arr, $types);
		}
		
		$stmt = $this->connid->prepare($pquery);
		call_user_func_array(array($stmt, 'bind_param'), $tmp_arr);
		if (!$stmt->execute()) {
			die("SQL Fehler: ".$stmt->error);
		}
		$meta = $stmt->result_metadata();
		$fields = ($meta) ? $meta->fetch_fields() : array();
		
		$arr_fields = array();
		$i = 0;
		foreach ($fields AS $field) {
			$tmp = $field->name;
			if (array_key_exists($tmp, $arr_fields)) {
				$tmp .= $i;
				$i++;
			}
			$arr_fields[$tmp] = &$$tmp;
		}

		if (count($arr_fields) > 0) call_user_func_array(array($stmt, 'bind_result'), $arr_fields);
		$ret_arr = array();
		$i = 0;
		while (mysqli_stmt_fetch($stmt)) {
			foreach($arr_fields AS $name => $value) {
				$ret_arr[$i][$name] = $value;
			}
			$i++;
		}
		$stmt->close();
		
		return $ret_arr;
	}

Es ist ne Weile her, also bitte gnädig sein :D
Die Referenzen waren für irgendwelche PHP Versionen erforderlich, damit es tat, kA mehr genau.

Jedenfalls solltest du damit für "SELECT a, b FROM table WHERE c = ? OR d = ?;" ein brauchbares Array erhalten können.
 
Zurück
Oben