Sitelogin durch DB Zugriff mit sessionhelper

native0speaker

Grünschnabel
Hallo Beisammen,
Ich bin schon seit knapp 3 Tagen am debuggen und komme jetzt definitiv nicht weiter. Wahrscheinlich bin ich nur blöd^^

Ich habe ein Login formular (html): funktioniert
Ich habe ein php skript login.php dass auf den sessionhelper zugreift: funktioniert
ich benutzteeine klasse sessionhelper: funktioniert teilweise:

Vorab, die vielesn Ausgaben waren zu eingrenzen der Fehler, das fehlen von passwörtern wird im nachhinein bereinigt.
xampp v3.1.0 Beta6
der Fehler liegt irgendo in meinen Select Varianten bzw. bei der Übergabe
if ( !$result ) {
exit(mysql_error());
}

PHP:
<?php


/**
 * @return void
 */
function connect () { 
    $con = mysql_connect('localhost', 'root', '') or exit(mysql_error());
    mysql_select_db('freizeitpark', $con) or exit(mysql_error());
echo 'Die Verbindung steht</br>';
}


/**
 * @param string $name
 * @param string $pass
 * @return boolean
 */
function check_user ( $name, $pass ) {

//entfernen aller Quotes
    if ( get_magic_quotes_gpc() ) {
         $name = stripslashes($name);
         $pass = stripslashes($pass);
		echo 'Check beginnt<br>';
     }
echo 'magic qotes<br>';
    // escapen von \, x00, n, r, , ', " und x1a --> bereinigt zeichen für sql
    $name = mysql_real_escape_string($name);
    // escapen von Backticks (`)
    $name = preg_replace('/x60/', '\x60', $name);
    // escapen von % und _
     $name = str_replace('%', '%', $name);
     $name = str_replace('_', '_', $name);
echo 'ende der Bereinigung der Eingabe<br>';
echo 'name ' .$name.'<br>';
echo 'pass ' .$name.'<br>';

	$sql = mysql_query("select `id` from `userdata` where `user`='$name' and pass='$pass'");
//  $sql = 'SELECT id FROM userdata WHERE user =  .$name.  AND pass = .$pass. ';
//    $sql = "SELECT id FROM userdata WHERE user =   $name   AND pass=  $pass";
//	$sql = mysql_query("SELECT id FROM userdata WHERE user = 'q' AND pass = 'q' ");
	
	 $arschstring = (string)$sql;
echo 'where 2<br>';
echo 'sql: '. $sql.'<br>';
echo 'sql: '. $arschstring.'<br>';
echo 'inhalt: '. mysql_query($sql) .'<br>';
echo 'inhalt: '. mysql_query($arschstring) .'<br>';

//  if ( !$result = mysql_query($sql) ) {
	$result = mysql_query($sql);
echo 'inhalt: '. mysql_query($sql) .'<br>';
echo 'sql: '. $result.'<br>';
    if ( !$result ) {
echo 'error 1<br>';
        exit(mysql_error());
		}
echo 'error 1 ende<br>';
    if ( mysql_num_rows($result) == 1 ) {
        $user = mysql_fetch_assoc($result);
        return ( $user['id'] );
echo 'error 2<br>';
    } else {
        return ( false );
    }
echo 'Check User beendet<br>';
}

/**
 * @param int $is
 * @return void
 */
 
function login ( $id ) {
	$sql = mysql_query("UPDATE userdata SET UserSession = .session_id(). WHERE id =(int)$id");
//   $sql = 'UPDATE userdata SET UserSession = ' . session_id() . ' WHERE id = ' . ((int)$id);
    if ( !mysql_query($sql) ) {
        exit(mysql_error());
    }
echo 'Login beendet</br>';
}

/**
 * @return boolean
 */
function logged_in () { 
    $sql = 'SELECT id FROM userdata WHERE UserSession = ' . session_id() . '';
    if ( !$result = mysql_query($sql) ) {
        exit(mysql_error());
    }
    return (mysql_num_rows($result) == 1);
echo 'eingeloggt bestätigt</br>';
}
/**
 * @return void
 */
function logout () { 
    $sql = 'UPDATE userdata SET UserSession = NULL WHERE UserSession = ' . session_id() . '';
    if ( mysql_query($sql) ) {
        exit(mysql_error());
    }
echo 'logout beendet</br>';
}

Danke schonmal für alle die sich melden und, sollte der Beitrag fehlplaziert sien bitte ich um entschuldigung - ich habe wirklich nachgeschaut.
 
