ubuntuusers.de

[mySQL PHP]Frontend für Eintragen und Suchen in Datenbank

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Ghaldez

Avatar von Ghaldez

Anmeldungsdatum:
14. April 2007

Beiträge: 796

Hallo Leute, Ich bin gerade dabei für ein RPG eine Art "Lagerliste" zu erstellen in der man Items Listen kann. Als Backend dient MySQL und fürs Frontend sollte PHP/HTML herhalten

Die Insert Seite funktioniert bestens.

Nur das Search modul klappt nicht.

Ich weiss nicht wie ich per POST die parameter an PHP übergeben soll

Ich hoffe euch fällt was ein.

Bitte haut mich nicht wegen dem Code es ist meine erste seite mit PHP

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"><title>Lagerliste - Einfügen</title>

</head><body>
<div style="text-align: center;"><big style="color: rgb(51, 51, 255);"><big>Lagerliste</big></big><br>
<a href="insert.html">Einfügen</a> - <a href="delete.html">Entfernen</a> - <a href="search.html">Suchen</a><br>
<br>
<div style="text-align: left;"></div>
<form action="insert.php" method="post">
<select name="class"><option>Barbar</option><option>Ritter</option><option>Hexer</option><option>Beschwörer</option><option>Jäger</option><option>Schütze</option></select>
<select name="itemtype"><option>Waffe</option><option>Rüstung</option><option>Amulett</option><option>Ring</option><option>Misc</option></select>
<select name="weaptype"><option>--</option><option>Schlitz Einhand</option><option>Schlitz Zweihand</option><option>Stumpf Einhand</option><option>Stumpd Zweihand</option><option>Durchbohrend Einhand</option><option>Durchbohrend Zweihand</option><option>Stab</option><option>Langbogen</option><option>Kurzbogen</option></select>
<select name="speed"><option>--</option><option>Sehr Schnell</option><option>Schnell</option><option>Mittel</option><option>Langsam</option><option>Sehr Langsam</option></select>
<select name="type"><option>Normal</option><option>Special</option><option>Magisch</option><option>Episch</option></select>
<br>
Rüstungspunkte: <input name="armor" type="int">
Reichweite: <input name="range" type="int">
<br>
Schaden: <input name="damage" type="int">
Extra: <input name="extra" type="text">
<input type="submit"></form>
</div>
</body></html>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22

<?php
$con = mysql_connect("localhost","User","Pass");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("item", $con);

$sql="INSERT INTO weap (class, itemtype, weaptype, speed, type, armor, range, damage, extra)
VALUES
('$_POST[class]','$_POST[itemtype]','$_POST[weaptype]','$_POST[speed]','$_POST[type]','$_POST[armor]','$_POST[range]','$_POST[damage]','$_POST[extra]')";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "1 record added";

mysql_close($con)
?> 

Das ist die Insert seite

und hier kommt die search seite

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"><title>Lagerliste - Einfügen</title>

</head><body>
<div style="text-align: center;"><big style="color: rgb(51, 51, 255);"><big>Lagerliste</big></big><br>
<a href="insert.html">Einfügen</a> - <a href="delete.html">Entfernen</a> - <a href="search.html">Suchen</a><br>
<br>
<div style="text-align: left;"></div>
<form action="search.php" method="post">
<select name="class">
<option>Barbar</option>
<option>Ritter</option>
<option>Hexer</option>
<option>Beschwörer</option>
<option>Jäger</option>
<option>Schütze</option>
</select>

<select name="itemtype">
<option>Waffe</option>
<option>Rüstung</option>
<option>Amulett</option>
<option>Ring</option>
<option>Misc</option>
</select>

<select name="weaptype">
<option>--</option>
<option>Schlitz Einhand</option>
<option>Schlitz Zweihand</option>
<option>Stumpf Einhand</option>
<option>Stumpf Zweihand</option>
<option>Durchbohrend Einhand</option>
<option>Durchbohrend Zweihand</option>
<option>Stab</option>
<option>Langbogen</option>
<option>Kurzbogen</option>
</select>

