Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mein PHP-Frage-Thread



July
12.07.2005, 20:16
Ich versuche gerade, mich mit PHP auseinander zu setzen, da ich am 10. August ne Hausarbeit abgeben muss. Im Februar hatte mir dead_orc (ich hoffe mal, der nick ist jetzt richtig, kann mich nur noch an den deutschen erinnern :D) bei nem Gästebuch geholfen, da ichs zeitlich aber nicht mehr geschafft hab, den Rest zu machen, hab ich es erst gar nicht abgegeben.
Jetzt sitz ich hier und versuchs nochmal, hab mir das Ding angeguckt, hab mir auch diverse kleine Programme aus nem Online-Handbuch, welches unser Dozent ins Netz gestellt hat, angeguckt. Also in nen Editor kopiert, gespeichert und unter localhost gestartet. Hab dafür XAMPP installiert.

Jetzt ist mein Problem, dass ich eben ein komisches Gästebuch erstellen soll, bei dem die Datenbank erst im Skript angelegt wird, sofern sie nicht schon vorhanden ist, weil ein Eintrag drin steht.
Vielleicht hab ich grad nen Brett vorm Kopf oder ich weiß es nicht. Aber kann ich irgendwo nachgucken, ob wirklich ne Datenbank angelegt wurde? Weil wenn ich das schreibe, was ich denke, was man schreiben sollte, dann passiert irgendwie nix wirklich. Also legt er irgendwo ne kleine Datei an, die dann den Namen der DB trägt, den ich gewählt habe?
Und kann mir vielleicht mal jemand den Code-Schnipsel aufschreiben, wo eben gesagt wird, dass eine Datenbank 'created' wird, und wie es dann aussehen muss, dass sie beim nächsten Aufruf nicht nochmal erstellt wird, sondern dass sie eben nur dann erstellt wird, wenn sie noch nicht existiert und sonst einfach ganz normal aufgerufen wird?!

Ich hatte mir das jetzt irgendwie so gedacht (ist bestimmt falsch >_> aber wär nett, wenn mir jemand sagt, warum wieso und weshalb *G*) am Anfang:


<?php
$db = mysql_connect("localhost", "root");
$db_name = "gbtest";
mysql_query("create database if not exists " .$db_name);
$anlegen = "create table guestbook ( ";
$anlegen .= "name varchar(30), ";
$anlegen .= "ort varchar(30), ";
$anlegen .= "eintrag text )";
mysql_query($anlegen);
mysql_select_db($db_name);


Ähm ja, Threadtitel ist vielleicht nicht gerade aussagekräftig, aber ich werd mit sicherheit noch zig weitere Fragen haben *G*

DFYX
12.07.2005, 20:46
mysql_select_db vor dem create table.

July
12.07.2005, 21:21
Das hilft mir aber trotzdem nicht, ich weiß jetzt trotzdem nicht, ob irgendwo steht, dass ne Datenbank plus Tabelle angelegt wurde oder nicht. :(

Und wenn ich jetzt diesen code hier nehme (der ist aus nem Buch):

<html>
<head>
<?php
if ($gesendet)
{
$db = mysql_connect();

$sqlab = "insert personen";
$sqlab .= "(name, vorname, personalnummer,";
$sqlab .= " gehalt, geburtstag) values ";
$sqlab .= "('$na', '$vn', $pn, $ge, '$gt')";

mysql_db_query("firma", $sqlab);

$num = mysql_affected_rows();
if ($num>0)
echo "Es wurde 1 Datensatz hinzugefügt<p>";
else
{
echo "Es ist ein Fehler aufgetreten, ";
echo "es wurde kein Datensatz hinzugefügt<p>";
}
mysql_close($db);
}
?>
</head>

<body>
Geben Sie einen vollständigen Datensatz ein und senden Sie das
Formular ab:
<form action = "uf13.php" method = "post">
<input name="na"> Name<p>
<input name="vn"> Vorname<p>
<input name="pn"> Personalnummer (eine ganze Zahl)<p>
<input name="ge"> Gehalt (Nachkommastellen mit Punkt)<p>
<input name="gt">
Geburtsdatum (in der Form JJJJ-MM-TT)<p>
<input type="submit" name="gesendet">
<input type="reset">
</form>

Alle Datensätze <a href="uf07.php">anzeigen</a>
</body>
</html>

Und dann das von mir da einfüge, dann müsste doch eigentlich sowas hier rauskommen, oder nicht?

<html>
<head>
<?php
if ($gesendet)
{
$db = mysql_connect();
$db_name = "gbtest"; // ab hier ist das sozusagen von mir
mysql_query("create database if not exists " .$db_name);
mysql_select_db($db_name);
$anlegen = "create table personen ( ";
$anlegen .= "name varchar(30), ";
$anlegen .= "vorname varchar(30), ";
$anlegen .= "personalnummer integer,";
$anlegen .= "gehalt decimal(8,2),";
$anlegen .= "geburtstag date";
mysql_query($anlegen); // bis hier hin
$sqlab = "insert personen";
$sqlab .= "(name, vorname, personalnummer,";
$sqlab .= " gehalt, geburtstag) values ";
$sqlab .= "('$na', '$vn', $pn, $ge, '$gt')";

mysql_query($sqlab);

$num = mysql_affected_rows();
if ($num>0)
echo "Es wurde 1 Datensatz hinzugefügt<p>";
else
{
echo "Es ist ein Fehler aufgetreten, ";
echo "es wurde kein Datensatz hinzugefügt<p>";
}
}
?>
</head>

<body>
Geben Sie einen vollständigen Datensatz ein und senden Sie das
Formular ab:
<form action = "<?php $PHP_SELF ?>" method = "post">
<input name="na"> Name<p>
<input name="vn"> Vorname<p>
<input name="pn"> Personalnummer (eine ganze Zahl)<p>
<input name="ge"> Gehalt (Nachkommastellen mit Punkt)<p>
<input name="gt">
Geburtsdatum (in der Form JJJJ-MM-TT)<p>
<input type="submit" name="gesendet">
<input type="reset">
</form>
</body>
</html>

Und theoretisch müsste er mir doch dann zumindest, nachdem ich alles eingegeben habe, sagen, dass ein Datensatz angelegt wurde. Wieso tut er das dann nicht?
Ich glaub, ich sollte ins Bett gehen :-/ vielleicht hab ich morgen nen klaren Kopf und kann wieder denken, aber mir lässt das sonst wieder keine Ruhe >_>

DFYX
12.07.2005, 21:36
Es ist INSERT INTO personen, nicht INSERT personen. Ach ja, gewöhn dir bitte der Übersicht halber an, SQL Befehle groß zu schreiben. Dann kann man die Befehle leichter von den Werten und Tabellennamen unterscheiden.

Überhaupt würde ich das Buch sofort in die Tonne hauen.
1. Offensichtlich fehlerhafter Code
2. Der Output ist alles andere als standardkonform. Ich bin ja auch nich der Typ, der wirklich alles streng nach HTML 4 oder gar XHTML Standard macht, aber Zeilenumbrüche mit einem nicht geschlossenen <p>, das tut schon sehr weh.

Außerdem rate ich davon ab, die Befehle über mehrere Zeilen mit .= aneinander zu hängen. Da kommt man leicht mit Leerzeichen durcheinander und es wird auch nicht unbedingt leichter, den Code später wieder zu verstehen. Aber das ist wohl Geschmackssache.

July
13.07.2005, 07:33
Hm, na gut, ich dachte, für die Grundlagen würde es einigermaßen gehen, aber wenn selbst der Code im Buch schon nicht funktioniert >_>

Jedenfalls bleibt mein Problem immer noch bestehen, auch wenn ich da noch das Into reinpacke. Er gibt mir immer noch die Meldung aus, dass kein Datensatz hinzugefügt wurde. Wieso nur :(

July
13.07.2005, 12:46
sorry for Doppelpost, aber geht ja nicht anders.

Also, ich schaffst jetzt soweit, dass meine Datenbank angelegt wird sowie meine Tabelle. Weiß auch, wo ich das dann nachgucken kann, obs wirklich geklappt hat.

Jetzt hab ich aber ein oder zwei neue fragen.

1. Ich sage ja zu beginn, dass er eine Datenbank erstellen soll, sofern diese noch nciht existiert. Kein Problem, kann ja einfach "CREATE DATABASE IF NOT EXISTS" schreiben.
Danach muss ich aber auch noch eine Tabelle anlegen, damit er die Einträge irgendwo reinspeichert. Wie mach ich das in dem Fall, dass er da nicht beim nächsten Mal sagt: "Die tabelle gibts aber schon."?! Probiert hab ichs mit CREATE TABLE IF NOT EXISTS, aber das geht scheinbar nicht, da meint er zu mir:

MyISAM table 'personen' is in use (most likely by a MERGE table). Try FLUSH TABLES.
Ich kann damit nur leider nicht viel anfangen, was genau bedeutet Flush? Hilft mir das bei meinem Problem? Wenn ja, wie muss ich das dann formulieren, wenn nein, wie kann ich das sonst machen?

2. Wenn ich was eingeben will, um halt mal zu testen, ob er auch in meine Tabelle was abspeichert, kommt immer folgende Meldung:
Unknown column 'july' in 'field list'
Was heißt das, wieso tut er das, wieso speichert ers nicht einfach in die Datenbank? Ich meine, der Datentyp VARCHAR mit 30 Zeichen müsste doch ausreichen? Oder woran liegt das?

fanrpg
13.07.2005, 12:51
Versuchs ma mit if
also so ungefähr


if($db != "")
{
//Hier der Code der webseite
}
else
{
//Hier der Code das die Tabelle erstellt werden soll
}
Oder ich hab dich jetzt nicht wirklich verstanden

dadie
13.07.2005, 13:03
Also bei mir funtz das o.O



CREATE TABLE IF NOT EXISTS Tabelenname (
Datendertabele
)


Funtz bei mir immer o.O

July
13.07.2005, 13:11
Hm, vielleicht liegts auch an was anderem?

Ich hab das eben so gemacht, dass ich den Ordner, der für die DB angelegt wird, mit den DAteien, die für die Tabellen da sind, gelöscht habe. Damit also noch gar nix da ist und alles erzeugt wird.

Dann hab ich den Code ausgeführt, wo nur CREATE TABLE personen drin steht, hab dann in mein Formular was eingegeben (was dann wieder zu meinem 2. Problem geführt hat, aber das is jetzt mal eben nicht so wichtig). Dann hab ich nochmal was eingegeben und die Meldung kam, dass die Tabelle schon existiert, ist ja auch klar, hab ja nicht gesagt, dass er die Tabelle nur dann anlegen soll, wenn sie NICHT existiert.

So, dann hab ich meinen Code verändert und das mit dem IF NOT EXISTS bei der Tabelle eingefügt. Dann hab ich wieder meinen Code ausgeführt und diesmal hat er nicht gemeckert, dass die Tabelle ja schon vorhanden wäre. Insofern müsste es eigentlich doch gehen.

Neues Problem ist jetzt, wenn ich das IF NOT EXISTS stehen lasse und dann den Ordner mit dem Kram lösche, kommt beim ersten Aufrufen des Codes (wo ja dann nix mehr da ist und eigentlich alles neu angelegt werden soll) diese komische Meldung:

MyISAM table 'personen' is in use (most likely by a MERGE table). Try FLUSH TABLES.

Was heißt das, was muss ich machen, dass es auch mit IF NOT EXISTS funktioniert?
Wie ich das hasse, dass es nie so geht, wie ich mir das vorstelle *g*

Und wär auch schön, wenn mir jemand sagen kann, warum ich nix eintragen kann *G*

Chocwise
13.07.2005, 13:29
...Neues Problem ist jetzt, wenn ich das IF NOT EXISTS stehen lasse und dann den Ordner mit dem Kram lösche, kommt beim ersten Aufrufen des Codes (wo ja dann nix mehr da ist und eigentlich alles neu angelegt werden soll) diese komische Meldung:

MyISAM table 'personen' is in use (most likely by a MERGE table). Try FLUSH TABLES.

Was heißt das, was muss ich machen, dass es auch mit IF NOT EXISTS funktioniert?
Wie ich das hasse, dass es nie so geht, wie ich mir das vorstelle *g*

Und wär auch schön, wenn mir jemand sagen kann, warum ich nix eintragen kann *G*
Nunja... man sollte nicht einfach so die Datenordner MySQL's löschen. :D
Soweit ich weiß lagert MySQl einiges in einem Cache aus wenn es Queries bearbeitet.
Wenn du einen Datenordner nun löschst, kann es sein das MySQL Cachekonflikte erzeugt.

Ich empfehl dir PHPMyAdmin auf deinen Server zu laden und MySQL und die angelegten Datenbanken damit zu verwalten.
Oder benutz ein anderes MySQL-Administrationstool.
Ich gehe davon aus das XAMPP eins mitliefert.
Soweit ich weiß liefert XAMPP sogar PHPMyAdmin direkt mit.
Schau mal unter:
http://localhost/phpmyadmin/

Weshalb du nichts eintragen kannst weiß ich so auf Anhieb auchnicht. Ich bin zu faul deinen Code nun genau zu analysieren, sorry.
Überprüf mal mit PHPMySQL selbst die Strukturen der angelegten Tabelle(n). Wenn dort ein Fehler vorliegt, findest du ihn so vielleicht besser.

July
13.07.2005, 13:43
Ah, gut zu wissen :-) Damit wär ja schonmal ein Problem weniger auf der Welt. Also löschen immer über phpmyadmin.

Nur, was mach ich jetzt mit dem anderen Problem, wie krieg ich meine Daten da jetzt rein?

edit: Hm, hab die Tabellen eigentlich schon vorher mit PHPmyadmin angelegt und dann die Syntax übernommen. naja, ich werds nochmal testen und dann mal editieren, falls ich was neues rausbekommen sollte >_>

Chocwise
13.07.2005, 13:56
Ah, gut zu wissen :-) Damit wär ja schonmal ein Problem weniger auf der Welt. Also löschen immer über phpmyadmin.

