Ajax bekommt keine Antwort

Lime

frisch fruchtig
Hallo,

leider muss ich auch mal wieder um Rat bitten... Mein Ajax-Skript bekommt einfach keine Antwort vom PHP-Skript.

HTML:
<form id="loginform" method="post" action="{$websitepath}">
	<input type="text" id="username" value="Username" onfocus="defaultInputUser(this)" onblur="clearInputUser(this)" />
	<input type="password" id="password" value="Password" onfocus="defaultInputPass(this)" onblur="clearInputPass(this)" /><br />
	<input type="submit" id="loginsubmit" value="Einloggen" />
	<img src="{$websitepath}templates/img/load.gif" id="loginload" style="display:none;"/>
	<br /><div id="logininfo"></div>
</form>

Javascript:
$(document).ready(function()
{
	$("#loginsubmit").click(function() {
		username2 = $('#username').attr('value');
		password2 = $('#password').attr('value');
   		$.ajax({
   			type: "POST",
   			url: "http://absoluterpfad.zum/skript.php",
   			data: { username: username2, password: password2 },
			dataType: "json",
			cache: false,
			beforeSend: function() {
				$("#loginsubmit").hide();
				$("#loginload").show();
			},
			success: function(data){
				$("#loginload").hide();
				if(data.a == "ok")
				{
					$("#loginform").hide();
					var t = setTimeout ( "document.location='home/';", 1000 );
				} else {
					$("#loginsubmit").show();
				}
				$("#logininfo").html(data.b);	
			}
		});
		return false;
	});
});

PHP:
<?php
require('../configs/config.inc.php');
require('../configs/functions.inc.php');
require('../configs/db.inc.php');
if(isset($_POST['username']) && !empty($_POST['username']) &&
	isset($_POST['password']) && !empty($_POST['password']))
{
	$sekunden = 1;
	sleep($sekunden);
	
	$cmd = "SELECT * FROM users WHERE username=? AND password=?";
	$qry = $db->prepare($cmd);
	$qry->bind_param('ss', $_POST['username'], md5($_POST['password']));
	$qry->execute();
	$result = $qry->get_result();
	if($result->num_rows != 0)
	{
		$return['a'] = 'ok';
		$return['b'] = 'Weiterleitung erfolgt...';
		echo json_encode($return);

		$row = $result->fetch_assoc();
		$_SESSION['userid'] = $row['id'];
		$_SESSION['username'] = $row['username'];
		$_SESSION['email'] = $row['email'];
		$_SESSION['status'] = $row['status'];
		$_SESSION['rights'] = $row['rights'];
	} else {
		$return['a'] = 'no';
		$return['b'] = 'Die Daten waren nicht korrekt.';
		echo json_encode($return);
	}
} else {
	echo 'Zugriff verweigert!';
}
?>

€: Noch die db.inc.php
PHP:
<?php
class db extends mysqli
{
	public function __construct ($host, $user, $pw, $db)
	{
		parent::__construct ($host, $user, $pw, $db);
	}
}
$db = new db($host, $user, $pass, $db);
?>

Die Pfade innerhalb der Skripte sind alle korrekt. Habe ich mehrfach überprüft und auch schon absolute Pfade ausprobiert.
Eine Datenbankverbindung wird in der inkludierten db.inc.php aufgebaut.
Eine Session wird in der inkludierten config.inc.php aufgebaut. (Wobei die Session egal ist, eine Antwort wird vor dem setzen der Session gesendet.)

Natürlich ist die Javascript-Datei in die HTML-Datei eingebunden.. (Den Code direkt in die HTML-File zu schreiben hatte ich auch schon probiert...)

Mir gehen die Ideen aus. Weiß jemand Rat oder findet jemand auf die Schnelle einen Fehler?

€: Das Sicherheitszeug bei dem PHP-Teil kommt noch, keine Angst...

lg Lime
 
Zuletzt bearbeitet:
Im HTML hast du bei deinen Feldern kein Attribut 'name' definiert. mWn kommen diese ohne Nahmen in $_POST. Du greifst aber nachher auf den Namen zurück $_POST['username'].
Die typische $_POST-Auswertung sieht so aus: $_POST[name]=value