<select name="speed">
<option>--</option>
<option>Sehr Schnell</option>
<option>Schnell</option>
<option>Mittel</option>
<option>Langsam</option>
<option>Sehr Langsam</option>
</select>

<select name="type">
<option>Normal</option>
<option>Special</option>
<option>Magisch</option>
<option>Episch</option>
</select>

<br>
Rüstungspunkte: <input name="armor" type="int">
Reichweite: <input name="range" type="int">
<br>
Schaden: <input name="damage" type="int">
Extra: <input name="extra" type="text">
<input type="submit"></form>
</div>
</body></html>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$con = mysql_connect("localhost","root","gutentag");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("item", $con);


/*nur für class itemtype zum testen*/
$sql="SELECT * FROM weap WHERE class='$_POST[class]' AND itemtype='$_POST[itemtype]'";


while($row = mysql_fetch_array($result))
  {
  echo $row['class'] . " " . $row['itemtype'];
  echo "<br />";
  }

mysql_close($con)
?> 

MfG ~Ghaldez

Tokk

Avatar von Tokk

Anmeldungsdatum:
16. Dezember 2007

Beiträge: 63

Wohnort: Bayern

Hallo Ghaldez

Was mir spontan an deinem Code negativ auffällt, ist das du POST Variablen direkt in deine Query aufnimmst, so etwas sollte man niemals machen, denn ein potenzieller Angreifer hätte hier leichtes Spiel, die eine "böse" Query unterzujubeln, z.B. in dem er $_POST[itemtype] Verändert. Entweder die Variablen nochmals auf gültigkeit prüfen, oder wenigstens die Funktion mysql_escape_string() darüber laufen lassen:

1
2
3
$itemtype = mysql_escape_string($_POST[itemtype]);
$class = mysql_escape_string($_POST[class]);
$sql="SELECT * FROM weap WHERE class='$class' AND itemtype='$itemtype'";

Was mir weiterhin auffält, ist das in deinen <select> Blöcken die value für die Einträge fehlen. Normalerweise sieht das ungefähr so aus:

1
2
3
4
<select name="class">
<option value="eins">1</option>
<option value="zwei">2</option>
</select>

Und dann kannst du mit PHP der POST Variable den Wert entnehmen, der bei value angegeben ist, also wählt man im Bsp. z.B. 1 aus steht in $_POST["class"] der Wert "eins". Daher wundert mich eigentlich auch, das dein Eintragen Script schon funktioniert...

Nun ja, bei weiteren Fragen kannst du dich gerne wieder an mich wenden, ich habe mit einem Kumpel auch schon ein Online-Game mit PHP, MySQL und HTML erschaffen, Da hast du dir ganz schön was vorgenommen für deine erste PHP Arbeit. Wäre es möglich dein Spiel mal anzusehen?

MFG

Tokk

EDIT:

1
Rüstungspunkte: <input name="armor" type="int">

Typ Int gibt es nicht in HTML 😉 Es gibt "TEXT", "PASSWORD", "CHECKBOX", "RADIO", "SUBMIT", "RESET", "FILE", "HIDDEN", "IMAGE"und "BUTTON". In deinem Fall wäre "text" angebracht! Zumal dein Ganzer HTML Code leider auch nicht sehr Valide ist, darauf sollte man meiner Meinung nach schon von Anfang an achten. http://validator.w3.org/#validate_by_input Hier kann man das bequem nachprüfen!

Ghaldez

(Themenstarter)
Avatar von Ghaldez

Anmeldungsdatum:
14. April 2007

Beiträge: 796

Danke schonmal für deine Tips.

Was mich nur wundert ist ,der code ist von W3Schools "erlernt" http://www.w3schools.com/PHP/php_mysql_intro.asp

Daher dachte ich das der schon ziemlich standart konform sei.

Das mit dem <option> hatte auch ohne value funktioniert.

Ich werde mal den Code überarbeiten und mich dann melden 😉

MfG ~Ghaldez

Edit:Das Spiel ist Regnum 😉 http://regnumonline.com.ar

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Ghaldez schrieb:

Was mich nur wundert ist ,der code ist von W3Schools "erlernt" http://www.w3schools.com/PHP/php_mysql_intro.asp

W3Schools sollte erschossen werden.

