• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Daten aus Tabelle auslesen und in Datei wiedergeben

Stimmt auch wieder, klappt aber nun.

Nun möchte ich aber, dass in zwei Feldern (name & text) was stehen muss, ansonsten soll eine Fehlermeldung kommen.

Nur wie?

if ($_POST['absenden']){ if(empty($_POST['name']) || empty($_POST['text'])){die("Bitte Name und / oder Nachricht eingeben.")}}
Damit klappt es nicht.
 
Werbung:
Code:
if (isset($_POST['submit'])) {
    if (empty($_POST['irgendwas']) OR empty($_POST['irgendwas2'])) die("");
}
 
Ich krieg die Krise, das klappt nicht.

Der von dir gepostete Codeschnipsel ist nun verbaut, aber wenn nix eingetragen wird, wird die Meldung angezeigt (Namen und Text eingeben) und der Eintrag dennoch in die DB geschrieben. Schei*e! :D
Code:
if($_POST['absenden']) {
  $eintragen = mysql_query("INSERT INTO guestbook
  (name, text, hp, email, ip, timestamp) VALUES
  ('$name', '$text', '$hp', '$email', '$ip', '$timestamp')");
  if (empty($_POST['name']) OR empty($_POST['text'])) die("<div style=\"margin-left:30px;\"><span class=\"gen2\">Bitte Namen und Text eingeben :-)</span></div>");  
  echo "<div style=\"margin-left:30px;\"><span class=\"gen2\"><img src=\"img/info.png\">&nbsp;Eintrag erfolgreich. Vielen Dank.</span></div>";
	}
 
Werbung:
Du hast els fasch eingebaut ^^
Du musst es so machen:

Code:
if($_POST['absenden']) {
    if (empty($_POST['name']) OR empty($_POST['text'])) die("<div style=\"margin-left:30px;\"><span class=\"gen2\">Bitte Namen und Text eingeben :-)</span></div>"); 
    $eintragen = mysql_query("INSERT INTO guestbook
    (name, text, hp, email, ip, timestamp) VALUES
    ('$name', '$text', '$hp', '$email', '$ip', '$timestamp')");
}

Bei deinem Code wird ja schon in die DB geschrieben, bevor das Skript mit die abgebrochen wird.
 
Soweit klappt deine Version nun aber, allerdings fehlt (warum auch immer) der Footer der Seite. Die Seite endet aprubt mit der Ausgabe der Meldung "Bitte Namen und Text eingeben". Keine Ahnung warum.

Danke :D
 
Edit:
Oh wieso habe ich die 3. Seite nicht gesehen? Komisch. Aber der Beitrag unten sollte dir trotzdem helfen.
Und wegen deines Problems. Wir bräuchten den aktuellen Quellcode. Und wenn das Problem gelöst ist, klären wir dich über SQL Injection auf :) Denn dein Code ist unsicher. Und zwar sehr ;)
--------------

Hi,

nun habe ich versucht, ein "Gästebuch" zu erstellen. Die DB besteht auch mit einigen Feldern (name, text, hp, email, ip, timestamp) und die Daten werden auch erfolgreich durch das Formular eingetragen, allerdings kriege ich die Ausgabe nicht richtig hin. Beim ersten Eintrag klappt es, aber sobald ein neuer kommt, ist alles durcheinander.

Wie kriege ich jeden Eintrag geordnet?

Momentan sieht es so aus:
Code:
<?php
  $name = mysql_query("SELECT name FROM guestbook ORDER BY cid DESC LIMIT 100");
  while($row = mysql_fetch_object($name))
  echo "<b>Name:</b> ".$row->name." - ";
  
  $hp = mysql_query("SELECT hp FROM guestbook ORDER BY cid DESC LIMIT 100");
  while($row2 = mysql_fetch_object($hp))
    echo "<b>Homepage:</b> <a href=\"http://$row2->hp\" class=\"gengb\">".$row2->hp."</a><br />";
    
  $text = mysql_query("SELECT text FROM guestbook ORDER BY cid DESC LIMIT 100");
  while($row3 = mysql_fetch_object($text))
  echo "<b>Text:</b> ".$row3->text."<br />";

  ?>
Dazu stand in dem hier verlinkten PHP/MySQL-Tutorial nur, dass es zu aufwendig sei und daher nicht beschrieben sei. Schade.

