MySQL Felder einzeln und nicht als ganze Reihe auslesen

dUDALUS

Grünschnabel
Hallo an alle

Ich habe mir die 4 "Regeln" durchgelesen und hoffe, ich befolge sie auch. Nun dann, ich würde euch gerne ein paar Sachen fragen, die ich nicht weiss und die ich nicht alle in der Bordsuche finde (oder 100% verstehe), darum frage ich lieber. Ich muss euch sagen, dass ich mich etwas mit MySQL auskenne, dieses Wissen aber beschränkt ist, da ich den Umgang mit einer stark "beschnittenen" MySQL Version eines Spieles gelernt habe.

Also ich möchte per PHP aus einer MySQL Datenbank mit dem Namen Spieler die Spalte Passwort auslesen und einen Inputtext in MD5 verschlüsseln und in mit dem auch MD5 verschlüsselten Wert aus der Datenbank vergleichen.

Aufbau der Datenbank:
AutoIncrementID, Name,Passwort............(27 restliche Spalten)

1.Frage
Kann ich eine bestimmte Spalte aus einer bestimmten Zeile direkt mit dem query auslesen und wenn ja wie ?

2.Frage
Wenn die 1.Frage nicht gehen würde, lese ich die Zeile mit mysql_fetch_row aus und splitte sie. Ich habe mehr als 3 Spalten (etwa 30). Um zu testen ob der Login geht, muss ich alle 30 splitten oder kann ich auch die ersten 3 Spalten (AutoIncrement, Name, Passwort) splitten ?

3.Frage
Meines Wissens gibt es in PHP ein MD5 "Funktion", gibt die den verschlüsselten Hash gross oder kleingeschrieben aus und spielt das bei einem Vergleich eine Rolle ? In meiner Datenbank sind die MD5 Hashes grossgeschrieben, darum frage ich eben.

4.Frage
Ich poste hier mal meinen Code um euch die Sache mit den 3 Werten etwas verständlicher zu machen.

PHP:
else if(isset($_POST['username'])) // Wenn Variable Username (im Speicher) existiert, führe Loginabfrage aus
{
	$verbindung = mysql_connect("localhost","samp1111","XXXXX") or die ("Keine Verbindung zum Server möglich");
	mysql_select_db("XYZA") or die ("Keine Verbindung zur Datenbank möglich");	
	$result = mysql_query("SELECT * FROM Spieler WHERE Name = '$username'");
	if (!$result) 
	{
		echo 'Abfrage konnte nicht ausgeführt werden: ' . mysql_error();
		exit;
	}
	$row = mysql_fetch_row($result);	
	echo $row[0]; // AutoInkrement ID	
	echo $row[1]; // Name
	echo $row[2]; // Passwort
	if($row[2] == md5($_POST['password'])) // Checkt ob das MD5 Passwort stimmt
	{
		$_SESSION['username'] = $_POST['username']; 
	}
	else // Sendet Misserfolgs-Meldung aus 
	{
		echo startcontent();
		echo title("Loginversuch");
		echo '<p align=center><b>Benutzername oder Passwort falsch</b></p><meta http-equiv="refresh" content="3; URL=">';
		echo endcontent();
		include 'templates/navlogin.tpl'; 
		include 'templates/footer.tpl';
		die; 
	}
}


Wenn ich irgendwie etwas falsch machen würde oder was ausser Acht gelassen hätte, bitte lasst es mich wissen, will nicht bereits mit dem 1.Post was falsch machen ;)
MfG dUDALUS
 
1.Frage
Kann ich eine bestimmte Spalte aus einer bestimmten Zeile direkt mit dem query auslesen und wenn ja wie ?

Du hast den Schnippsel bereits in deinem Skript doch drin? Nur dass du hier alle Spalten ausliest.

SQL:
SELECT `spalte` FROM `table` WHERE `spalte` = 'wert'

Du solltest grundsätzlich nur die Spalten auslesen, die du auch brauchst. Auch wenn du alle brauchst, ist es performanter alle Spalten hinzuschreiben, als sie mit dem * Operator auszulesen.

2.Frage
Wenn die 1.Frage nicht gehen würde, lese ich die Zeile mit mysql_fetch_row aus und splitte sie. Ich habe mehr als 3 Spalten (etwa 30). Um zu testen ob der Login geht, muss ich alle 30 splitten oder kann ich auch die ersten 3 Spalten (AutoIncrement, Name, Passwort) splitten ?

Die Frage müsstest du mal genauer ausführen?

3.Frage
Meines Wissens gibt es in PHP ein MD5 "Funktion", gibt die den verschlüsselten Hash gross oder kleingeschrieben aus und spielt das bei einem Vergleich eine Rolle ? In meiner Datenbank sind die MD5 Hashes grossgeschrieben, darum frage ich eben.

Sofern das Feld nicht als BINARY gespeichert ist, unterscheidet MySQL nicht die Groß- und Kleinschreibung. In neueren Anwendungen sollte man aber auf einen stärkeren Hash-Algorithmus setzen, wie z. B. [phpf]sha1[/phpf] oder wenn vorhanden auf [phpf]mcrypt[/phpf].
 