Ansonsten wenn du es richtig machen möchtest dann escapt man gar keine Strings, sondern nutzt Prepared Statements für die übergabe der Parameter. Und nebenbei "mysql_escape_string" ist in PHP deprecated und wenn dann sollte man "mysql_real_escape_string" nutzen.

PHP hat mitlerweile aber auch eine Datenbankabstraktion http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html#4.3 mit der du Prepared Staements nutzen kannst.

Ein weiterer Vorteil der Abstraktion ist das du so auch einfach zwischen den Datenbanken wechseln kannst. Wenn du die ganzen mysql_* Funktionen nutzt bist du an MySQL gebunden, und beim wechsel der Datenbank müsstest du alles umschreiben.

Also möge die macht mit dir sein und mögest du von Dunklen Personen wie "Tokk" verschont werden. 😉 😛

Tokk

Avatar von Tokk

Anmeldungsdatum:
16. Dezember 2007

Beiträge: 63

Wohnort: Bayern

Auf grund meines Eindruckes befand ich es für Wertvoller, erstmal Tips zu MySQL zu geben und ihm nicht Abstraktion usw. aufzudrängen...

Auf php.net steht:

Hinweis:  Die Zeichen % und _ werden von mysql_escape_string() nicht maskiert.   Diese Funktion ist identisch zur Funktion mysql_real_escape_string() ausgenommen, dass mysql_real_escape_string() eine Verbindungs-Kennung benötigt und den String entsprechend zum aktuellen Zeichensatz maskiert. Der Funktion mysql_escape_string() kann keine Verbindungs-Kennung übergeben werden und der aktuelle Zeichensatz wird nicht berücksichtigt.  

somit bin ich der meinung, die Funktion mysql_escape_string reicht vollkommen aus.

Gruß

Tokk

P.S.: Woher weist du von meiner Vorliebe zum Dunkelen? 😛

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Na dann schau mal was bei php.net in den Hinweis Feld steht:

http://www.php.net/manual/de/function.mysql-escape-string.php

Hinweis: Diese Funktion ist seit PHP 4.3.0 veraltet. Benutzen Sie diese Funktion nicht und verwenden Sie stattdessen mysql_real_escape_string().

Von daher sollte man sich auch dran halten. Auf Englisch heißt es wie gesagt "deprecated" und dort steht auch das ab PHP 5.3.0 eine Warnung ausgegeben wird, sofern man diese Funktion nutzt. Das wird bestimmt nicht zum Spaß gemacht. 😉 Deprecated bedeutet das es ab einer neuen PHP Version entfernt werden kann.

Auf grund meines Eindruckes befand ich es für Wertvoller, erstmal Tips zu MySQL zu geben und ihm nicht Abstraktion usw. aufzudrängen...

Die Abstraktion sollte man definitiv nutzen da es eigentlich nur Vorteile hat. Der Weg wie er hier gezeigt wurde ist veraltet und hat Nachteile. Bei Perl z.B. gibt es nur DBI und das ist eine Datenbankabstraktion (ist sehr identisch zu PDO bei PHP) und alle Anfänger kommen damit klar und hatten noch nie Probleme damit. Auser natürlich du sagst mir jetzt das Perl nur klügere Menschen nutzen und es deswegen auf anhieb verstehen und bei PHP nur dumme Leute unterwegs sind. 😉

P.S.: Woher weist du von meiner Vorliebe zum Dunkelen?

Das ist ganz einfach. Du nutzt PHP!

Tokk

Avatar von Tokk

Anmeldungsdatum:
16. Dezember 2007

Beiträge: 63

Wohnort: Bayern

Hmmh, ok dazu kann ich net mehr viel sagen, ich wollte eigentlich ja auch nur darauf hinaus, das man nie Usereingaben direkt in eine Query einbinden sollte, wie man das realisiert ist eigentlich Ansichtssache. Das mit dem mysql_real_escape_string finde ich sehr Interessant und werde es in zukunft auch nutzen.

> P.S.: Woher weist du von meiner Vorliebe zum Dunkelen?

Das ist ganz einfach. Du nutzt PHP!