HTML:
<!-- Input-Tag mit Name -->
<input type="text" name="username" id="username" value="" onfocus="defaultInputUser(this)" onblur="clearInputUser(this)" />

btw:
Falls es in 'Zugriff verweigert' kommt, kann der JSON nicht uasgewertet werden
 
Ich hatte das Zugriff verweigert bereits in eine json-Antwort geändert, brachte nichts.
Ich sende die Felder ja nicht mit HTML, sondern per jQuery ab. Damit kann man nur auf die IDs zugreifen, nicht auf die Namen. Das Ajaxskript setzt dann erst die Feldernamen... Aber ich probiers mal, vielleicht nützt es was.

Eigentlich lese ich ja mit folgenden Zeilen den Feldinhalt aus und verschicke ihn unter anderem Namen:
Javascript:
username2 = $('#username').attr('value');
password2 = $('#password').attr('value');

data: { username: username2, password: password2 },
Damit lege ich eine Variable username2 mit dem Inhalt von #username an, welcher Inhalt dann als username abgesendet wird. So gesehen sollte ich drauf zugreifen können.
Paradoxer weise funktioniert das Skript in ähnlicher Form auf meiner anderen Webseite.

Hat keiner eine Idee?
Das Skript bringt mich noch zum verzweifeln.

Also ich weiß, dass das Javascript funktioniert. (button.click funktioniert, weil das load-icon gezeigt wird...)
Ob das Ajax etwas abschickt oder nicht, weiß ich nicht. Jedenfalls kommt auch keine Antwort.
Habe schon versucht in der PHP Datei, egal ob die Auswertung klappt oder nicht, einen json-String auszugeben. Kam auch keine Antwort.
 
Zuletzt bearbeitet von einem Moderator:
Gesagt getan. Der Fehler war relativ dämlich, aber klar.
PHP:
//falsch
$result = $qry->get_result();

//richtig
$result = $qry->get_result;

Aber! Mir werden noch folgende Fehler angezeigt und da ich (noch) keine Ahnung von Mysqli habe, geschweige mich gut mit OOP auskenne, muss ich doch nochmal nachfragen.
Code:
[24-May-2012 18:39:18] PHP Notice:  Undefined property: mysqli_stmt::$get_result in /path/pages/login.php on line 14
[24-May-2012 18:39:18] PHP Notice:  Trying to get property of non-object in /path/pages/login.php on line 15
Das sind folgende Zeilen...
PHP:
$result = $qry->get_result;
if($result->num_rows != 0)

Jemand eine Idee?

€:
Die Fehler sind weg, aber der Login funktioniert noch immer nicht...
PHP:
<?php
require('../configs/config.inc.php');
require('../configs/functions.inc.php');
require('../configs/db.inc.php');
if(isset($_POST['username']) &&	isset($_POST['password']))
{
	$sekunden = 1;
	sleep($sekunden);
	$password = md5($_POST['password']);
	$username = $_POST['username'];
	
	$cmd = "SELECT * FROM users WHERE username=? AND password=?";
	$qry = $db->prepare($cmd);
	$qry->bind_param('ss', $username, $password);
	$qry->execute();
	if($qry->num_rows != 0)
	{
		$return['a'] = 'ok';
		$return['b'] = 'Weiterleitung erfolgt...';
		echo json_encode($return);
		
		$result = $qry->get_result();
		$row = $result->fetch_assoc();
		$_SESSION['userid'] = $row['id'];
		$_SESSION['username'] = $row['username'];
		$_SESSION['email'] = $row['email'];
		$_SESSION['status'] = $row['status'];
		$_SESSION['rights'] = $row['rights'];
	} else {
		$return['a'] = 'no';
		$return['b'] = 'Die Daten waren nicht korrekt.';
		echo json_encode($return);
	}
} else {
	echo "Zugriff verweigert!";
}
?>

Kann ich überhaupt prepared statements für so eine SELECT-Abfrage verwenden?
 
Zuletzt bearbeitet:
Die beiden Notices von PHP bedeuten das es keine Objeckteigenschaft "get_result" gibt.
Die Methode "get_result()" war in diesem Falle schon richtig, was kam denn da für ein Fehler?