Hallo

Hier ist der aktuelle Code:

PHP:
else if(isset($_POST['username'])) // Wenn Variable Username (im Speicher) existiert, führe Loginabfrage aus
{
	$verbindung = mysql_connect("localhost","samp1111","00000000") or die ("Keine Verbindung zum Server möglich");
	mysql_select_db("samp1111") or die ("Keine Verbindung zur Datenbank möglich");	
	$result = mysql_query("SELECT Passwort FROM Spieler WHERE Name = 'username'");
	if (!$result) 
	{
		echo 'Abfrage konnte nicht ausgeführt werden: ' . mysql_error();
		exit;
	}
	if($result == md5($_POST['password'])) // Checkt ob das MD5 Passwort stimmt
	{
		$_SESSION['username'] = $_POST['username']; 
	}
	else // Sendet Misserfolgs-Meldung aus 
	{
		echo startcontent();
		echo title("Loginversuch");
		echo '<p align=center><b>Benutzername oder Passwort falsch</b></p><meta http-equiv="refresh" content="3; URL=">';
		echo endcontent();
		include 'templates/navlogin.tpl'; 
		include 'templates/footer.tpl';
		die; 
	}
}

@Felix Jacobi
Ist MD5 zu insicher oder wie soll man das genau verstehen ?

Ja, danke, jedoch habe ich noch ein Problem:

Ich kann dein richtigen Benutzer und das richtige Passwort eingeben. Aber es führt immer die else-Meldung aus. Ich habe also zuerst mal testen wollen, auf welcher Seite der Abfrage der Fehler liegen könnte. Habe zuerst die 2 MD5 Strings "gleichgesetzt" und es ging ja auch logischerweise. Nun habe ich folgendes versucht

Result = Meinen MD5 Hash

Ging auch nicht und umgekehrt witzigerweise auch nicht. Das password stammt aus der Loginmaske und ist im Template drin, habe es mal angehängt, jedoch die Dateiendung auf .txt gestellt, dass es raufgeladen werden kann.

MfG dUDA
 

Anhänge

PHP:
if($result == md5($_POST['password']))
$result ist eine Referenz auf das Query, nicht aber der Wert des OPasswortes
PHP:
$password = mysql_result($result, 0, 'Passwort');
if($password == md5($_POST['password']))
 
Hallo

Bekomm leider noch einen Error, habe password zu passwort umbenannt, da ich keine Überschneidungen will (oder vorbeugen will) ;)

rning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 4 in /var/www/web425/web/index.php on line 23

PHP:
	$passwort = mysql_result($result, 0, 'Passwort'); //Zeile 23
	if($passwort == md5($_POST['password']))

Bin aber bereits einmal ein Stück weitergekommen, dank euch .
MfG dUDA
 
Hallo

Danke für deine Hilfe. Ich habe mal mit mysql_num_rows die Zeilen gezählt und ich komme auf die richtige Anzahl von 13.

Bedeutet die Warning von oben, dass er in einer nicht existierenden Zeile etwas ausführen will (und es dort nichts gibt)

Hab den Code zum Testen benutzt, weiss nicht, ob Du irgendwie noch meinst, den nach dem Selektieren des Feldes auszuführen ?

PHP:
else if(isset($_POST['username'])) // Wenn Variable Username (im Speicher) existiert, führe Loginabfrage aus
{
	$verbindung = mysql_connect("localhost","samp1111","00000") or die ("Keine Verbindung zum Server möglich");
	mysql_select_db("samp1111") or die ("Keine Verbindung zur Datenbank möglich");	
	$result = mysql_query("SELECT * FROM Spieler"); 
	$num_rows = mysql_num_rows($result); 
	echo "$num_rows Rows\n";
}

MfG dUDA
 
ungeeigneter Test. Im Script hast du ein Filter. Test mysql_num_rows() geanu da, wo der Fehler auftritt.
EInfach vor die Zeile 23 ein var_dump() darauf und schauen was ausgegeben wird.

PHP:
var_dump(mysql_num_rwos($result));
    $passwort = mysql_result($result, 0, 'Passwort'); //jetzt Zeile 22
    if($passwort == md5($_POST['password']))
 
Hallo

2 Zeilen werden ausgegeben:

int(0)
Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 4 in /var/www/web425/web/index.php on line 24

Heisst int(0), dass result leer ist oder wie muss man das verstehen ?
dUDA
 
Zuletzt bearbeitet:
int(0) heisst, dass das Qzery korrekt abgearbeitet wird, aber keine Datensätz (also 0) zurückgibt.
Darum kann man auf Zeiel 24 auch nicht auf den ersten (index 0) zufreiffen, da nicht vorhanden.

In deinem Code vom Erst-Posting ist der Username auch fix mit dem Wert 'username' drin. Bist du sicher, dass der User namens username exisitiert? Oder sollte dort der Inhalt einer Variable stehen?
 
Zurück