Oh mein Gott. 3 Abfragen ? Wieso?
Ich glaube dir fehlt noch die Logik für PHP.
Wenn nach einem if, einer schleife oder ähnlichen kein {} folgt, wird nur der erste Befehl, der danach steht ausgeführt.
Deswegen machst du 3 Abfragen?
Vorerst merke dir bitte den unterschied zwischen Datenbank, Tabelle und Feldern. In einer Datenbank befinden sich Tabellen. Tabellen beinhalten Felder, welche Werte enthalten, die du dann auslesen willst. Also:
PHP:
<?php

mysql_select_db("datenbank"); // Datenbank
mysql_query("SELECT `feld1`, `feld2` FROM `tabelle1`");

?>
Die `` schreib ich nur, damit es klar ist, dass ein Name gemeint ist und es nicht mit einem SQL-Befehl verwechselt werden kann. In deinem fall gibt es nämlich den Befehl TIMESTAMP und somit könnte da etwas schief gehen. Somit rate ich dazu Tabellennamen und Felder immer in `` zu schreiben.

Nun zu deinem Statement.
Du kannst ein Select für alle 3 Felder machen. Und wie Furien schon sagte: cid existiert nicht bei dir
Schau dir den Query an, den ich für dich geschrieben habe und probiere daraus zu lernen :)
PHP:
<?php
  $query = mysql_query("SELECT `name`, `hp`, `text`  FROM `guestbook` ORDER BY `timestamp` DESC LIMIT 100");
  while($row = mysql_fetch_object($query)) {
      echo "<b>Name:</b> ".$row->name." - ";
      
      // Abfragen, ob eine HP eingetragen wurde
      if($row->hp && $row->hp != "")
      echo "<b>Homepage:</b> <a href=\"$row->hp\" class=\"gengb\">".$row->hp."</a><br />";
      echo "<b>Text:</b> ".$row->text."<br />";
  }

  ?>
Denke so wolltest du es auch haben, denn bei deinem Query hätte es folgendermaßen ausgesehen

Name: Johnny - Homepage: <a href="http://http://meinepageusw.de" class="gengb">http://meinepageusw.de</a>
Text: Mein Link funktioniert irgend wie nicht.
Bei deiner Version hätte er immer probiert einen Link auszugeben, auch wenn keiner da gewesen wäre. Und was ist wenn jemand http mit ausgibt. Dann sieht es schlecht aus. Meine geschrieben Variante ist noch nicht perfekt. Ich würde an deiner Stelle mit einem regulären Ausdruck da drüber laufen :)
Aber das sollte es vorerst tun. Hoffe konnte dir helfen. ;)
 
Werbung:
Danke, das andere Problem (Post 25) ist nun gelöst.

Der Code sieht nun folgendermaßen aus:

PHP:
$abfrage = mysql_query("SELECT * FROM guestbook ORDER BY timestamp DESC LIMIT 100");
  while($row = mysql_fetch_array($abfrage)){
      $name = $row['name'];
      $email = $row['email'];
	  $hp = $row['hp'];
	  $date = date('d.m.Y - H:i',$row['timestamp']);
	  $text = $row['text'];

      echo "<div style=\"border: solid #aaaaaa 1px; padding:5px; width:347px;\"><span class=\"gen5\">$date - von: <a href=\"mailto:$email\" class=\"gengb\">$name</a> - 
			<a href=\"http://$hp\" class=\"gengb\" target=\"_blank\">$hp</a></span><br />
			<span style=\"font-family:Lucida Console; font-size:10pt; line-height:15pt;\"><img src=\"http://pics-upload.de/img/ar2.png\">&nbsp;$text</span></div><br />
			";
  }

und zur Ausgabe der Einträge sieht es so aus:

HTML:
<td valign="top" width="450px"><ul id="headlinep"><center><span class="gen2"><b>Eintragen</b></span></center></ul><br />
<div style="margin-left:30px;">
<form action="gb.php" method="post">
<table><tr>
<td><span class="gen5">Name</span></td>
<td><input type="text" name="name" maxlength="15" style="font-family:Tahoma; font-size:8pt; border: solid #aaaaaa 1px;" size="25"></td>
</tr><tr>
<td><span class="gen5">E-Mail</span></td>
<td><input type="text" name="email" style="font-family:Tahoma; font-size:8pt; border: solid #aaaaaa 1px;" size="25"></td>
</tr><tr>
<td><span class="gen5">HP <u>www.</u></span></td>
<td><input type="text" name="hp" maxlength="26" style="font-family:Tahoma; font-size:8pt; border: solid #aaaaaa 1px;" size="25"></td>
</tr><tr>
<td valign="top"><span class="gen5">Text</span></td>
<td><textarea name="text" style="font-family:Tahoma; font-size:8pt; border: solid #aaaaaa 1px;" cols="40" rows="5"></textarea></td>
</tr><tr>
<td></td>
<td><input type="submit" style="font-family:Tahoma; font-size:8pt;font-weight:bold;border: solid #aaaaaa 1px; background-color:#ffffff;" name="absenden" value="Eintrag absenden" /></td>
</tr></table>
</form>