Dann scheinst du auch a weng ein schwarzer zu sein, sonst würdest dich damit ja kaum auskennen.

Und zur Abststraktion: Ich abstrahiere auch nie, da ich nicht erwarte, das MySQL so schnell eingestellt wird, und deshalb einfach immer verfügbar sein wird.

MFG

Tokk

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Hmmh, ok dazu kann ich net mehr viel sagen, ich wollte eigentlich ja auch nur darauf hinaus, das man nie Usereingaben direkt in eine Query einbinden sollte, wie man das realisiert ist eigentlich Ansichtssache.

Dagegen habe ich ja nichts gesagt das ist so auch korrekt. Allerdiengs sind Prepared Statements hier besser. Quoten ist von der Natur aus Fehleranfällig. Bei Prepared Statements wird ein extra Datenkanal geöffnet und es kann dort erst gar nicht zu Fehlern kommen. Ansonsten haben Prepared Statements noch einen Vorteil. Du erstellst die Query nur einmal und kannst sie öfters nutzen. Dadurch muss die Datenbank das Statement nur einmal Parsen und nur einmal einen sogenannten Query Plan erstellen. Danach nutzt du das Statement mehrmals. Das erhöht also auch noch die Performance wenn du es korrekt nutzt. Ohne Prepared Statements wird jedes SQL immer wieder neu geparsed und ein Query Plan erstellt.

Dann scheinst du auch a weng ein schwarzer zu sein, sonst würdest dich damit ja kaum auskennen.

Nö, ich habe nie wirklich in PHP Programmiert. Aber als Programmierer sollte man etwas die Konkurrenz kennen da man von überall lernen kann. Okay von PHP nicht, aber wenn man über PHP nichts weiß dann kann man nicht am tollen PHP Bashen teilnehmen. 😉 😀

Und zur Abststraktion: Ich abstrahiere auch nie, da ich nicht erwarte, das MySQL so schnell eingestellt wird, und deshalb einfach immer verfügbar sein wird.

Darum geht es gar nicht. Es geht darum das du zwischen den Datenbanken frei wählen kannst. Was ist wenn du z.B. ein etwas kleineres System hast? So eine Art Router, schwache CPU etc. Dort wäre es etwas sinnlos ein MySQL laufen zu lassen, und z.B. ein SQLite wäre deutlich sinvoller.

Auch zum entwickeln ist ein SQLite mal echt toll anstatt gleich immer eine Datenbank aufzusetzen, und zum erlernen erst recht. Jemanden erst beizubringen wie man ein MySQL Administriert ist da etwas komplexer. Und wenn er dann später seine Anwendung entwickelt und merkt SQLite reicht nicht mehr aus dann kann man immer noch zu MySQL wechseln. Ohne Programmcode anzupassen!

Und wenn man merkt man braucht eine echte Datenbank, kein MySQL, dann kann man anfangen und PostgreSQL nutzen. Ebenfalls ohne eine Zeile Code zu ändern!

Und je nachdem was du tust ist das eine oder andere Sinvoller. Okay als PHPler wohl uninteressant da die sowieso nur Web anwendungen machen. Allerdiengs wenn man z.B. ein GUI Programm schreibt ist es auch nett eine Datenbank zu nutzen, aber nicht gleich ein komplettes MySQL aufzusetzen. SQLite wird zum beispiel von Firefox 3 und noch ein paar anderen programmen genutzt. Glaube auch Amarok etc. Da eignet sich soetwas deutlich besser als wenn du für die nutzung von Firefox noch vorher ein MySQL Server aufsetzen musst.

Der Punkt an einer Abstrakten API ist es eben das du nur ein einziges Interface lernst, und nicht für jede Datenbank ein anderes Interface. Du kannst je nach lage eine andere Datenbank wählen die für die Situation besser geeignet ist. Ich würde es als ziemlich verschwendet ansehen eine direkte mysql anbindung zu lernen und wenn man auf einmal eine GUI Anwendung schreibt auf einmal eine zweite, dritte? Datenbank API zu lernen.