Ein Notice ist kein Fehler, nur ein Hinweis. Ich hab noch nie mit mysqli gearbeitet, also kann ich dir bei deinem Problem nicht behilflich sein. Das gehört dann wohl eher ins PHP-Forum.
 
OOP/Mysqli Problem

Tag,

da die Sache mit dem Ajax geklärt ist und ich jetzt weiß, dass es am PHP-Teil liegt, versuche ich hier mal ein wenig Hilfe zu erhalten.

Folgendes Problem: Irgendetwas stimmt nicht mit der Mysql-Abfrage, jedenfalls - trotz richtig eingegebener Daten - kommt es nie zu einer "ok"-Antwort.

PHP:
<?php
require('../configs/config.inc.php');
require('../configs/functions.inc.php');
require('../configs/db.inc.php');
if(isset($_POST['username']) && isset($_POST['password']))
{
	$sekunden = 1;
	sleep($sekunden);
	$password = md5($_POST['password']);
	$username = $_POST['username'];
	
	$cmd = "SELECT * FROM users WHERE username=? AND password=?";
	$qry = $db->prepare($cmd);
	$qry->bind_param('ss', $username, $password);
	$qry->execute();
	if($qry->num_rows > 0)
	{
		$return['a'] = 'ok';
		$return['b'] = 'Weiterleitung erfolgt...';
		echo json_encode($return);
		
		$result = $qry->get_result();
		$row = $result->fetch_assoc();
		$_SESSION['userid'] = $row['id'];
		$_SESSION['username'] = $row['username'];
		$_SESSION['email'] = $row['email'];
		$_SESSION['status'] = $row['status'];
		$_SESSION['rights'] = $row['rights'];
	} else {
		$return['a'] = 'no';
		$return['b'] = 'Die Daten waren nicht korrekt.';
		echo json_encode($return);
	}
} else {
	echo "Zugriff verweigert!";
}
?>

Die config.inc.php sieht so aus:
PHP:
<?php
session_start();
session_name('Auktion');
?>
und die db.inc.php so:
PHP:
<?php
$db = new mysqli($host, $user, $pass, $db);
$db->set_charset('utf8');
?>
die functions.inc.php ist (noch) leer.

Ich bekomme zwar keine Fehler mehr, aber als Antwort bekommt mein Ajax-Skript immer nur ein "no". Es geht darum, zu prüfen ob ein Eintrag mit den entsprechenden Daten vorhanden ist oder nicht.

Um jede Hilfe bin ich dankbar.

lg, Lime
 
Ich habs jetzt zwar gelöst, indem ich einfach das prepared statement entfernt habe und die Auswertung abgeändert habe, dennoch würde ich mich freuen, wenn mir jemand erklärt, wie es mit prepared statements richtig funktionieren würde.

PHP:
<?php
require('../configs/config.inc.php');
require('../configs/functions.inc.php');
require('../configs/db.inc.php');
if(isset($_POST['username']) &&	isset($_POST['password']))
{
	$sekunden = 1;
	sleep($sekunden);
	$password = md5($_POST['password']);
	$username = $_POST['username'];
	
	$cmd = "SELECT * FROM users WHERE username='{$username}' AND password='{$password}'";
	$qry = $db->query($cmd);
	if($qry->num_rows > 0)
	{
		$return['a'] = 'ok';
		$return['b'] = 'Weiterleitung erfolgt...';
		echo json_encode($return);
		
		$row = $qry->fetch_object();
		$_SESSION['userid'] = $row->id;
		$_SESSION['username'] = $row->username;
		$_SESSION['email'] = $row->email;
		$_SESSION['status'] = $row->status;
		$_SESSION['rights'] = $row->rights;
	} else {
		$return['a'] = 'no';
		$return['b'] = 'Die Daten waren nicht korrekt.';
		echo json_encode($return);
	}
} else {
	echo "Zugriff verweigert!";
}
?>

In diesem Fall sind PS eigentlich sinnlos, dennoch werde ich es für spätere Fälle brauchen. Daher wäre es mir schon wichtig, wenn ich wüsste wie es richtig funktioniert.

lg Lime
 
Zurück