Und ich muss sagen, ich wüsste nicht, wo ich den Code zur Abfrage, ob eine HP existiert oder nicht, hintun muss :D Aber habe es ja nun so gelöst, dass anstelle von "Homepage" dort direkt der Domainname steht, und wenn keiner eingegeben wurde, steht halt nichts da. Und im Formular habe ich vor das Feld "HP www." geschrieben, sodass nur noch die Domain selbst eingegeben werden muss.

Zur Sache mit cid - eine solche Zeile existiert. "Primärschlüssel" steht daneben. Wollte das eigentlich mal für die Durchnummerierung der Einträge nehmen, aber wenn man einen Eintrag löscht wird ja einfach weitergezählt, nun ist der Wert da schon bei 50 durch meine ganzen wieder gelöschten Testeinträge...

Gruß

Danke & Gruß
 
Zuletzt bearbeitet:

echo
"<div style=\"border: solid #aaaaaa 1px; padding:5px; width:347px;\"><span class=\"gen5\">$date - von: <a href=\"mailto:$email\" class=\"gengb\">$name</a> -
<a href=\"http://$hp\" class=\"gengb\" target=\"_blank\">$hp</a></span><br />
<span style=\"font-family:Lucida Console; font-size:10pt; line-height:15pt;\"><img src=\"http://pics-upload.de/img/ar2.png\">&nbsp;$text</span></div><br />
"
;
Span-Tag ist veraltet und ich an deiner Stelle würde alles ordentlich mit einer
Css-Datei formatieren.
Zu dem fehlenden Footer.
Ich weiß zwar nicht wie du es gelöst hast, aber das ist der Sinn
von die("");, dass danach das ganze Skript sofort abgebrochen wird.
Damit auch der Footer include und alle Ausgaben die danach kommen.

Nun dein jetziges Problem versteh ich nicht ganz.
Du weiß nicht, wo du
PHP:
if (empty($_POST['hp'])) die("Bitte gib deine HP ein");
hintun sollst?

mfg furien
 
Span-Tag ist veraltet und ich an deiner Stelle würde alles ordentlich mit einer
Css-Datei formatieren.
Danke, aber so blöd bin ich nun auch wieder nicht. Natürlich existiert eine CSS-Datei, allerdings war ich zu faul, diese für diese eine kleine Textformatierung zu erweitern...

Problem mit fehlendem Seitencontent & Footer nach der Fehlermeldung ist behoben.

Und zu dem HP Zeugs Code. Von dem von dir genannten Code war nie die Rede. Der User MUSS keine Hp eingeben. Viel mehr wurde hier von Gilles angesprochen, dass bei der Ausgabe des Eintrages bei meinem Code grundsätzlich der Link "Homepage" angezeigt wird, ob eine eingegeben wurde oder nicht. Wenn keine eingegeben wurde, wird halt ins Leere verlinkt, wenn eine eingegeben wurde, wird diese verlinkt.
Habe das Problem nun so gelöst, dass ich anstelle des Link-Textes "Homepage" bei der Eintragsausgabe einfach die HP/Domain einfach als Linktext genommen habe, sodass nur dann etwas als Homepage angezeigt wird, wenn was eingegeben wurde. Zwar nicht die beste Lösung, aber klappt. :D

Gruß
 
Werbung:
Guten Morgen.
Also zunächst einmal eine Sache. Du lässt die Email des Users öffentlich ausgeben? Denke das ist keine gute Idee (Ich sag nur Spambots).
Doch mal zu deinem Link Problem. Als Ausgabe hast du ein komplettes echo genommen.
Dabei kannst du das doch splitten. Nur mal als grobe Anschauung dieses Beispiel:
PHP:
  echo "Name: $name";
  
  // Abfrage ob Email angegeben wurde
  if($email && $email != "") {
    echo " - Email: $email";
  } 
  echo "<br/>";
  
  // Abfrage für Homepage
  if($hp && $hp != "") {
    echo "Homepage: $hp <br/>";
  }

  // Nun Nachricht ausgeben
  echo $nachricht;