Nur, was mach ich jetzt mit dem anderen Problem, wie krieg ich meine Daten da jetzt rein?

edit: Hm, hab die Tabellen eigentlich schon vorher mit PHPmyadmin angelegt und dann die Syntax übernommen. naja, ich werds nochmal testen und dann mal editieren, falls ich was neues rausbekommen sollte >_>

Hier mal die Syntax wie ich sie für's Einfügen deines Datensatzes verwenden würde:

$arguments = "'$na','$vn','$pn','$ge','$gt'";
$fields = "name, vorname, personalnummer, gehalt, geburtstag";
$einfuegen = "INSERT INTO personen ($fields) VALUES($arguments)";
mysql_query($einfuegen);
Überprüf ob wirklich alle Felder so existieren wie sie im INSERT-Query angesprochen werden. Check auch nochmal auf Tippfehler.
Lässt man sich keinen MySQL-Error ausgeben, verschweigt MySQL gerne das dort der Fehler liegt und meldet einfach gar nichts auch wenn nichts angelegt wurde durch einen Fehler.

Durch deinen Code steig ich nicht so recht durch. Ist zu unterschiedlich von der Syntax die ich gewohnt bin zu benutzen.

July
13.07.2005, 14:03
Danke, du bist mein Held :D
Werd ich mich wohl daran gewöhnen müssen, es so zu machen wie du.
Wahrscheinlich liegts wieder an irgendwelchen kleinen Zeichen, eigentlich müsste es gleich sein, komisch.
Aber danke nochmal :) Ich hoffe, ich komm jetzt erstmal allein weiter *toitoitoi*

Chocwise
13.07.2005, 14:10
Danke, du bist mein Held :D
Werd ich mich wohl daran gewöhnen müssen, es so zu machen wie du.
Wahrscheinlich liegts wieder an irgendwelchen kleinen Zeichen, eigentlich müsste es gleich sein, komisch.
Aber danke nochmal :) Ich hoffe, ich komm jetzt erstmal allein weiter *toitoitoi*
Bei kleineren fragen sprech mich im MSN an. ;)

July
15.07.2005, 12:26
Hab mal wieder ne neue Frage (naja, wahrscheinlich nicht nur eine :D). Chocwise ist grad nicht da, also poste ichs einfach mal hier.

Ich hab jetzt soweit meinen Code, in dem ich die Datenbank plus tabelle erstelle, wenns sie noch nicht gibt, wo ich was eintragen kann und wos mir auch was ausgibt. Ist bisher erstmal nur so testmäßig, ob es überhaupt funktioniert, deshalb auch nicht auf irgendwelche Einrückungen achten bitte *g+ Die sind eh alle noch nicht richtig, hab öfter mal was rauskopiert und woanders eingefügt, deswegen stimmt das noch nicht so ganz.


