php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Problem mit Loginscript (php-quake.net)


 
Jama22
29-03-2010, 21:23 
 
Hallo,
Ich bins mal wieder, ich habe derzeit ein Problem mit dem Loginscript von PHP-Quake (http://tut.php-quake.net/login.html),
bekommen immer eine weiße Seite wenn ich die Verbindung mit der MySQL-Datenbank aufbauen will,
ich bekomme keine Fehler, ich bin Ratlos!

Hier mal mein Script:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

include 'inc/functions.inc.php';
include 'inc/constants.inc.php';
include './config.inc.php';


$db = @new MySQLi($_config['host'], $_config['user'], $_config['password'], $_config['database']);
$ret = 1;
if (mysqli_connect_errno()) {
$ret = 'Konnte keine Verbindung zu Datenbank aufbauen, MySQL meldete: '.mysqli_connect_error();
} else {

if (isset($_GET['page'], $dateien[$_GET['page']])) {
if (file_exists('inc/'.$dateien[$_GET['page']])) {
$ret = include 'inc/'.$dateien[$_GET['page']];
} else {
$ret = "Die Include-Datei konnte nicht geladen werden: 'includes/".$dateien[$_GET['page']]."' not found";
}
} else {
$ret = include 'inc/'.$dateien['home'];
}
}

// Header
include 'templates/header.html';

// Laden der Template-Datei
if (is_array($ret) and isset($ret['filename'], $ret['data']) and
is_string($ret['filename']) and
is_array($ret['data'])) {

// Gültige Include-Datei
if (file_exists($file = 'templates/'.$ret['filename'])) {
$data = $ret['data'];

include $file;
} else {
$data['msg'] = 'Templatedatei "'.$file.'" ist nicht vorhanden.';
include 'templates/error.html';
}
} else if (is_string($ret)) {

// Fehlermeldung
$data['msg'] = $ret;
include 'templates/error.html';
} else if (1 === $ret) {

// return wurde vergessen
$data['msg'] = 'In der Include-Datei wurde die return Anweisung vergessen.';
include 'templates/error.html';
} else {

// ein Ungültiger Return wert
$data['msg'] = 'Die Include-Datei hat einen ungültigen Wert zurückgeliefert.';
include 'templates/error.html';
}

// Footer
include 'templates/footer.html';
?>Das ganze ist in ein Templatesystem intigriert, der Link zum Tutorial ist oben, ich würde mich über eure Hilfe freuen.

Edit: Ich habe mal die Fehlerunterdrückung von der MySQL-Abfrage weggenommen folgender Fehler erscheint:
Fatal error: Class 'MySQLi' not found in /share/MD0_DATA/Qweb/bg/index.php on line 10

Grüße
Janis

 
Kropff
29-03-2010, 21:58 
 
Du hast was vergessen. Im Tutorial gibt es noch ein
include 'classes.php';
Und da liegt wohl bei dir der Hase im Pfeffer. Oder dein PHP unterstützt kein MySQLi.

Peter

PS: Niemals mit @-Zeichen im Code arbeiten. Zumindest nicht in der Entwicklungsphase.

 
Jama22
29-03-2010, 22:01 
 
Danke dir Kropff,
Du hast Recht gehabt, ich finde halt nur den Absatz nicht wo steht was in die classes.php kommen,
ich such mal weiter, sollte ich noch weitere Probleme haben meld ich mich nochmal!

Edit: Ich komm einfach nicht mehr weiter ich finde nichts, keine defienierung des MySQLi-Objekts,
ich habe mir auch mit der Funktion phpInfo die Daten angeguckt und nach MySQLi gesucht kein Erfolg,
ich weiß nicht weiter, ich bräuchte doch nochmal euere Hilfe.

 
Kropff
29-03-2010, 22:29 
 
ich habe mir auch mit der Funktion phpInfo die Daten angeguckt und nach MySQLi gesucht kein Erfolg
Dann unterstützt dein PHP kein MySQLi.

Peter

 
Jama22
29-03-2010, 22:33 
 
Wie kann ich das nachrüsten (...gibt es das zum Download?), PHP 5.2.x hab ich schon,
das ist kein Problem, ich weiß halt nur noch nicht wie ich auf den Server kommen!

Könnte ich nicht auch einfach eine Klasse mit den Eigentschaften definieren?

 
Kropff
29-03-2010, 22:34 
 
Zieh dir einfach den aktuellen XAMPP. Da ist das mit drin.

Peter

 
Jama22
29-03-2010, 22:36 
 
Könnte ich den keine Klasse mit den Eigentschaften definieren?
Das andere würde natürlich auch gehen, ist aber schwieriger für mich leider.

 
Abraxax
29-03-2010, 22:54 
 
Klar kannst du das. Das ist aber viel zu viel Aufwand.

 
Jama22
29-03-2010, 23:00 
 
Gibts es da nichts das ich einfach runterladen kann,
ich hab hier was gefunden weiß aber nicht ob es funkoniert, ich probier es gleich aus!

 
Kropff
29-03-2010, 23:11 
 
Wie ich schon sagte, XAMPP (http://www.apachefriends.org/de/index.html).

Peter

 
Jama22
29-03-2010, 23:18 
 
Nein, ich meinte die Klasse also ganzes, nicht die DLL-Datei?
Ich glaube wir reden aneinander vorbei, oder täusche ich mich, wen ja sorry!

 
Kropff
30-03-2010, 10:24 
 
Du verstehst das völlig falsch. Wenn PHP mit der Erweiterung MySQLi kompiliert wurde, so hast du einen direkten DB-Zugriff! Und zwar objekorientiert oder prozedural.

Peter

 
Jama22
30-03-2010, 10:34 
 
Du verstehst das völlig falsch. Wenn PHP mit der Erweiterung MySQLi kompiliert wurde, so hast du einen direkten DB-Zugriff! Und zwar objekorientiert oder prozedural.

Eigentlich versuche ich nur eine Möglichkeit zu finden die ohne eine Erweiterung funktsoniert, da muss es doch was geben!

 
Kropff
30-03-2010, 10:41 
 
Dann mach das ganz normal über die Standardfunktionen für MySQL, Also mysql_connect, mysql_select_db, mysql_query, etc.

Peter

 
Jama22
30-03-2010, 10:51 
 
Okay, kann man den auch was drehen mit SQL-Injection?
Also, ich habe mal den Code geändert, scheint nur das er den MySQL-Fehler nicht ausgibt.


<?php
// .... //
// .... //

$db = mysql_connect($_config['host'], $_config['user'], $_config['password'], $_config['database']);
$ret = 1;
if (mysql_errno()) {
$ret = 'Konnte keine Verbindung zu Datenbank aufbauen, MySQL meldete: '.mysql_error();
} else {

// .... //
// .... //
?>

 
Kropff
30-03-2010, 10:54 
 
Okay, kann man den auch was drehen mit SQL-Injection?
Infos dazu findest du zum Beispiel hier (http://www.peterkropff.de/tutorials/sicher_programmieren/sicher_programmieren.htm).

peter

 
Jama22
30-03-2010, 11:24 
 
Gut, danke dir!

Ich habe noch eine andere Stelle wo MySQLi benutzt wurde,
ich weiß leider nicht wie ich das ersetzen kann, hat jemand eine Idee?

$sql = 'SELECT
ID
FROM
User
WHERE
Username = ?';
$stmt = $db->prepare($sql);
if (!$stmt) {
return $db->error;
}
$stmt->bind_param('s', $Username);
if (!$stmt->execute()) {
return $stmt->error;
}
$stmt->bind_result($UserID);
if (!$stmt->fetch()) {
return 'Es wurde kein Benutzer mit den angegebenen Namen gefunden.';
}
$stmt->close();

Genauer, in dieser Zeile das Prepare-Objekt!
$stmt = $db->prepare($sql);

 
Kropff
30-03-2010, 11:35 
 
Bei den normalen SQL-Funktionen gibt es keine Prepared Statements. Da musst du mit mysql_query und mysql_fetch_assoc arbeiten. Und natürlich den Query selber gegen Injections absichern.

Peter

 
Jama22
30-03-2010, 13:22 
 
Also, ich habe mir den Code nochmal angeguckt, das schaffe ich nie im Leben den umzuschreiben,
entweder installiere ich mir die Erweiterung oder ich brauche eine andere Möglichkeit.

Das ist ein Mist und nur weil man es zu Hause ausprobieren will, auf seinem Server.

 
Kropff
30-03-2010, 13:31 
 
Dann zieh dir den aktuellen XAMPP (http://www.apachefriends.org/de/xampp-windows.html), Herrgottnochmal. Da ist alles drin.

Peter

 
Quetschi
30-03-2010, 13:41 
 
Also, ich habe mir den Code nochmal angeguckt, das schaffe ich nie im Leben den umzuschreiben...Dann solltest du es vielleicht lieber komplett sein lassen - bis jetzt hast du einfach durch den Code aus einen Tut abgetippt oder einfach rauskopiert.

Wenn du es nun nicht hinbekommst den Code anzupassen solltest du dich vielleicht erst mit diversen Grundlagen in PHP, danach in PHP+MySql befassen, bevor du gleich an ein Login-System rangehst.

 
AmicaNoctis
30-03-2010, 14:43 
 
Was hast du eigentlich für ein Problem mit PHP-Extensions? Wenn du es auf deinem heimischen Testserver machst, kannst du PHP doch mit allen möglichen Extensions benutzen oder zumindest mit denen, die auch auf deinem Webspace zur Verfügung stehen. Deine lokalen Tests sind doch gleich viel aussagekräftiger, wenn du online und offline exakt die gleiche Konfiguration verwendest.

 
Jama22
30-03-2010, 16:38 
 
Ja, das ist aber auf meinem Testserver nicht ganz so einfach dafür ist er auch nicht konzeptiert,
das Hauptproblem dabei liegt ich weiß nicht ich das über einen SSH-Zugang installiere,
wenn ihr mich ein Tuturial gebt und mir versichert das ich da nichts kaputt machen kann würde ich es trotzdem gerne mal versuchen.

Mein Server ist ein Qnap 209 II Pro (Nas-Server), PHP-Version 5.2.9!

Grüße
Janis

 
Quetschi
30-03-2010, 16:44 
 
PHP-Version 2.2.9!*Hust* - ne, entweder du hast dich ganz stark verlesen, vertippt oder sonst was :)

 
Jama22
30-03-2010, 16:46 
 
Upps, ich meinte natürlich 5.2.9!
Danke dir, das du den Tippfehler gefunden hast!

 
Kropff
30-03-2010, 17:20 
 
Warum packst du dir nicht auf deinen eigenen Rechner den XAMPP drauf und fängst erst mal lokal mit PHP an? Und lässt deinen Server Server sein? Dennn zuerst musst das lernen und kannst dann richtig loslegen.

Peter

PS: Bei mir (http://www.peterkropff.de/) gibt es jede Menge Futter für dich. Auch ohne MySQLi Inklusive einer kleinen Anleitung für den XAMPP.

 
Jama22
30-03-2010, 17:28 
 
Ja, weil ich die Grundlagen schon alle kann, ich habe halt nur das Problem das mein Server nicht MySQLi unterstützt,
das habe ich aber jetzt geklärt und mir den Server von meinem Freund ausgeliehen. Auf Server läuft das alles,
dort hab ich das auch ohne Problem darauf installiert, dort ist allerdings auch Windows Server 2008 drauf.

Jetzt aber nochmal zurück zum Thema, nur will er irgentwie nicht mein Passwort annehmen (Fehlerausgabe: Passwort ist falsch),
ich habe schon alles durchgecheckt keine Fehler gefunden und das Passwort liegt natürlich auch im md5-Format vor.

Ich dachte erst es liegt an Windows, ich habe mal gehört das Windows kein md5 unterstützt aber auch auf dem Xampp-Server geht es nicht.

 
Quetschi
30-03-2010, 17:28 
 
Danke dir, das du den Tippfehler gefunden hast!dass :D

 
wahsaga
30-03-2010, 17:36 
 
Ja, weil ich die Grundlagen schon alle kann
Ha ha.

Deine Fragen hier beweisen doch alle deutlich das Gegenteil.


Jetzt aber nochmal zurück zum Thema, nur will er irgentwie nicht mein Passwort annehmen [...]
Diese hier auch wieder. Nicht mal ansatzweise zu erkennen, was du unternommen hast, um die Ursache des Fehlerverhaltens deines Scriptes zu finden.

 
Jama22
30-03-2010, 17:46 
 
Also gut erstmal hab ich das Error-Reporting hochgeschraubt,
und habe überprüft ob das Passwortfeld nicht richtig übertragen wurde.
Außedem habe ich mir nochmal ein neues Passwort generieren lassen,
der Benutzername kann es nicht seinen, weil er in der Datenbank (vom Script) gefunden wurde.

Mehr weiß ich auch nicht, weil ich ja keine genauen Fehler bekommen,
halt nur meine definierte Fehlermeldung das, dass Passwort falsch ist.

 
wahsaga
30-03-2010, 18:08 
 
Mehr weiß ich auch nicht, weil ich ja keine genauen Fehler bekommen, halt nur meine definierte Fehlermeldung das, dass Passwort falsch ist.
Dann stimmt ggf. die Scriptlogik an der Stelle einfach nicht.

Das war ja auch eine der Stellen, die du jetzt umgeschrieben hast, oder?

 
Jama22
30-03-2010, 18:12 
 
Nein, das umgeschriebene haben ich nochmal zurückgeschrieben, es läuft jetzt erstmal über den XAMPP-Server,
da geht es auch ohne umgeschrieben zu sein, das wird auch erstmal zu bleiben.

Das ärgert mich ja so, das ein Tuturial das ich 1 zu 1 kopiert habe nicht geht!

 
wahsaga
30-03-2010, 18:35 
 
Das ärgert mich ja so, das ein Tuturial das ich 1 zu 1 kopiert habe nicht geht!
Also zum ersten bin ich mir noch nicht so sicher, ob das nicht an deiner Umschreiberei liegt, und zum zweiten sind Tutorials nicht zum 1:1 kopieren gedacht, sondern zum Mitdenken. Wenn das Tutorial also an der Stelle einen kleinen Fehler enthalten sollte(!), dann bist du hier gefragt, ein kleines bisschen Fehlersuche zu betreiben ... und wenn du noch nicht weisst, wie man dabei sinnvoll vorgeht, dann informiere dich darüber erst mal.

 
Jama22
30-03-2010, 21:50 
 
Ich weiß nicht mehr weiter, ich habe gesucht und gesucht,
ich finde einfach nichts! Ich glaube das es an dieser Passage liegt.

$sql = 'SELECT
Password
FROM
User
WHERE
ID = ? AND
Password = ?';
$stmt = $db->prepare($sql);
if (!$stmt) {
return $db->error;
}
$Hash = md5(md5($UserID).$Password);
$stmt->bind_param('is', $UserID, $Hash);
if (!$stmt->execute()) {
return $stmt->error;
}
$stmt->bind_result($Hash);
if (!$stmt->fetch()) {
return 'Das eingegebene Password ist ungültig.';
}
$stmt->close();

 
Kropff
30-03-2010, 22:49 
 
Ja, weil ich die Grundlagen schon alle kann
Sorry, aber du kannst keine Grundlagen.
Ich weiß nicht mehr weiter, ich habe gesucht und gesucht,
Weil du keine Grundlagen kannst! Tut mir wirklich leid für dich, aber du solltest noch Mal ganz von vorne anfangen. Vor Allem, was die Kommunikatuion zwischen PHP und MySQL angeht. Und dazu habe ich dir meine Seite empfohlen, die sich explizit an Anfänger richtet. Also lese und lerne. Denn die elementaren Grundlagen sollten schon vorhanden sein.

Peter

PS: Kopf hoch. Das ist nicht so schwierig, wenn man sich wirklich reinhängt. Ich hab es ja auch gelernt. Und ich bin Autodidakt. :)

BTW: Die Praxistutorials für PHP/MySQL werden gerade überarbeitet. Dauert noch etwa eine Woche, bis sie online sind.

 
Jama22
31-03-2010, 10:23 
 
So, ich habe mir gestern Abend nochmal die Grundlagen überfolgen, das meiste kenne ich wirklich schon,
ich habe dir alle bei PHP-Quake gemacht. Trotzdem weiß ich immer noch nicht genau wie, ich einen Fehler beheben soll,
der keine aussagekräftige Meldung hat.

Edit: Ich habe schon einen kleinen Fehler gefunden ein "}" war zu viel, das ist mir aufgefallen als ich mir die If-Bedienungen angeguckt habe,
funktsoniert aber trotzdem nicht so ganz.

 
TobiaZ
31-03-2010, 15:57 
 
Dann poste doch mal eine aktuelle Problemzusammenfassung: 1) Fehlermeldung 2) Soll/Ist Zustand 3) Aktuellen relevanten Code (der hat sich ja offensichtlich geändert), ...

 
Jama22
31-03-2010, 21:01 
 
Okay, ich versuchs euch mal zu erklären, also mein Problem ist das,
dass ich immer die Meldung bekommen, das mein Passwort falsch wäre,
das es aber nicht ist.
Ich habe mir die Post-Übergabe per echo ausgeben lassen und
dort steht extakt mein Passwort, nur ich weiß halt nicht was ich tun soll!

Ich hoffe ihr versteht mein Problem.

 
wahsaga
31-03-2010, 21:09 
 
Okay, ich versuchs euch mal zu erklären, also mein Problem ist das, dass ich immer die Meldung bekommen, das mein Passwort falsch wäre, das es aber nicht ist.
Das haben wir verstanden ...

Ich habe mir die Post-Übergabe per echo ausgeben lassen und
dort steht extakt mein Passwort
Fein.

nur ich weiß halt nicht was ich tun soll!
Wie schon gesagt: Sinnvolles Debugging betreiben.

Das ist bei prepared statements nicht ganz so einfach, weil man sich die nicht mal eben so zur Kontrolle ausgeben und dann per Copy&Paste testen kann.

Aber das Analogon der Query auf „herkömmlichem“ Wege zu erzeugen, also die Parameter, die derzeit per bind_param ans Statement gebunden werden, mal direkt in Textform ins Statement einzubauen, und das dann bspw. über phpMyAdmin zu testen, wäre ein nächster sinnvoller Schritt.


Bevor weitere „funzt nich“- oder „bringt auch nichts“-Aussagen kommen, dann aber bitte genau beschreiben, was du probiert hast und was das Ergebnis des Tests war.

 
wahsaga
31-03-2010, 23:25 
 
Wenn du weitere Fragen zum Thema Debugging hast, dann stelle die hier - Privatsupport per PN gibt's von mir nicht.

Wenn du Probleme hast, das von mir vorgeschlagene umzusetzen, dann frage bitte konkret nach, und beschreibe, was du versucht hast.

Grundlegende Hinweise zum Thema Debugging findest du bspw. hier: http://peterkropff.de/tutorials/php_fehler/php_fehler.htm


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:46 Uhr.