Du darfst nicht alles in ein echo packen, wenn du nach Konditionen gehen willst, ob etwas dargestellt wird oder nicht. :)
 
PHP:
echo "Name: $name";
Ist das neu, dass das funktioniert? :shock:
Ich habs immer so gemacht:
PHP:
echo "Name: ".$name;
 
Werbung:
Nun habe ich doch glatt wieder ein Problem :D

In der Tabelle (die ich nun für eine ganz andere Sache nutze), gibt es nun eine Spalte "cid", die die Eigenschaften "NOT NULL AUTO_INCREMENT und PRIMARY KEY hat. Darin wird ja gezählt, wie oft schon etwas in die Tabelle eingetragen wurde.

Nun das Problem: Habe einige Testeinträge gemacht, nun steht der Wert auf bspw. 25. Setze ich ihn nun auf 1, um von dort wieder ab 1 anzufangen zu zählen, wird beim nächsten Eintrag anstatt von 2 einfach 26 eingetragen. Ich möchte aber diesen Wert cid als Anzahl der insgesamten Einträge ausgeben, nur ist das unmöglich, wenn der Wert ständig verfälscht wird.
Wie kann ich das Ding wieder ab 1 anfangen lassen zu zählen? Habe den aktuellen 3 Einträgen schon die Werte 1-3 zugeordnet - nur sobald ein neuer kommt, wird 26 eingetragen anstatt 4.

Danke & Gruß
 
Code:
ALTER TABLE tabelle AUTO_INCREMENT = 1;
Musst du bei SQL unter PHPmyAdmin eingeben.
Dann wird wieder bei eins angefangen zu zählen.
 
Danke,

hatte eben mal die Funktion "Neuen Index erzeugen" im MySQL Dumper ausgeführt, hat allerdings nicht funktioniert.

Mit dem Befehl hat es geklappt. Dann wird ja wieder schön weitergezählt und der nächste Eintrag ist 4. Nur warum ist das so umständlich? :(
 
Werbung:
DU machst es der tabelle etwas umständlich :p
Mysql bietet dir zum zählen der Datensätze die Funktion Count an :)
MySQL :: MySQL 5.1 Referenzhandbuch :: 3.3.4.8 Zeilen zählen

Denn warum sollte der wieder von 1 anfangen wenn du einen Eintrag löschst. Stell dir mal folgendes Scenario vor.
Du hast 5 Einträge. Nun wird aber der. Datensatz mit der id 2 gelöscht. Was sollte die Datenbank denn nun machen? Einfach einen neuen Datensatz mit der Id 2 befüllen? Wäre nicht so gut. Außerdem muss die Datenbank ja erkennen, welche Datensätze als letztes eingetragen wurden. Und das geht über die eindeutige id :)

Und wie gesagt. Für dein Problem gibt es Count.
Kannst zum Beispiel sagen:
Code:
Select Count(`cid`) as `anzahl` from `tabelle`;

Kannst das auch alles in ein Query bringen, aber dafür müsste man deinen tabellenaufbau kennen.
 
Hi,

danke für die Info. Allerdings weiß ich mal wieder überhaupt nicht, wo ich das "Select Count(`cid`) as `anzahl` from `tabelle`;" denn nun hinstecken müsste.

Was meinst mit Tabellenaufbau? Das hier?
tabelle.png


Gruß
 
Semi-Offtopic:

Leute, nicht am AUTO_INCREMENT-Wert rumbasteln! ;) Die automatisch hochzählenden Primärschlüssel sind *nicht* dazu gedacht, anzuzeigen, wie viele Einträge eine Tabelle hat, sondern dienen dazu, jedem Datensatz in einer Tabelle eine eindeutige ID zu geben, über die zum Beispiel von anderen Tabellen eindeutig auf den Datensatz Bezug genommen werden kann. Deshalb ist es *notwendig*, das einmal vergebene IDs auch nach Löschen des entsprechenden Datensatzes nicht wieder neu vergeben werden, da sonst ein Datensatz in einer anderen Tabelle unter Umständen willkürlich einem neuen Eintrag zugeordnet wird.

Ein Beispiel: Ein simpler Blog mit vier Posts und drei Kommentaren zum ersten Post.

Code:
Tabelle 1: Posts