Zeig doch auch mal noch die teilweise funktionierende Klasse sessionhelper. Und welche Teile funktionieren dort nicht?

Die Fehlermeldung lässt auf ein fehlerhaftes SQL schliessen. ich kann die dazu mal das folgende Tutorial ans Herz legen. Poste doch mal gemm. Tutorial das erstellt SQL-Script und die SQL-Fehlermeldung.
PHP MySQL Debug Queries

Achja, bei welchend er 3 SQL-Scripts ist denn der Fehler?
 
Also hier die Datei login_sw.php:

PHP:
<?php

session_start();
include_once('sessionhelpers.inc.php');
connect();
echo 'Beginn<br>';

if ( isset($_POST['login'])) {
//if ( isset($_POST['user'])!='' &&isset($_POST['pass'])!='' ) {
	echo 'Check Aufruf<br>';
    $userid = check_user($_POST['user'], $_POST['pass']);
    if ( $userid ) {
        login($userid);
    } else {
        echo 'Ihre Anmeldedaten waren nicht korrekt!<br>';
    }
}
 echo 'externes Ende vom Check<br>';
 
if ( !logged_in() ) {
    echo <<<END
<form method="post" action="login_sw.php">
<label>Benutzername:</label> <input name="user" type="text"><br />
<label>Passwort:</label> <input name="pass" type="password" id="pass"><br />
<input name="login" type="submit" id="login" value="Einloggen">
</form>
END;
} else {
    echo '<p><a href="soll-geschuetzt-werden.php">Testseite</a></p>';
    echo '<p><a href="logout.php">Ausloggen</a></p>';
}

?>

Der oben gepostete Code war "sessionhelpers.inc.php"
in meiner php.ini sind magic qoutes und msqli aktiviert

Bei allen 4 SELECT Versionen kommt entweder:
Warning: mysql_query() expects parameter 1 to be string, resource given in C:\xampp\htdocs\xampp\freizeitpark_d\sessionhelpers.inc.php on line 48

oder Query emty oder syntax Fehler

Teilweise funktionierend deswegen, da die unteren methoden auch alle einen Syntaxfehler bei den auskommentierten Teilen
Anmerkung: der Code ist geklaut (teilweise) und funktioniert bei denen offenbar, die Foreneinträge sind allerdings älter
 
Bitte, hilf uns dir zu helfen:
Die Fehlermeldung lässt auf ein fehlerhaftes SQL schliessen. ich kann die dazu mal das folgende Tutorial ans Herz legen. Poste doch mal gemm. Tutorial das erstellt SQL-Script und die SQL-Fehlermeldung.
PHP MySQL Debug Queries

Warning: mysql_query() expects parameter 1 to be string, resource given in C:\xampp\htdocs\xampp\freizeitpark_d\sessionhelpers.inc.php on line 48
Das ist einen PHP-Fehlermeldung, aber keine SQL-Fehlermeldung. Mehr dazu im verlinkten Tutorial (Punkt 1) und 2))
 
So Danke, das Skript ist nun voll funktionsfähig.:D

Für mich werde ich noch die GETs durch POST änder, ein paar Datentypen und das wars. Eine Frage habe ich noch: warum geht das script mit
- $sql = 'UPDATE userdata SET UserSession = \''. session_id() .'\' WHERE id = ' . ((int)$id);
nicht aber mit
- $sql = 'UPDATE userdata SET UserSession = '. session_id() . ' WHERE id = ' . ((int)$id);
? vorallem, da ich nirgends gefunden habe was '\' bezweckt?


Hier die Lösung ohne nervige echos:
Login.html:
HTML:
************Login formular*******************

<form action="login_sw.php" method="post">

Dein Username:<br>
<input type="text" size="24" maxlength="50"
name="user"><br><br>

Dein Passwort:<br>
<input type="text" size="24" maxlength="50"
name="pass"><br>

<input name="login" type="submit" id="login" value="login">
</form>

login_sw.php:
PHP:
************Login formular*******************

<form action="login_sw.php" method="post">

Dein Username:<br>
<input type="text" size="24" maxlength="50"
name="user"><br><br>

Dein Passwort:<br>
<input type="text" size="24" maxlength="50"
name="pass"><br>

<input name="login" type="submit" id="login" value="login">
</form>

sesseionhelper.inc.php:
PHP:
<?php
error_reporting (E_ALL);
/**
 * @return void
 */
 