<html>
<head>
<?php
if ($gesendet)
{
$db = mysql_connect("localhost", "root");
$db_name = gbtest;
$createdb="CREATE DATABASE IF NOT EXISTS " .$db_name;
mysql_query($createdb);
echo mysql_error();
mysql_select_db($db_name);
$ct="CREATE TABLE IF NOT EXISTS personen (name VARCHAR( 30 ), vorname VARCHAR( 30 ))";
mysql_query($ct);
echo mysql_error();
$arguments = "'$na','$vn'";
$fields = "name, vorname";
$einfuegen = "INSERT INTO personen ($fields) VALUES($arguments)";
mysql_query($einfuegen);
echo mysql_error();

$ausgabe = "select * from personen;";
$res = mysql_query($ausgabe);
echo mysql_error();
}
?>
</head>

<body>
Geben Sie einen vollständigen Datensatz ein und senden Sie das
Formular ab:
<form action = "<?php $PHP_SELF ?>" method = "post">
<input type="text" name="na"> Name<p>
<input name="vn"> Vorname<p>
<input type="submit" name="gesendet">
<input type="reset">
</form>
<?php
$num = mysql_num_rows($res);
echo "$num Datensätze gefunden<br>";

for ($i=0; $i<$num; $i++)
{
$na = mysql_result($res, $i, "name");
$vn = mysql_result($res, $i, "vorname");
echo "$na, $vn <br>";
}
?>
</body>
</html>

Jetzt kann ich aber leider auch Einträge machen, wo einfach ein leerzeichen oder gar nix drinsteht. Das soll so aber nicht sein. Habs mit
$ct="CREATE TABLE IF NOT EXISTS personen (name VARCHAR( 30 ) NOT NULL, vorname VARCHAR( 30 ) NOT NULL)";
probiert, aber das bringt auch nix, kann trotzdem einfach auf absenden klicken und angezeigt wird mir dann einfach nur ein Komma, was sozusagen die beiden Einträge voneinander abgrenzt *G*

Ich hab dann folgendes eingefügt, vor das $arguments = "'$na','$vn'";


$na=trim($na);
$vn=trim($vn);
if(!$na){$fehler="Bitte gib einen Namen ein!";}
if(!$vn){$fehler.="Bitte gib einen Vornamen ein!";}
echo $fehler;

Er gibt mir dann auch den Satz aus, der erscheinen soll, wenn irgendwo was nicht eingegeben wurde, aber einen Datzensatz legt er trotzdem an. Woran liegt das? Also kann ich ihm irgendwie verbieten, dass er auf jeden fall was eingeben MUSS? Ist jetzt egal, ob sich das nur auf eins von beiden bezieht oder so, übertragen kann ichs ja selbst.
Müsste es mit NOT NULL gehen und ich hab was falsch gemacht? Aber dann müsste ich ja auch ne Fehlermeldung durch dieses echo mysql_error() bekommen?!


So, und wo ich grad dabei bin einen Post zu verfassen, kann ich gleich mal weiterfragen.
Soll ja wie gesagt eine Hausarbeit abgeben. Und der Lehrer will es so haben, dass er die Dateien einfach in seinen htdocs-Ordner kopieren kann und losgehts. Bei dem GB ist das ja nicht weiter schwer, das legt ja von selbst eine Datenbank an und alles.
Jetzt muss ich aber noch ein Skript basteln, wo Bilder, die in einer Datenbank gespeichert werden, per Random aufgerufen werden, wenn man die Seite aktualisiert. Kennt ja sicher jeder. Nur wenn ich die Datenbank anlege über phpmyadmin zum Beispiel, dann ist die ja in einem (oder mehreren?) anderen Ordner (weiß jetzt nur, dass er eben in dem mysql-Ordner ist). Wie kann ich es in dem Fall hinbekommen, ihm die Dateien zukommen zu lassen, ohne ihm eine 3-Seitenanweisung zu geben, welche Datei er wohin packen muss? Gibt es eine Möglichkeit?

Latency
15.07.2005, 13:02
Ich hab deinen Post zwar nicht komplett durchgelesen, jedoch ist mir ein kleine Fehler in deinem letzen PHP-Block aufgefallen.

trim() liefert einen String zurück, dh. bei $na = trim(" "); wäre $na = ""; und nicht false, so wie du es überprüfst.

Das Skript sollte also eher so aussehen, damit deine Fehlerausgabe funktioniert.

$na=trim($na);
$vn=trim($vn);
if(!empty($na)){$fehler="Bitte gib einen Namen ein!";}
if(!empty($vn)){$fehler.="Bitte gib einen Vornamen ein!";}
echo $fehler;

edit:
Zu deinem letzen Absatz, du könntest die Tabellen der Bilder samt Inhalt (=Bildern) per phpmyadmin exportieren und dann per Skript wieder anlegen. Dann müsste er nämlich nur achten, dass die *.sql Datei im richtigen Verzeichniss liegt.

edit2:
Stimmt, das ! muss weg, dumme angewohnheit von meinen Scripten dort verwende ich fast ausschlieslich !empty() ^^°

July
15.07.2005, 13:06
Ah vielen Dank :) Werd das gleich mal ändern. hab eben auch noch weiter probiert und ne Lösung gefunden, wo er weder leere Einträge noch Einträge nimmt, die keine Leerzeichen haben. Also scheints ja irgendwie doch mit trim gehen zu müssen?! Naja egal ^^

Hat sich im Prinzip also erledigt, aber wär schön, wenn mir vielleicht noch jemand mit XAMPP und HTDOCS weiterhelfen könnte :)

edit: Exportieren? hm, muss ich mal ausprobieren, wie das geht ^^ Danke jedenfalls :)

ach ja, mit dem empty: das geht nur, wenn ich das ! weglasse, ansonsten gibt er mir nämlich die Fehlermeldung verdreht aus *g*

July
15.07.2005, 19:57
Ich glaub ich spring gleich aus dem Fenster -.- Jetzt hab ich ein Problem, was ich überhaupt nicht verstehe.

Hab an meinem GB rumgewerkelt, und mir fehlte ja bisher immer noch ein Feld, wo man dann den Eintrag machen kann. Gut, dachte ich, füg ich halt beim Anlegen der Tabelle und bei den ganzen Variablen überall noch was mit ein. Hab ich gemacht, hab die Seite neu aufgerufen, aber was ist? Es wird nix angezeigt, überhaupt nix, null, nicht mal ne Fehlermeldung, nur ein weißer leerer Browser.
Ok, vielleicht ist irgendwo ein fehler, alles wieder weggemacht, was ich eingegeben habe, gespeichert, seite neu aufgerufen, immer noch alles leer. Dabei hat der Code davor ja funktioniert -.- Ich meine, wieso zeigt er mir einfach NICHTS an? Das kann doch nicht sein?
Und bevor jetzt jemand sagt, ich hätte irgendwie was zu viel gelöscht: Ich hab das ganze 4 oder 5 mal durchgespielt und es ist jedes mal so. War heute schon auf Arbeit so, und hier jetzt auch ein paar mal. Und so blöd, dass ich jedes mal was zu viel lösche, bin ich nicht. Außerdem müsste er mir doch dann zumindest nen parse-error oder sowas anzeigen?!?

fanrpg
15.07.2005, 20:09
Vielleicht irgend wo nen Leerzeichen zu viel(zu wenig) ?
mysql_error hast ja aber änder das jeweils in
mysql_query(x) or die(mysql_error()) das ist wesentlich besser (auch wenn meistens nichts anderes erreicht wird)

Wirklich alles richtig? gerade bei den MySQL Befehlen können kleinere Fehler dazu führen das gar nichts ausgeführt wird!

July
15.07.2005, 20:25
Hm, komische Sache. Es liegt an einem einzigen Teil, wie ich jetzt rausgefunden habe. Und zwar hatte ich meinen Code ja aufgesplittet in zwei Teile, oben stand der, wo ich mit der Datenbank verbinde und unten der, wo ich die Daten ausgebe, weil ich wollte, dass die Daten unter dem Formular ausgegeben werden und nicht dadrüber (sieht ja auch dumm aus :D)
heute mittag gings, jetzt meckert er rum, wenn ich das trennen will und nimmt das nur noch als ganzes. Naja, jetzt hab ich den kompletten php-code unter das Formular geschoben, dann gehts auch >_> Merkwürdig >_<

fanrpg
15.07.2005, 20:30
Andere Möglichkeit gib das ganze Formular als echo aus dann müsste das auch so funktionieren

July
15.07.2005, 21:12
Hast recht, daran hab ich gar nicht gedacht. Aber jetzt bin ich zu faul, das noch umzuschreiben, das mach ich höchstens, wenn sowas nochmal auftritt :D

Ich hab aber noch eine Frage. Und zwar bin ich sehr stolz drauf, dass ich jetzt ein Feld für den Namen, einen für den Vornamen und einen für den Eintrag hab. Die werden mir auch alle drei ausgegeben. Und ich habs geschafft, einen Index zu erstellen, um so den ältesten Beitrag nach unten zu packen.
Hatte aber erst überlegt, es übers Datum zu machen, was ich aber gar nicht kann, weil ich nicht weiß, wie das geht. Mit meiner Lösung bin ich jetzt zufrieden, sie funktioniert ja auch. Aber die tolle Idee mit dem Datum hat sich jetzt leider festgesetzt und jetzt wüsste ich gern, ob es geht (naja wird sicherlich gehen *g*), dass die aktuelle Zeit gespeichert wird, wenn jemand einen Eintrag macht und die hinterher auch mit angezeigt wird, wenn man den Eintrag ausgibt. Aber das möcht ich nur, wenns nicht zuuuuuuu kompliziert und zu viel unübersichtlicher code ist (kann ich mir aber gar nicht wirklich vorstellen). Bis jetzt ist mein Skript nämlich irgendwie schön klein und übersichtlich und ich versteh alles, was ich da tue und das macht mich froh, dann kann ich dem wenigstens hinterher schöne Kommentare in den Code packen *g*
hoffe, dass mir das jemand (bis) morgen beantworten kann, heute werd ich daran sicher nichts mehr machen, hab keine Lust mehr *g* Aber wär cool, wenn ich das ganze Ding morgen abschließen kann, fehlt dann ja nur noch das Äußere ^_^*freu*

fanrpg
15.07.2005, 22:08
Grundformat:


$datum = date(d.m.Y);
$uhrzeit = date(H:i);
echo $datum, " - ", $uhrzeit, "Uhr";

Das kann man dann auch noch in einer Variabele speichern und dies dann mit auf die DB packen


$datum = date(d.m.Y);
$uhrzeit = date(H:i);
$sql = "INSERT INTO `wasweissich` (datum, uhrzeit) VALUES ('$datum', '$uhrzeit')";
$query = mysql_query($sql);

dadie
15.07.2005, 22:30
-.- nur so am rande es gibt ne erfindung die nent man Timestamp ;)
damit wird das ganze viel Dynamischer und wenn sie die sekunden angezeigt haben will kann sie das machen oder lassen :)

fanrpg
15.07.2005, 22:39
dann halt mit timestamp



$timestamp = time();
$datum = date(d.m.Y, $timestamp);
$uhrzeit = date(H:i, $timestamp);
$sql = "INSERT INTO `wasweissich` (datum, uhrzeit) VALUES ('$datum', '$uhrzeit')";
$query = mysql_query($sql);

dadie
15.07.2005, 22:46
-.- dann muss ich es Deutlicher sagen

2 Möglichkeiten

1,Man nutz den msql internen Timestamp
2,Man Speicher in die sql db time()

So das währe doch viel schöner brauch nur 1 feld und ist Variable/Dynamisch :)

edit:


Aber meine Möglichkeit tuts auch :)

Joa aber meine ist Dynamisch ^^

fanrpg
15.07.2005, 22:52
sowas gibts? o.ô

:eek:

Aber meine Möglichkeit tuts auch :)

Chocwise
16.07.2005, 01:21
sowas gibts? o.ô

:eek:

Aber meine Möglichkeit tuts auch :)
Dadies ist aber allgemeingültige Konvention.
So hätte es auch kein "Index" gebraucht, wovon July sprach.
Man hätte einfach ab- oder aufsteigend, je nach Gusto nach Timestamp sortieren können da der Timestamp ein kontinuierlich im Wert steigender Integer ist. Kein String ohne Möglichkeit ihn sinnvoll zu sortieren.

Genug theoretisches Blahblah, hier die Scriptschnipsel:
Für's Eintragen des Timestamps in die DB-Tabelle:

$values = "'$_POST[name]','$_POST[message]',time()";
$fields = "name,message,timestamp";
$einfuegen = "INSERT INTO comments ($felder) VALUES($inhalt)";
Ich bin mir jetzt nicht 100% sicher ob time() da an der Stelle funktioniert. Notfalls einfach vorher den Wert von time() (welches immer den aktuellen Timestamp zurückgibt) an eine Variable übergeben und diese dann mit zu den values zu packen.
Und natürlich noch die Feld- und Variablennamen anpassen. ich hab ja keine Ahnung wie die heißen und welche es gibt.

Beim Auslesen dann einfach dies tun:
Angenommen du hast den Timestamp mit mysql_result() aus der Datenbank ausgelesen in die Variable $timestamp hinein.

echo(date("d.m.Y H:i",$timestamp));

Du siehst, im Grunde sinds nur eine Handvoll mehr Zeilen Code.
Denk dran in dem DB- und Tabellenerstellungsteil auch das Feld 'timestamp' anlegen zu lassen.


Hier noch ein "kleiner" Tipp, beachte ihn nur wenn du noch Lust hast dich eingehender mit der Materie zu befassen:
Soweit ich weiß ist mysql_result() innerhalb einer While-Schleife sehr Performancefressend. Überhaupt ist deine Lösung eher ungünstig.
Ein besonderes Merkmal deines SELECTs ist ja, das du im Grunde auf alle Felder in deiner Tabelle zugreifst. Also empfehl ich dir mysql_fetch_array.
Das sähe dann in etwa so aus:

while($output=mysql_fetch_array($res)){
echo "$output[na], $output[vn] am date("d.m.Y H:i",$output[timestamp]) <br>
$output[message]";
}

Die while()-Schleife ersetzt deine for()-Schleife.
mysql_fetch_array() liest also alles, was du zuvor mit deinem SELECT in der Datenbanktabelle zum Auslesen angesprochen hast, aus, so lange bist der Lesezeiger beim letzten auszugebenen Datensatz angekommen ist, überschreitet der Lesezeiger den letzten Datensatz, gibt die Funktion mysql_fetch_array() FALSE zurück und beendet damit automatisch die while-Schleife.

mysql_fetch_array() liest jeweils einen Datensatz in einen sogenannten Array.
Ich weiß nicht inwieweit du dich bereits mit Arrays auskennst, aber ich unterstell dir einfach mal mangelnde Kenntnisse. ;)
Ein Array ist im Grunde eine Variable die mehrere Werte haben kann. Stell dir vor eine Variable ist ein Blatt auf das du nur einen Wert schreiben kannst. Ein Array ist dann ein Stapel Blätter und auf jedes dieser Blätter kannst du einen Wert schreiben. Du kannst die einzelnen Blätter auch direkt ansprechen über den sogenannten Key. Der Key ist das, was in der Eckigen Klammer steht. Er bezeichnet jeweils einen Wert.
mysql_fetch_array() verwendet als key jeweils den Feldnamen. Du kannst nun also mit dem Array jedes Feld ansprechen, solange es auch im SELECT-Statement angewählt wurde. Du brauchst die Felder nicht noch einzelnd mit mysql_result() auslesen.
Da du alle Felder mit dem * innerhalb des SELECT-Statements ansprichst, kannst du auch auf jedes Feld über den Array zugreifen.

Wenn du vielelciht noch nach Timestamp sortieren möchtest, also aktuellste Beiträge zuerst oder ältester Beitrag zuerst, mach es so:

$ausgabe = "SELECT * FROM personen ORDER BY personen.timestamp ASC";

ASC steht für Ascending, aufsteigend.
DESC steht für Descending, absteigend.

BTW:
$ausgabe = "select * from personen;";
Das Semikolon innerhalb des Strings ist überflüssig, wenn nicht sogar falsch.
$ausgabe = "SELECT * FROM personen";
reicht vollkommen.

BTW²:
Du machst noch einige Fehler die typisch für mangelnde Erfahrung und Übung sind. Aber ich rieche großes Potential. Auch wenn es eher eine aufs Auge gedrückte Aufgabe ist, scheinst du dich mit Eigeninteresse damit zu beschäftigen. Hör bloß nicht auf mit PHP zu arbeiten. :)

July
16.07.2005, 13:43
Irgendwie klappt das mit der Zeit nicht so ganz. Als Ausgabe hab ich immer 01.01.1970 01:00.
Ich habs so gemacht, dass ich erst gesagt habe $zeit=time();
Um zu gucken, ob das auch funktioniert, hab ich mir die Variable ausgeben lassen, da kommt dann ja son schöner Sekundenwert raus, die seit 1970 vergangen sind.
Aber scheinbar hat er Probleme, das in die Tabelle zu speichern, wieso auch immer?!
Hab mir die Tabelle in phpmyadmin angeguckt und da steht immer bei jedem Eintrag 0000-00-00 00:00:00.

Vielleicht hab ich ja auch irgendwo im Code nen Fehler und blick das grad nicht ganz >_<
Liegt aber vielleicht auch daran, dass ich bei Chocis Variablen teilweise das Gefühl hatte, er hätte sich bei den Namen vertan.


<html>
<head>
</head>
<body>
Geben Sie einen vollständigen Datensatz ein und senden Sie das Formular ab:
<form action = "<?php $PHP_SELF ?>" method = "post">
<input type="text" name="na"> Name<p>
<input name="vn"> Vorname<p>
<textarea cols="30" rows="4" name="kommentar">
</textarea><p>
<input type="submit" name="gesendet">
<input type="reset">
</form>
<?php
if ($gesendet)
{
$db = mysql_connect("localhost", "root");
$db_name = gbtest;
$createdb="CREATE DATABASE IF NOT EXISTS " .$db_name;
mysql_query($createdb) or die (mysql_error());
mysql_select_db($db_name);
$ct="CREATE TABLE IF NOT EXISTS personen (nummer INT NOT NULL AUTO_INCREMENT, name VARCHAR(30), vorname VARCHAR(30), `timestamp` TIMESTAMP NOT NULL, eintrag TEXT, INDEX(nummer))";
mysql_query($ct) or die (mysql_error());
$zeit=time();
$arguments = "'$_POST[na]','$_POST[vn]', '$zeit', '$_POST[kommentar]'";
$fields = "name, vorname, timestamp, eintrag";
$na=trim($na);
$vn=trim($vn);
$kommentar=trim($kommentar);
if(empty($na)){$fehler="Bitte gib einen Namen ein!";}
if(empty($vn)){$fehler.="Bitte gib einen Vornamen ein!";}
if(empty($kommentar)){$fehler.="Bitte erstelle einen Eintrag!";}
if($fehler)
{echo $fehler;}
else
{
$einfuegen = "INSERT INTO personen ($fields) VALUES($arguments)";
mysql_query($einfuegen)or die (mysql_error());
$ausgabe = "select * from personen ORDER BY nummer DESC";
$res = mysql_query($ausgabe) or die (mysql_error());
$num = mysql_num_rows($res);
echo "$num Datensätze gefunden<br>";
for ($i=0; $i<$num; $i++)
{
$na = mysql_result($res, $i, "name");
$vn = mysql_result($res, $i, "vorname");
$kommentar = mysql_result($res, $i, "eintrag");
$datum = mysql_result($res, $i, "timestamp");
echo "$na, $vn, $kommentar";
echo(date("d.m.Y H:i",$datum));
echo "<br>";
}
}
}
?>
</body>
</html>

Das mit dem mysql_fetch_array() werd ich wohl erst zum Schluss ändern, wenn der Rest läuft. Hab davon schon gelesen, hatte das nur erstmal so gemacht, weil das das erste war, was mir über den Weg gelaufen ist und mir die Ausgabe präsentiert hatte, wollte ja testen, ob alles klappt und habs dann erstmal drin gelassen ^^
Ich denke, das mit dem Array werd ich hinkriegen, hoffe ich jedenfalls :) Wir hatten Arrays auch in Java schonmal.

dadie
16.07.2005, 13:49
Das Problem ist wenn du den SQL Timestamp nimmst musst du den SQL befehlt NOW() nehmen für die jetzige zeit.

oder du machst aus dem SQL Timestamp ein Intg Feld mit 255 und speicherrst darin den time() code

Lukas
16.07.2005, 13:50
oder du machst aus dem SQL Timestamp ein Intg Feld mit 255 und speicherrst darin den time() codeDir ist bewusst, dass ein (halbwegs aktueller) UNIX-Timestamp nur 10 Stellen hat? Demnach braucht man nur eine INT der Länge 10.

dadie
16.07.2005, 13:55
Dir ist bewusst, dass ein (halbwegs aktueller) UNIX-Timestamp nur 10 Stellen hat? Demnach braucht man nur eine INT der Länge 10.

Die Sekunden bleiben aber nicht stehn dann währe script für die nägsten paar tausenjahre lauffähig :D

Lukas
16.07.2005, 14:23
Die Sekunden bleiben aber nicht stehn dann währe script für die nägsten paar tausenjahre lauffähig :D10-stellige Timestamps sind noch etwas über 9 Jahre lang "aktuell". In ein paar tausend Jahren hast du schon wieder ganz andere Software. Wahrscheinlich hast du die schon lange, bevor du nicht mehr mit 10-stelligen Timestamps auskommst. Notfalls kann man die Tabelle immer noch modifizieren.

Chocwise
16.07.2005, 15:51
@ July:
Jo, wie die Kollegen schon sagten musst du den Feldtyp ändern.
Nur ist ein SQL-Timestamp kein UNIX-Timestamp.
Schaut euch mal diesen SQL-Timestamp an: 20050716163931
Wem fällt was auf?
Tipp: 2005.07.16 16:39:31
Also nur ein lächerlicher Timestamp-Abklatsch.
Ich empfehle also INT oder auch TINYTEXT(11) wenn du dich mulmig fühlen würdest mit den lediglich 10 INT-Stellen.

dead_orc
18.07.2005, 09:28
Man kann trotzdem einfach die MySQL-Funktion UNIX_TIMESTAMP() zum Einfügen des Timestamps benutzen, was ich persönlich sehr viel einfacher finde, als immer eine Variable mit time() zu erstellen und die dann im Query zu verbauen.

@Topic:
Welches von den Problemen besteht jetzt noch? o_o
Ich blick da net so ganz durch...

July
18.07.2005, 09:33
@Topic:
Welches von den Problemen besteht jetzt noch? o_o
Ich blick da net so ganz durch...

Bezüglich des Gästebuch gar keins mehr :) Die sind soweit alle gelöst. Jetzt muss ich nur noch meine Bilddatenbank erstellen, da hat Choci mir aber in MSN schon was zu gesagt und ihm hab ich vorhin ne PN geschrieben, da werd ich erstmal sehen, was da noch so kommt *hust*
Danach kommen bestimmt auch hier neue Fragen :D
Und danke nochmal an alle, die mir so schön geholfen haben ^_^ Ist echt klasse, dass man hier so schnell Antworten bekommt.

dadie
18.07.2005, 11:18
Man kann trotzdem einfach die MySQL-Funktion UNIX_TIMESTAMP() zum Einfügen des Timestamps benutzen, was ich persönlich sehr viel einfacher finde, als immer eine Variable mit time() zu erstellen und die dann im Query zu verbauen.


Warum ne variable o.O?

also ich schreibe das immer so


$query = "INSERT INTO `tabele` (`feld1`,`feld2`) VALUES('1111','".time()."')";

wo muss man da ne Variable verschwenden und wie ich oben schon sage es ist ne frage was man lieber hat SQL oder PHP :) das ergebniss ist aber gleich :)

July
22.07.2005, 15:23
*thread wieder rauskramt*

Habe eine Frage :)

Und zwar muss ich ja noch mein Bilderskript machen. Hab jetzt wieder eine Datenbank angelegt, eine Tabelle und will da einfach den Namen des Bildes einspeichern, bild1.jpg und bild2.jpg und so.
Hab das auch alles schön mit "INSERT INTO bildpfad (dateiname) VALUES ('bild1.jpg')"
gemacht, funktioniert auch alles, hab hinterher eine Tabelle mit meinen Bilder drin. Wenn ich aber das Skript aktualisiere, dann speichert der die alle nochmal da rein.
Kann ich das umgehen? Wenn ja, wie *g*

Chocwise
22.07.2005, 16:24
*thread wieder rauskramt*

Habe eine Frage :)

Und zwar muss ich ja noch mein Bilderskript machen. Hab jetzt wieder eine Datenbank angelegt, eine Tabelle und will da einfach den Namen des Bildes einspeichern, bild1.jpg und bild2.jpg und so.
Hab das auch alles schön mit "INSERT INTO bildpfad (dateiname) VALUES ('bild1.jpg')"
gemacht, funktioniert auch alles, hab hinterher eine Tabelle mit meinen Bilder drin. Wenn ich aber das Skript aktualisiere, dann speichert der die alle nochmal da rein.
Kann ich das umgehen? Wenn ja, wie *g*
Überprüfen ob es bereits in die Tabelle eingetragen wurde. Es reicht ja einmal abzufragen ob überhaupt schon etwas in der Datenbanktabelle steht.

z.B.:

$get = "SELECT * FROM tabelle";
if(mysql_num_rows($get)==0){
// Bilddaten eintragen
}
Das Dingen schaut nun ob bereits Datensätze in der Tabelle tabelle existieren. Wenn nicht, werden die Bilddaten eingetragen.
Es gibt aber noch unzählige andere Vorgehensweisen. Auch elegantere, sicherere, schönere, ... ;)

July
22.07.2005, 17:32
Hm, das funktioniert nicht so ganz. Aber da hier mal wieder der Fehler auftaucht, den ich immer habe, wenn ich irgendwo mysql_num_rows() verwende, kann ich die Frage ja auch mal stellen *g*

Das ist jetzt mein PHP-Code. Ohne das, was Chocwise da gepostet hat, gings, er hat eben nur alles beim aktualisieren neu eingetragen. Vielleicht kann man das mit dem Einfügen auch eleganter oder kürzer oder so lösen, aber das is ja erstmal egal.

Jedenfalls meint er, dass in der Zeile "if(mysql_num_rows($get)==0)" ein Fehler ist.
Und die Meldung, die er ausspuckt ist die:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\... (pfadangabe halt)

Das hab ich immer, wenn ich irgendwie diese Funktion benutze, hatte das beim Gästebuch auch schon, die scheint irgendwie zu haken, wenn es eben noch keine Einträge gibt.
Ich mein, er trägt dann meine Daten da zwar ein, aber wenn da immer erst ne Fehlermeldung kommt, find ich das nicht so schön.
Kann man da nicht was gegen machen?
Hab nämlich das gleiche Problem auch bei meinem Gästebuch. Wenn ich da noch nichts eingetragen habe, dann krieg ich auch diese tolle Meldung, also hab ichs am Ende so gelöst, dass man erstmal das formular sieht, und die einträge, die dann kommen, erst da sind, wenn mans abschickt, damit mindestens ein Eintrag vorhanden ist.
Sehr nervig irgendwie >_>


Das ist jetzt der PHP-Code von meiner bilddatenbank. variablen-Namen sind erstmal nur provisorisch, die müssen eh noch angepasst werden, weil der Dozent da so eigenwillig ist >_<


<?php
$database=mysql_connect("localhost", "root");
$name=bilder;
$erstellen="CREATE DATABASE IF NOT EXISTS " .$name;
mysql_query($erstellen) or die (mysql_error());
mysql_select_db($name);
$ct="CREATE TABLE IF NOT EXISTS bildpfad (dateiname TINYTEXT)";
mysql_query($ct) or die (mysql_error());
$get = "SELECT * FROM bildpfad";
if(mysql_num_rows($get)==0)
{
$einfuegen="INSERT INTO bildpfad (dateiname) VALUES ('bild1.jpg')";
mysql_query($einfuegen);
$einfuegen2="INSERT INTO bildpfad (dateiname) VALUES ('bild2.jpg')";
mysql_query($einfuegen2);
$einfuegen3="INSERT INTO bildpfad (dateiname) VALUES ('bild3.jpg')";
mysql_query($einfuegen3);
$einfuegen4="INSERT INTO bildpfad (dateiname) VALUES ('bild4.jpg')";
mysql_query($einfuegen4);
$einfuegen5="INSERT INTO bildpfad (dateiname) VALUES ('bild5.jpg')";
mysql_query($einfuegen5);
}

?>

Chocwise
22.07.2005, 17:57
Hm, das funktioniert nicht so ganz. Aber da hier mal wieder der Fehler auftaucht, den ich immer habe, wenn ich irgendwo mysql_num_rows() verwende, kann ich die Frage ja auch mal stellen *g*
...
Oi.
Wir haben den Query vergessen. :D

<?php
$database=mysql_connect("localhost", "root");
$name=bilder;
$erstellen="CREATE DATABASE IF NOT EXISTS " .$name;
mysql_query($erstellen) or die (mysql_error());
mysql_select_db($name);
$ct="CREATE TABLE IF NOT EXISTS bildpfad (dateiname TINYTEXT)";
mysql_query($ct) or die (mysql_error());
$get = mysql_query("SELECT * FROM bildpfad");
if(mysql_num_rows($get)==0)
{
$einfuegen="INSERT INTO bildpfad (dateiname) VALUES ('bild1.jpg')";
mysql_query($einfuegen);
$einfuegen2="INSERT INTO bildpfad (dateiname) VALUES ('bild2.jpg')";
mysql_query($einfuegen2);
$einfuegen3="INSERT INTO bildpfad (dateiname) VALUES ('bild3.jpg')";
mysql_query($einfuegen3);
$einfuegen4="INSERT INTO bildpfad (dateiname) VALUES ('bild4.jpg')";
mysql_query($einfuegen4);
$einfuegen5="INSERT INTO bildpfad (dateiname) VALUES ('bild5.jpg')";
mysql_query($einfuegen5);
}

?>
mysql_num_rows() kann mit einem String ala "SELECT * FROM bildpfad" nichts anfangen. Es braucht eine MySQl-Ressource... oder wie man das nennt. :D
Man muss also den String mit mysql_query() noch ausführen und das Ergebnis dieses Queries kann man dann mit mysql_num_rows() weiterverarbeiten.

Sorry, das hab ich vergessen. ;)

PS: Natürlich kannst du das alles noch etwas zusammenfssen, wenn du magst.
z.B.:

...
if(mysql_num_rows(mysql_query("SELECT * FROM bildpfad"))==0){
...
müsste funzen.

July
23.07.2005, 09:22
So, neues Problem >_>

Hab jetzt einfach (so wie Chocwise mir das mal erklärt hat) folgende zwei Zeilen unter den (berichtigten) Code, den ich als letztes gepostet habe, gehängt:

$sql = "SELECT * FROM bildpfad ORDER BY RAND() LIMIT 1";
$bild = mysql_result($sql,0,dateiname);

dateiname ist ja die Feldbezeichnung aus der Tabelle.

Jedenfalls krieg ich jetzt immer ne nette Fehlermeldung aus:
Warning: mysql_result(): supplied argument is not a valid MySQL result resource in C:/...

Wieso ist das so? Ich hab jetzt in alle schlauen bücher geguckt, die ich hier so rumliegen habe, aber es wird da nix gesagt, was mir selbst irgendwie helfen könnte >_>
Hoffe, ihr seid da schlauer als ich :D

NiKrYss
23.07.2005, 09:50
Der Fehler sollte auch hier wieder aufgrund des fehlenden Querys entstehen. Du musst zunächst mit mysql_query die entsprechende Resource-Id generieren und diese dann an mysql_result übergeben.

$sql = mysql_query("SELECT * FROM bildpfad ORDER BY RAND() LIMIT 1");
$bild = mysql_result($sql,0,dateiname);

so sollte es dann funktionieren :)

July
23.07.2005, 11:12
Der Fehler sollte auch hier wieder aufgrund des fehlenden Querys entstehen. Du musst zunächst mit mysql_query die entsprechende Resource-Id generieren und diese dann an mysql_result übergeben.

$sql = mysql_query("SELECT * FROM bildpfad ORDER BY RAND() LIMIT 1");
$bild = mysql_result($sql,0,dateiname);

so sollte es dann funktionieren :)

ah gut, ich glaub, jetzt hab ich das prinzip auch begriffen :D hoff ich jedenfalls >_> *weiter rumprobieren geht*
danke schön ^_^

Chocwise
23.07.2005, 14:46
Sorry July. Ich vergess die Queries immer so gerne.
Tut mir leid wenn ich dir dadurch Kopfzerbrechen bereitet hab. .__.'

July
25.07.2005, 08:53
Macht gar nix :-) Ich hätte ja eigentlich auch mal selbst drauf kommen können, mit etwas mehr überlegen vielleicht *hust*
Aber wenn man noch nicht so vertraut ist und weiß, wie die ganzen Funktionen funktionieren (und das auch nirgends steht >_>), frag ich immer, bevor ich mich ärgere *g*


Und wo wir dabei sind, eine Frage habe ich noch. Bei meinem Gästebuch ist es so, dass ein Eintrag mehrmals in eine Datenbank geschrieben wird, wenn ich nur auf Aktualisieren klicke.
Ich wollte mal wissen, ob es dafür eine relativ einfache Möglichkeit gibt, das zu lösen.
Hatte in einem Buch geguckt, da stand drin, dass es eher kompliziert ist und dass sie das daher nicht erklären (toll >_>).
Falls es zu schwer ist, lass ichs weg, ich denk, so wichtig ists dann nicht, schreib ich eben nen Hinweis hin, dass man die Seite nicht aktualisieren soll :D

rgb
25.07.2005, 09:03
Ich hätte da eine Idee:
Frag doch einfach ab, ob der Gästebucheintrag in seiner Form schon in der Datenbank existiert. Wenn ja, dann wird das Eintragen in die Datenbank einfach blockiert;).

July
25.07.2005, 09:07
Ich hätte da eine Idee:
Frag doch einfach ab, ob der Gästebucheintrag in seiner Form schon in der Datenbank existiert. Wenn ja, dann wird das Eintragen in die Datenbank einfach blockiert;).

Ja, daran hab ich auch schon gedacht. Aber geht das denn, wenn ich bei den Einträgen auch immer die Zeit mit in die DB eintragen lasse? Weil die sich ja dauernd ändert.
Oder kann man das beschränken, dass er nur bestimmte Felder vergleicht? Müsste eigentlich >_>
Naja, ich werd da mal drüber nachdenken, ich hoffe, ich krieg das hin :) *hofft, dass sies diesmal auch allein hinkriegt*

NiKrYss
25.07.2005, 09:52
Du könntest auch die $_POST - Variablen (ich geh mal davon aus, dass du darüber deine DB füllst) nach dem Klick auf den Button in Session-Variablen speichern und den Formulareintrag nur abschicken, wenn keine Session-Variablen existieren oder wenn sich Session-Variablen und $_POST-Variablen unterscheiden.
Es müsste auch gehen, dass du der POST-Variablen, die den Button beinhaltet, nach dem ersten Abschicken einen anderen Wert zuweist (null oder so) und den Eintrag nur abschickst, wenn diese POST-Variable nen ganz bestimmten Wert hat.
Falls das ganze ein bisschen wirr klingt ... einfach nochmal fragen, solltest du keine andere Lösung finden^^

dead_orc
25.07.2005, 10:34
Was ist daran so kompliziert?

<?php
if($_POST['senden'] == 'senden') // Die Bedingung halt, wann es in die DB eingetragen werden soll
{
// Der Code zum Senden
header('Location: '.$_SERVER['REQUEST_URI']); // Sollte eine Weiterleitung auf die im Browser aufgerufene Seite erstellen, nur eben ohne $_POST-Daten ;)
exit; // Vorsichtshalber das Skript abbrechen für den Fall, dass der Header aus irgend einem Grund nicht gesendet wird (was eigentlich nicht vorkommen sollte)
}
// Hie noch der Rest von Skript mit Formular und so
?>
Sollte eigentlich so gehen (eine wie ich finde sehr einfache Methode)

July
25.07.2005, 11:05
Was ist daran so kompliziert?

<?php
if($_POST['senden'] == 'senden') // Die Bedingung halt, wann es in die DB eingetragen werden soll
{
// Der Code zum Senden
header('Location: '.$_SERVER['REQUEST_URI']); // Sollte eine Weiterleitung auf die im Browser aufgerufene Seite erstellen, nur eben ohne $_POST-Daten ;)
}
// Hie noch der Rest von Skript mit Formular und so
?>
Sollte eigentlich so gehen (eine wie ich finde sehr einfache Methode)

Hm, irgendwie geht das alles nicht so >_> Oder ich verstehs nicht, und mach was falsch.
Aber gerade mit diesen ganzen Sessions und so kenn ich mich überhaupt nicht aus. Deswegen ists für mich ziemlich kompliziert in der Hinsicht >_>

naja, wenn nicht, dann nicht ^^ So schlimm ists auch nicht, wenn ichs nicht drin hab, war ja nicht verlangt *g*

dead_orc
25.07.2005, 11:12
Hm, meine Lösung hat eigentlich nix mit Sessions zu tun. Ich weiß aber auch nicht, wo der Fehler ist...
Bei mir funktioniert es so. Ich such mal nach dem Code deines Gästebuchs im Thread und füge es dann da ein...

Chocwise
25.07.2005, 18:42
Jo. Putten Orks Lösung ist standard und wird so auch in professionellen Scripten benutzt. So auch hier im Forum oder bei den newskommentaren oder Umfrageabstimmung auf Squarenet.

Das es bei dir nicht funktioniert, July, könnte daran liegen das du vor der header()-Funktion bereits irgendwas an den Browser ausgibst.
Es darf vor Headerfunktionen nichts an einen Browser ausgegeben werden. Weder leerzeichen noch einen Zeilenumbruch.
Das Script muss mit <?php beginnen.

Ansonsten wäre noch denkbar das die $_SERVER-Variablen gesperrt sind. Ist zwar seeeehr paranoid, aber man weiß ja nie...
Notfalls kann man auch eine relative Adresse da angeben, wäre dann aber nicht HTTP 1.0 kompatibel AFAIR.

BTW: Diese Funktion header('Location: '.$_SERVER['REQUEST_URI']);
Ist eine Weiterleitung. Die Weiterleitung tritt auf Serverebene ein.
Sendet der Client den Request, schickt der Server als Antwort nicht den HTML-Output sondern ledigich die Aufforderung zur Weiterleitung auf, in diesem Falle $_SERVER['REQUEST_URI'], welches der Adresse der angeforderten Seite entspricht. Also quasi ein Reload ohne das $_POST und $_GET-Varialen neu übergeben werden.

Eine sehr schöne und saubere Methode um Neueinträge zu verhindern. ;)

July
26.07.2005, 09:01
Ja, mein Problem liegt wohl daran, dass ich das Gästebuch in eine Tabelle packen muss.
Also ich musste letztes Jahr schon eine Website abgeben, die nur mit HTML und CSS erstellt wurde und auf Tabellen basiert. In die sollten wir jetzt unsere PHP-Sachen einbinden. Da sieht die Seite eben so aus, dass links ein Menü ist, und rechts ist eine große Tabellen-Zelle, in die dann eben der Code für das Gästebuch rein soll.

Hatte gestern ganz kurz mit dead_orc gequatscht, der meinte, dass das in dem Fall dann nicht geht.

Chocwise
26.07.2005, 16:27
Ja, mein Problem liegt wohl daran, dass ich das Gästebuch in eine Tabelle packen muss.
Also ich musste letztes Jahr schon eine Website abgeben, die nur mit HTML und CSS erstellt wurde und auf Tabellen basiert. In die sollten wir jetzt unsere PHP-Sachen einbinden. Da sieht die Seite eben so aus, dass links ein Menü ist, und rechts ist eine große Tabellen-Zelle, in die dann eben der Code für das Gästebuch rein soll.

Hatte gestern ganz kurz mit dead_orc gequatscht, der meinte, dass das in dem Fall dann nicht geht.
Och doch. In bin mir recht sicher das das funktioniert. :D
Nicht das ich Putten Orks Kompetenz in frage stellen würde, er hat sicherlich nur eine Möglichkeit übersehen. ;)

Wenn du es dennoch versuchen möchtest, sprech mich im MSN an. Dann schauen wir uns das nochmal zusammen an.

Chocwise
26.07.2005, 22:55
Jo. Mit dem Reloadschutz ist July's Hausarbeit soweit fertig.
Und ihr Helfer habt gezeigt, dass das Webentwicklerforum mit eins derer Foren ist die den besten Userservice bieten. ;)
Gute Arbeit Leute. :D


@ Putter Ork:
Ich hab die Headerweiterleitung eingebaut wie bereits im Thread angesprochen.
Dazu musste ich die schreibenden MySQL-Funktionen, die ja nur ausgeführt werden, wenn sie noch vor der Headerweiterleitung stehen, nach oben, über die HTML-Ausgabe geholt und hab unten dran dann die Weiterleitung eingebaut.
War nur verschieben eines größeren Codeblocks, umschreiben von 2 Codezeilen und hinzufügen von einer Codezeile. ;)
Eine Sache von 15 Minuten. 1-2 wenn ich nicht so viel gelabert hätte. :D

Wenn du den finalen Code haben willst, musst du July fragen. Ich geb ihr Script nicht weiter, is ja nicht meins. ;)

kris
17.08.2005, 13:42
Kaum versuch ich meine mageren PHP-Kenntnisse mal zu gebrauchen, klappt nichts mehr. :P
Irgendwie will das hier nicht funzen:



$db = mysql_connect($server,$user,$pass);
mysql_select_db("cs15v2_logo", $db);
$logo = "SELECT * FROM cs15v2_logo";
$result_logo = mysql_query($logo);

while($row = mysql_fetch_assoc($result_logo)) {
echo "$row[logourl]";
}

Chocwise
17.08.2005, 14:07
Kaum versuch ich meine mageren PHP-Kenntnisse mal zu gebrauchen, klappt nichts mehr. :P
Irgendwie will das hier nicht funzen:



$db = mysql_connect($server,$user,$pass);
mysql_select_db("cs15v2_logo", $db);
$logo = "SELECT * FROM cs15v2_logo";
$result_logo = mysql_query($logo);

while($row = mysql_fetch_assoc($result_logo)) {
echo "$row[logourl]";
}

Heh! Das ist nicht DEIN PHP-Frage-Thread. :D
Frag July gefälligst ob du IHREN PHP-Frage-Thread benutzen darfst. :p

Zu deiner Frage:
Du musst erstmal lernen wie du deine Problemchen hier angibst.
Wir brauchen Fehlermeldungen, Symptome und vielleicht noch etwas Beschreibung was du mit dem Script bewirken willst.
Solange die Punkte nicht dabei sind, schau ichs mir gar nicht erst an. >__>

BTW: Deine Tabelle aus der du mit dem SELECT-Statement auslesen willst heißt genau wie deine Datenbank (cs15v2_logo)?
Prüf das nochmal nach ob die Tabelle oder die Datenbank nicht doch anders heißt.

DFYX
17.08.2005, 14:59
Dann wäre zu erwähnen, dass man lieber $row['logourl'] und nicht "$row[logourl]" schreiben sollte. Irgendwie bezweifel ich, dass letzteres überhaupt funzt (Nicht, dass ichs jemals probiert hätte... ich verwend immer mysql_fetch_object)

kris
18.08.2005, 12:28
Heh! Das ist nicht DEIN PHP-Frage-Thread. :D
Frag July gefälligst ob du IHREN PHP-Frage-Thread benutzen darfst. :p


Irgendwie hab ich keinen Bock gehabt nen neuen Thread aufzumachen!
Und dann seh ich einen "Mein PHP-Frage Thread" hier rumgammeln und dann dacht ich, post ich doch einfach mal hier rein ^___^

Problem wurde gelöst! Trotzdem danke für die Hilfe oÔ!

July
21.08.2005, 21:13
*Thread wieder ausbuddelt*

Mir ist noch was tolles eingefallen, was ich unbedingt wissen muss :D Und zwar werden meine ganzen Zeilenumbrüche nicht übernommen, also wenn ich

"Hallo
das ist ein eintrag"

schreibe, schreibt er alles hintereinander weg. Warum das so ist, ist mir klar. Und dass man das nun angeblich mit der funktion nl2br() ändern kann, hab ich auch gelesen.
Wenn ich jetzt aber sage $_POST[kommentar] = nl2br($_POST[kommentar]);
tut er überhaupt nix ._. Warum, was muss ich tun, damit das geht??

Latency
21.08.2005, 21:45
Was meinst du mit gar nix? Übernimmt er die Zeilenumbrüche nicht, oder wird der String geleert? Falls zweites eintritt so scheint es, dass kein Array falsch adressiert wird, da die Variablen in der Regel wie folgt adressiert werden: $Array['Schluessel'] und die ' fehlen bei dir irgendwie.

July
21.08.2005, 21:50
Was meinst du mit gar nix? Übernimmt er die Zeilenumbrüche nicht, oder wird der String geleert? Falls zweites eintritt so scheint es, dass kein Array falsch adressiert wird, da die Variablen in der Regel wie folgt adressiert werden: $Array['Schluessel'] und die ' fehlen bei dir irgendwie.

Er übernimmt die zeilenumbrüche nicht. Er schreibt trotzdem alles hintereinander >_>
Hab die einfachen Anführungszeichen ergänzt, tut sich aber trotzdem nix ._."

Krelian
21.08.2005, 21:56
Ich kenn mich mit PHP zwar auch nicht so gut aus, aber was passiert wenn du den Inhalt direkt in eine Variable schreibst:
$variable = nl2br($_POST[kommentar]);
Und diesen Inhalt dann weiterverwendest, falls das funktioniert.

Edit: Hab's gerade mal ausprobiert, bei mir zumindest funkioniert es.

fanrpg
21.08.2005, 22:03
So geht das anders geht das nicht (hab ich so gelernt)


<?php
$kommentar = $_POST['kommentar'];
$kommentar = nl2br($kommentar);
$sql = "... $kommentar...";
?>

Also was in die DB geschrieben werden soll nicht $_POST sondern dann $kommentar verwenden

July
22.08.2005, 08:24
Hab jetzt meinen Fehler gefunden, musste die Zeile nur an eine etwas andere Position packen, dann gings, dann gehts auch mit $_POST[kommentar]
Danke trotzdem ^_^

Latency
22.08.2005, 17:21
Also was in die DB geschrieben werden soll nicht $_POST sondern dann $kommentar verwenden


$_POST['kommentar']; // Böse SQL-Injektion
$kommentar = $_POST['kommentar']; // Einfach andere Variable Verwenden
mysql_query($kommentar); // SQL-Injektion nicht mehr böse :)

Ganz so einfach geht das nicht ;)
Es ist viel wichtiger seine Strings entsprechend zu bearbeiten bevor sie in die Datenbank eingetragen werden, entweder in dem MagicQuotes im Server aktiviert sind, oder in dem man sie per Hand mit mysql_real_escape_string (http://de2.php.net/manual/de/function.mysql-real-escape-string.php) bearbeitet.

July
10.04.2006, 14:16
*thread von gaaaaaaaaanz unten wieder ausbuddelt*

Ich hab nochmal ne Frage :)
Für son tolles Projekt an unserer FH soll ne Website erstellt werden. Da haben wir mein Gästebuch eingebaut und jetzt soll so ein schöner Wortfilter da mit eingebaut werden, der den Text überprüft, ob irgendwelche Wörter da drinstehen, die da nicht reingehören sollen. Beschimpfungen und dergleichen.

Wir haben das ganze jetzt so gelöst, dass wir die Wörter in ein Array gepackt haben, und das wird dann mit dem Text verglichen. Problem an der Sache ist: wenn ich "schwein" im Array stehen habe, im Text aber SchWEiN steht, dann erkennt er das nicht, wegen unterschiedlicher Groß- und Kleinschreibung. (ich muss an dieser Stelle mal hinzufügen, dass ich das selbst noch nciht getestet hab, weil ich mich vorher mit was anderem beschäftigt habe und jetzt eben nem Komilitonen helfen soll.)
Angeblich solls unter PHP 5 wohl eine Funktion geben, die dafür da ist, dass es egal ist, wie es geschrieben ist, erkannt wirds wohl trotzdem. Wie realisiert man aber das ganze dann unter PHP4, wos (laut denjenigen, die sich schon weiter darum gekümmert haben) keine solche Funktion gibt?
Wäre etwas viel Arbeit, für jedes wort sämtliche mögliche Schreibweisen ins Array aufzunehmen?!

Rolus
10.04.2006, 14:44
Das dürfte zum Beispiel mit preg_replace (http://de.php.net/manual/de/function.preg-replace.php) funktionieren (gibt's auch in PHP4). Die Funktion erlaubt das Suchen nach regulären Ausdrücken und natürlich das Ersetzen derselben. Um "Schwein" in dem String $text zu ersetzen wäre folgendes nötig:

$text = preg_replace("/schwein/i","*****",$text);
Dabei ist /schwein/i der reguläre Ausdruck, schwein ist der Suchstring und i ist der Modifier, der sagt, dass die Groß-/Kleinschreibung unwichtig ist. Die Sternchen sind natürlich der Text, mit dem ersetzt wird.

freundliche Grüße, Rolus