+----+----------------+---------+
| id | title          | content |
+----+----------------+---------+
|  1 | Testeintrag    |  [...]  | <------+
|  2 | Hallo Welt     |  [...]  |        |
|  3 | Griechenalnd   |  [...]  |        |
|  4 | Im Zoo         |  [...]  |        |
+----+----------------+---------+        |
                                         |
Tabelle 2: Comments                      |
                                         |
+----+--------+---------+---------+      |
| id | author | content | post_id |      |
+----+--------+---------+---------+      |
|  1 | Stefan |  [...]  |    1    | \    |
|  2 | Petra  |  [...]  |    1    |  |---+
|  3 | Nadine |  [...]  |    1    | /
+----+--------+---------+---------+

Wird nun der erste Post gelöscht, zeigen die drei Kommentare auf eine nicht mehr existierende Post-ID, sind also keinem Post mehr zugeordnet.

Code:
Tabelle 1: Posts

+----+----------------+---------+
| id | title          | content |
+----+----------------+---------+
|    |                |         | <------+
|  2 | Hallo Welt     |  [...]  |        |
|  3 | Griechenalnd   |  [...]  |        |
|  4 | Im Zoo         |  [...]  |        |
+----+----------------+---------+        |
                                         |
Tabelle 2: Comments                      |
                                         |
+----+--------+---------+---------+      |
| id | author | content | post_id |      |
+----+--------+---------+---------+      |
|  1 | Stefan |  [...]  |    1    | \    |
|  2 | Petra  |  [...]  |    1    |  |---+
|  3 | Nadine |  [...]  |    1    | /
+----+--------+---------+---------+

Würde beim Hinzufügen eines neuen Posts jetzt wieder die ID 1 vergeben, wären die Kommentare plötzlich einem völlig anderen Eintrag zugeordnet.

Code:
Tabelle 1: Posts

+----+-------------------+---------+
| id | title             | content |
+----+-------------------+---------+
|  1 | Tripp nach Berlin |  [...]  | <---+
|  2 | Hallo Welt        |  [...]  |     |
|  3 | Griechenalnd      |  [...]  |     |
|  4 | Im Zoo            |  [...]  |     |
+----+-------------------+---------+     |
                                         |
Tabelle 2: Comments                      |
                                         |
+----+--------+---------+---------+      |
| id | author | content | post_id |      |
+----+--------+---------+---------+      |
|  1 | Stefan |  [...]  |    1    | \    |
|  2 | Petra  |  [...]  |    1    |  |---+
|  3 | Nadine |  [...]  |    1    | /
+----+--------+---------+---------+

Anderes Beispiel: Wenn ein Nutzer X seinen Account hier im Forum löschen würde, die entsprechende User-ID dann aber neu an Nutzer Y vergeben würde, dann wäre plötzlich Y als Autor aller Posts von X aufgeführt.

Weil IDs (Primärschlüssel) zur Verknüpfung von Datensätzen verschiedener Tabellen dienen, dürfen IDs nicht erneut vergeben werden, da sonst bestehende Zuordnungen nicht mehr zutreffen.



Edit: Für das Zurücksetzen (Leeren) einer Tabelle gibt es einen eigenen Befehl. Bei mir im phpMyAdmin heißt die Funktion "Empty" und löscht alle Datensätze und setzt den AUTO_INCREMENT zurück auf 1. Das ergibt natürlich nur zum Testen Sinn, wenn noch keine weiteren Tabellen mit den Datensätzen verknüpft sind.
 
Zuletzt bearbeitet:
Werbung:
Nun gut, in der Tabelle ist es nicht so wichtig, da sie mit keiner anderen zusammenhängt.

Noch folgende Frage:

1. Wie mache ich das mit dem Select Count(`cid`) as `anzahl` from `tabelle`; ? Möchte die Anzahl der insgesamt eingetragenen Daten anzeigen lassen, also jede Zeile der Tabelle. Wenn also 5 Leute bisher schon ihren Link und Banner eingetragen haben soll 5 angezeit werden. Nur zur Statistik.

Danke & Gruß
 
Ohne Fehlerbehandlung und so:

PHP:
<?php

mysql_connect('localhost', 'nutzer', 'passwort');
mysql_select_db('datenbank');

$res = mysql_query("SELECT COUNT(*) AS `anzahl` FROM `tabelle`");

$row = mysql_fetch_assoc($res);

echo $row['anzahl'];
 
Zurück
Oben