Wenn du natürlich hingehst und sehr angepassten SQL nutzt dass nur das verwendete RDBMS kennt, dann ist es letztendlich auch wieder für die Katz. Aber immerhin profitierst du trotzdem davon das nur 1 interface lernst, es sicherer ist und du eine höhere performance haben kannst. Und für eine Portierung musst du evtl nur etwas SQL anpassen.

Obwohl es zu letzteren auch wieder ORMs gibt die die SQL generierung abnimmt und für jede Datenbank speziellen SQL Statements erzeugen kann. ORMs sind aber ein Thema für sich und muss man als anfänger definitiv nicht können und sollte man wohl auch erstmal nicht.

Tokk

Avatar von Tokk

Anmeldungsdatum:
16. Dezember 2007

Beiträge: 63

Wohnort: Bayern

Ja, ok, allerdings wäre mir neu, dass man mit PHP embedded Systems wie einen Router programmieren kann.

Amarok kann übrigends auch MySQL, ich nutze das.

So, aber mal zurück zum Thema: Hier war die Frage warum die geschriebene Anwendung nicht funktioniert und ich denke, das liegt nicht an der nicht genuzten Abstraktion 😉

MFG

Tokk

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Tokk schrieb:

Ja, ok, allerdings wäre mir neu, dass man mit PHP embedded Systems wie einen Router programmieren kann.

Du sollst ja nicht den Router selber Programmieren sondern dort eine Anwendung drauf laufen lassen. Und auf mein Router läuft z.B. eine Webanwendung. Ansonsten meine ich generell kleinere Systeme. Gibt ja z.B. die günstige Atom Platform. Okay da würde auch MySQL drauf laufen, aber wenn man es nicht braucht warum dann nutzen? SQLite ist z.B. auch Performanter wenn man wenige Requests hat.

Amarok kann übrigends auch MySQL, ich nutze das.

Siehst du. Und mit einer Abstrakten API gewinnst du diese Vorteile das deine Nutzer entscheiden können was sie nutzen wollen. Oder würdest du einen haufen von if..elsif..elsif strukturen einbauen zum abfragen? Sprich wenn mysql dann "mysql_query(...)", wenn SQLite dann "sqlite_query(...)", wenn ...

Wäre ziemlich dumm und Zeitaufwendig. Eine Abstrakte API wie PDO erledigt das für dich.

So, aber mal zurück zum Thema: Hier war die Frage warum die geschriebene Anwendung nicht funktioniert und ich denke, das liegt nicht an der nicht genuzten Abstraktion 😉

Nein, aber man sollte darauf hinweisen wenn man etwas "besser" Lösen kann. Vorallem wenn jemand gerade neu anfängt zu Lernen sollte er es gleich richtig lernen. Und nicht den falschen weg gehen. Das ist komplizierter und Zeitaufwendiger.

Jacore

Anmeldungsdatum:
25. Mai 2008

Beiträge: 550

Wenn schon Abstraktion, dann lieber gleich DDDBL anstelle vom purem PDO.

Tokk schrieb:

So, aber mal zurück zum Thema: Hier war die Frage warum die geschriebene Anwendung nicht funktioniert und ich denke, das liegt nicht an der nicht genuzten Abstraktion 😉

Ist das nun geklärt? Du wolltest das Script ja an sich nochmal posten. 😉

Jedenfalls ist es gerade auch bei einem Online-Spiel sehr wichtig, dass Du alle Usereingaben (GET/POST/COOKIE) stets validierst und bei der Ausgabe bzw. beim Eintragen in die DB escapest. Gerade bei Spielen schreibe ich, weil die User hier starke Interessen haben, Einfluss aufs Spielgeschehen zu haben.. Cheats/Hacks sind ja bekannterweise STANDARD bei solchen Spielen und es gibt eine Vielzahl von Beispielen, wo die eigene Userbase das Spiel quasi selbst zerstört hat.

Die MYSQL-Verbindung als User "root" laufen zu lassen, ist nebenbei erwähnt, absolut keine gute Idee, bitte lege Dir einen Benutzer mit beschnittenen Rechten an. Bestenfalls für jede einzelne Applikation einen. Ein Passwort wie "gutentag" ist btw auch keine gute Idee. Ich hoffe das war nicht dein echtes PW.

Gruß

Antworten |