function connect () { 
    $con = mysql_connect('localhost', 'root', '') or exit(mysql_error());
    mysql_select_db('freizeitpark', $con) or exit(mysql_error());
}

/**
 * @param string $name
 * @param string $pass
 * @return boolean
 */
 
function check_user ( $name, $pass ) {
    if ( get_magic_quotes_gpc() ) {
         $name = stripslashes($name);
         $pass = stripslashes($pass);
	}

/** 
	escapen von \, x00, n, r, , ', " und x1a --> bereinigt zeichen für sql
	escapen von % und _
	escapen von Backticks (`)
 */ 
    $name = mysql_real_escape_string($name);
    $name = preg_replace('/x60/', '\x60', $name);
    $name = str_replace('%', '%', $name);
    $name = str_replace('_', '_', $name);

    $sql = "SELECT id FROM userdata WHERE user = '{$name}' AND pass=  '{$pass}'";
	if ( !$result = mysql_query($sql)){
        exit(mysql_error());
		}

	if ( mysql_num_rows($result) == 1 ) {
        $user = mysql_fetch_assoc($result);
        return ( $user['id'] );
    } else {
        return ( false );
    }
}

/**
 * @param int $is
 * @return void
 */
 
function login ( $id ) {
	$sql = 'UPDATE userdata SET UserSession =  \''. session_id() .'\'  WHERE id = ' . ((int)$id);
    if ( !mysql_query($sql) ) {
        exit(mysql_error());
    }
}

/**
 * @return boolean; ist die Person eingeloggt?
 */
function logged_in () { 
	$sql = 'SELECT id FROM userdata WHERE UserSession = \'' . session_id() . '\'';

    if ( !$result = mysql_query($sql) ) {
        exit(mysql_error());
    }
    return (mysql_num_rows($result) == 1);
}
/**
 * @return void Wurde die Person ausgeloggt?
 */
 
function logout () { 
    $sql = 'UPDATE userdata SET UserSession = NULL WHERE UserSession = \'' . session_id() . '\'';
	echo 'echo : ' . mysql_query($sql);
    if ( !mysql_query($sql) ) {
        exit(mysql_error());
    }
echo 'Erfolgreich ausgeloggt</br>';
}

und noch der logout.php:
PHP:
<?php

session_start(); 
include_once('sessionhelpers.inc.php'); 
connect();

echo '<p>Sie sind '; 
if ( !logged_in() ) {
    echo 'nicht ';
}
echo 'eingeloggt.</p>';

echo 'break1: '. logged_in() . '<br>';
logout();
echo 'break2: '. logged_in();
echo '<p>Sie sind ';
if ( !logged_in() ) {
    echo 'nicht ';
}
echo 'eingeloggt.</p>';

echo '<p><a href="login.html">Einloggen</a></p>';

?>
 
So Danke, das Skript ist nun voll funktionsfähig.:D

Für mich werde ich noch die GETs durch POST änder, ein paar Datentypen und das wars. Eine Frage habe ich noch: warum geht das script mit
- $sql = 'UPDATE userdata SET UserSession = \''. session_id() .'\' WHERE id = ' . ((int)$id);
nicht aber mit
- $sql = 'UPDATE userdata SET UserSession = '. session_id() . ' WHERE id = ' . ((int)$id);
? vorallem, da ich nirgends gefunden habe was '\' bezweckt?


Ganz einfach. Das Feld UserSession wird ein varchar-Feld sein (also ein String). Der Wert eines Strings muss man bei SQL immer in ' oder " (je nach DBMS unterschiedlich, bei einigen gehen beide - bei anderen nur eines davon) setzen.
Bei Nummerfelder solltest du hingegen immer ohne ' arbeiten
SQL:
-- Ergibt einen Fehler
UPDATE my_table SET textfeld = ABC;

-- Funktioniert
UPDATE my_table SET textfeld = 'ABC';

-- Funktioniert
UPDATE my_table SET nummerfeld = 1;

-- Funktioniert auch, sollte jedoch so nicht angewendet werden
UPDATE my_table SET nummerfeld = '1';

Dann zu den \'
Dein String ist in PHP mit einfachen ' umschlossen. Das heisst, PHP parst den String nicht. Um ein 'innerhalb dieses Strings zu schreiben muss man dieses Zeichen escapen, damit PHP weiss dass das ' nicht das Ende vom String bedeutet sondern ein Teil vom String ist.
Weiters zu 'Single quoted': http://ch2.php.net/manual/de/language.types.string.php
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück