HTML-Formular, PHP-Skript, Datensuche in Datenbank

L

librarian

Mitglied
Thread Starter
Dabei seit
21.08.2005
Beiträge
36
Reaktionspunkte
0
Ja, ja, ich schon wieder. Also, nun wollte ich ein PHP-Skript schreiben, das ein oder mehrere Angaben aus einem HTML-Formular übernimmt, damit in der Datenbank sucht und ein Formular ausgibt, in dem der Datensatz ggf. geändert werden kann.
Bisher bin ich nur soweit gekommen:

PHP:
<?php
include ('contact.php');

$ergebnis = $_POST[vorname] or $_POST[name] or $_POST[b_day] or $_POST[mat_nr] or $_POST[adresse] or $_POST[plz] or $_POST[wohnort] or $_POST[phon] or $_POST[email];

$query = "SELECT vorname, name FROM studidaten WHERE name LIKE \"$ergebnis\"";
if ($ergebnis){
echo $ergebnis;
}

if (mysql_query($query, $db)) {
echo '<h1 align="center">Datens&auml;tze gefunden.</h1>';

} else {
echo "Keine Datens&auml;tze gefunden.".mysql_error();
}

  echo '
  <TABLE align="center" cellpadding="5" cellspacing="0">
  <TR>
      <TD> 
           <a href=eingabeformular.html><p>weitere Eingabe</p>
      </TD>
      <TD> <a href=suchformular.html><p>Daten &auml;ndern</p>
      </TD>
    </TR>
  </TABLE>';

mysql_close($db);
?>

Trotz Sichtung verschiedener Tutorials und Fachbücher kapier ich immer noch nicht, wie ich weitermachen muß. Vielleicht bin ich auch total auf dem Holzweg? Wo kann ich gut weitersuchen?
 
Bist Du sicher dass der Query so richtig ist? Du durchsuchst immer das Feld "name" nach $ergebnis. $ergebnis kann aber je nach Eingabe auch den Wert von $_POST[b_day] enthalten.
Falls das wirklich so gewünscht ist, OK, ansonsten frag lieber nochmal hier nach. :)

Ein Tutorial habe ich nicht für Dich. So ungefähr geht es aber weiter:

Code:
$result=mysql_query($query, $db);
if($result && mysql_num_rows($result)>0){
   echo '<h1 align="center">Datens&auml;tze gefunden.</h1>';
   while($row=mysql_fetch_object($result)){
      echo $row->name;
      echo ', ';
      echo $row->vorname;
      echo "\r\n<br />";
   }
}
else {
   echo "Keine Datens&auml;tze gefunden.".mysql_error();
}
Das gibt Dir alle Werte von "name" und "vorname" in jeweils einer Zeile aus.

Alternativ kannst Du auch mit mysql_fetch_array() oder mysql_fetch_assoc() arbeiten, falls Dir der Umgang mit Objekten im Moment noch zu unverständlich erscheint oder Du einfach lieber mit Arrays arbeitest.
 
Zuletzt bearbeitet von einem Moderator:
Hab den Code mal umgeschrieben,
da waren eine Menge von Fehlern drin.

PHP:
<?php 
include ('contact.php'); 




/* $_POST-Strings für Suche */
$arrayPostStrings = array( 'vorname', 'name', 'b_day', 'mat_nr', 'adresse', 'plz', 'wohnort', 'phon', 'email' );





/* WHERE-String für DB-Query erstellen */
foreach( $arrayPostStrings AS $postString )
{
	$arrayPostSearch[] = ' name LIKE "%' . $_POST[ $postString ] . '%" ';
}
$postSearch = implode( ' OR ', $arrayPostSearch );





/* Query an Datenbank schicken */
$query = "SELECT vorname, name FROM studidaten WHERE " . $postSearch;
$queryHandler = mysql_query( $query );





/* Ergebnis ausgeben */
if( !mysql_num_rows( $queryHandler ) )
{
	echo "Keine Datens&auml;tze gefunden.".mysql_error(); 
}
else
{
	echo '<h1 align="center">Datens&auml;tze gefunden.</h1>'; 
}




echo ' 
<TABLE align="center" cellpadding="5" cellspacing="0"> 
<TR> 
  <TD> 
	   <a href=eingabeformular.html><p>weitere Eingabe</p> 
  </TD> 
  <TD> <a href=suchformular.html><p>Daten &auml;ndern</p> 
  </TD> 
</TR> 
</TABLE>'; 




mysql_close($db); 
?>


Schau dir das mal an und versuch zu verstehen, wo die Fehler
lagen. Bin aber auch nicht 100% sicher ob das so richtig ist.

Des weiteren ist die Abfrage auch in meiner Version noch
etwas komisch. Es wird nach Datensätzen in denen irgendeine
der vom Benutzer angegebenen Variablen/Suchwörten in der
DB-Tabellen-Spalte 'name' enthalten ist.
Sollte nicht vielmehr jeweils in der passenden Tabellen-Spalte gesucht
werden?

Gruß Jörg.
 
Zuletzt bearbeitet:
dms schrieb:
Bist Du sicher dass der Query so richtig ist? Du durchsuchst immer das Feld "name" nach $ergebnis. $ergebnis kann aber je nach Eingabe auch den Wert von $_POST[b_day] enthalten.
Falls das wirklich so gewünscht ist, OK, ansonsten frag lieber nochmal hier nach. :)

Sein Query selber ist schon falsch.
Der Wert von $ergebnis wird einfach nur Wahr/True enthalten,
da er eine einfache boolsche Bedingung aufgestellt hat. Das
wird kein String , der in dem Query an die DB verwendbar ist.
(Siehe meine Abänderungen)
 
OK, überredet. :) Ich habe einen String noch nie auf diese Weise zugewiesen und dachte es wäre vlt. ein Feature von PHP. Lag wohl auch ein bischen an der Uhrzeit. Eigentlich ist's logisch dass dabei nur true oder false rauskommen kann.
 
scope schrieb:
Des weiteren ist die Abfrage auch in meiner Version noch
etwas komisch. Es wird nach Datensätzen in denen irgendeine
der vom Benutzer angegebenen Variablen/Suchwörten in der
DB-Tabellen-Spalte 'name' enthalten ist.
Sollte nicht vielmehr jeweils in der passenden Tabellen-Spalte gesucht
werden?

Gruß Jörg.

Genau, sollte.

Mit $_POST[vorname] soll in der Tabellenspalte vorname gesucht werden,
mit $_POST[name] soll in der Tabellenspalte name gesucht werden,
...
mit $_POST soll in der Tabellenspalte email gesucht werden.

So soll mit jeder Eingabe ins Formular eine Suche möglich sein und evtl. auch Eingabe kombiniert werden, um das Ergebnis genauer zu machen.

Es sollten alle Suchangaben aus dem HTML-Formular aufgenommen werden und das Ergebnis ausgegeben werden, am besten in einem Formular, in dem wiederrum Änderungen gemacht werden können, und evtl. sogar ein Datensatz gleich gelöscht werden kann...

Bis dahin ist aber noch ein weiter Weg, denn das PHP-Skript sieht nun so aus
[PHP]
<?php
include ('contact.php');

$suchanfrage = $_POST['vorname'] or $_POST['name'] or $_POST['b_day'] or $_POST['mat_nr'] or $_POST['adresse'] or $_POST['plz'] or $_POST['wohnort'] or $_POST['phon'] or $_POST['email'];

if ($suchanfrage) {
echo 'Suchanfrage erhalten.';
}
#derzeit wird immer die else-Ansage ausgegeben
else {
echo 'Keine Suchanfrage erhalten.';
}


$query = "SELECT vorname, name FROM studidaten WHERE
vorname LIKE '".mysql_escape_string($_POST['vorname'])."' or
name LIKE '".mysql_escape_string($_POST['name'])."' or
b_day LIKE '".mysql_escape_string($_POST['b_day'])."' or
mat_nr LIKE '".mysql_escape_string($_POST['mat_nr'])."' or
adresse LIKE '".mysql_escape_string($_POST['adresse'])."' or
plz LIKE '".mysql_escape_string($_POST['plz'])."' or
wohnort LIKE '".mysql_escape_string($_POST['wohnort'])."' or
phon LIKE '".mysql_escape_string($_POST['phon'])."' or
email LIKE '".mysql_escape_string($_POST['email'])."%'" ;

$result = mysql_query($query, $db);
if($result && mysql_num_rows($result)>0){
echo '<h1 align="center">Datens&auml;tze gefunden.</h1>';

#und es werden name und vorname aller Einträge ausgegeben

while($row=mysql_fetch_object($result)){
echo $row->name;
echo ', ';
echo $row->vorname;
echo "\r\n<br />";
}
}
else {
echo "Keine Datens&auml;tze gefunden.".mysql_error();
}

echo '
<TABLE align="center" cellpadding="5" cellspacing="0">
<TR>
<TD>
<a href=eingabeformular.html><p>weitere Eingabe</p>
</TD>
<TD> <a href=suchformular.html><p>Daten &auml;ndern</p>
</TD>
</TR>
</TABLE>';

mysql_close($db);
?>
[/PHP]

Und eine allgemeine Frage: Kann ich überhaupt einen Datensatz in einem Formular ausgegeben bekommen, in dem ich den Datensatz dann ändern könnte?
 
So soll mit jeder Eingabe ins Formular eine Suche möglich sein und evtl. auch Eingabe kombiniert werden, um das Ergebnis genauer zu machen.
Um die Bedingungen zu kombinieren musst Du mit der Verknüpfung AND arbeiten. Im Moment verwendest Du OR.

Bei einer Suche mit LIKE kannst Du Prozentzeichen als Platzhalter verwenden. Beispiel:

WHERE x LIKE "test" -> findet nur exakte Treffer, also den Wert "test". LIKE ist in dem Fall überflüssig

WHERE x LIKE "test%" -> findet alles was mit "test" beginnt, also z.B. "test", "testergebnis"...

WHERE x LIKE "%test%" -> findet alles worin "test" vorkommt

In Deiner Abfrage hast Du nur am Ende der Abfrage von email ein %. Ich vermute mal bei den anderen hast du es vergessen.

Die Abfrage solltest Du so aber nur machen wenn Du auch die AND-Verknüpfungen verwendest. Ansonsten werden nämlich immer alle Einträge gefunden.

WHERE x LIKE "%$_POST[wert]%" -> Angenommen $_POST[wert] ist leer, wird jedes Ergebnis gefunden, es sei denn x enthällt NULL.

Es sollten alle Suchangaben aus dem HTML-Formular aufgenommen werden und das Ergebnis ausgegeben werden, am besten in einem Formular, in dem wiederrum Änderungen gemacht werden können, und evtl. sogar ein Datensatz gleich gelöscht werden kann...
Die Ausgabe in ein Formular solltest Du ja schaffen. :) Zum löschen eines Datensatzes könntest Du in den entsprechenden Zeilen einen Link einfügen. Bei Aufruf der verlinkten Seite wird der Datensatz einfach gelöscht. (DELETE FROM studidaten WHERE id=$_GET[id] (eine ID hast du doch in der Tabelle? :)))

Zum ändern von Datensätzen: Formular absenden und auf der Folgeseite entsprechende Querys ausführen: UPDATE studidaten SET feld1={wert1}, wert2={wert2}...WHERE id={id}
Die Klammern symbolisieren nur dass Du hier Werte aus dem Formular eintragen musst.

Hoffe das war einigermassen verständlich ausgedrückt. :)
 
dms schrieb:
Die Ausgabe in ein Formular solltest Du ja schaffen. :) Zum löschen eines Datensatzes könntest Du in den entsprechenden Zeilen einen Link einfügen. Bei Aufruf der verlinkten Seite wird der Datensatz einfach gelöscht. (DELETE FROM studidaten WHERE id=$_GET[id] (eine ID hast du doch in der Tabelle? :)))

Zum ändern von Datensätzen: Formular absenden und auf der Folgeseite entsprechende Querys ausführen: UPDATE studidaten SET feld1={wert1}, wert2={wert2}...WHERE id={id}
Die Klammern symbolisieren nur dass Du hier Werte aus dem Formular eintragen musst.

Hoffe das war einigermassen verständlich ausgedrückt. :)

Ehrlich gesagt zerbreche ich mir die ganze Zeit schon den Kopf darüber, wie ich Daten aus der Tabelle in einem Formular ausgeben soll. Was ich schaffe, ist die Tabelle auszugeben, aber da kann ich ja die Datensätze nicht bearbeiten...
Da ich es auch immer noch nicht geschafft habe einen bestimmten Datensatz auszuwählen, konnte ich DELETE noch nicht ausprobieren, aber immerhin habe ich eine id in der Tabelle (laufende Nummer).
Ich weiß auch nicht, irgendwie habe ich wohl ein Brett vor'm Kopf, hoffe das geht auch anderen mal so und das geht jawohl irgendwann wieder mal weg.
 
Klar, hin und wieder haben wir alle unsere Bretter vor'm Kopp. :)

Hier mal ein Beispiel wie die Ausgabe in einem Formular sein könnte:
Code:
<form ...>
   <table>
      <tr>
         <th>ID</th>
         <th>Name</th>
         <th>Vorname</th>
      </tr>
      <?
      while($row=mysql_fetch_object($result)){
      ?>
      <tr>
         <td><?=$row->id?><input type="hidden" name="id[]" value="<?=$row->id?>" /></td>
         <td><input type="text" name="name[]" value="<?=$row->name?>" /></td>
         <td><input type="text" name="vorname[]" value="<?=$row->vorname?>" /></td>
      </tr>
      <?
      }
      ?>
   </table>
</form>

Die Schreibweise <?=...?> ist eine Kurzform, bewirkt das gleiche wie <?echo $irgendwas;?>

Die ID wird hier in einem Hidden-Feld übergeben, denn die sollte man ja sicherlich nicht ändern können.

Auf der Folgeseite kannst Du dann ganz einfach mit den Array-Funktionen/Schleifen auf die Werte zugreifen und die UPDATE's durchführen.
 
Zuletzt bearbeitet von einem Moderator:
Ich möchte mal noch einen allgemeinen Hinweis geben.

Du tust Dir und Deinen Helfern einen großen Gefallen, wenn Du beim Ausprobieren und beim Posten von Fragen Dein Problem auf das Wesentlich reduzierst.

Bezogen auf diesen Fall würde ich vorschlagen, dass Du eine kleine Tabell mit nur drei Feldern anlegst.
Beim Code lässt Du alles was mit Formatierung (<table><th><td></th></tr><tr> etc.) zu tun hat weg und gibst nur die (fast) nackten Daten aus, etwa so:
PHP:
...
echo "Name: $_Post[name]<br>";
echo "Geschlecht: $_Post[geschlecht]<br>";
echo "Alter: $_Post[alter]<br>";
...
Das hat den Vorteil, dass der Code und auch das aktuelle Problem wesentlich leichter zu erfassen sind.
Wenn Dir mit diesen drei Feldern gelingt, die Aufgabe zu lösen, kannst Du das problemlos auch für weit umfangreichere Tabellen anwenden.
Die html-Formatierung ist dann ein Kinderspiel.

In Perl Communities wird oft der Hinweis gegeben:
Reduziere Deine Frage auf den minmal erforderlichen Code, der zur Demonstration Deines Problems erforderlich ist und schildere, was für ein Ergebnis Du erwartest und welches Du stattdessen erhältst
Oft ist es so, dass man dabei der Lösung des Problems mindestens ein gutes Stück näherkommt oder manchmal die Lösung sogar selbst findet.

HTH
 
Zuletzt bearbeitet:
Werd versuchen, mich in Zukunft kürzer zu fassen.
Habt mir bei diesem Problem auf jeden Fall weitergeholfen - VIELEN DANK!!
 
Zurück
Oben Unten