HTML-Formular, PHP-Skript, Datensuche in Datenbank

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von librarian, 29.08.2005.

  1. librarian

    librarian Thread Starter MacUser Mitglied

    Beiträge:
    36
    Zustimmungen:
    0
    MacUser seit:
    21.08.2005
    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?
     
  2. dms

    dms Gast

    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 von einem Moderator bearbeitet: 30.08.2005
  3. scope

    scope MacUser Mitglied

    Beiträge:
    4.081
    Zustimmungen:
    301
    MacUser seit:
    24.01.2005
    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: 30.08.2005
  4. scope

    scope MacUser Mitglied

    Beiträge:
    4.081
    Zustimmungen:
    301
    MacUser seit:
    24.01.2005
    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)
     
  5. dms

    dms Gast

    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.
     
  6. librarian

    librarian Thread Starter MacUser Mitglied

    Beiträge:
    36
    Zustimmungen:
    0
    MacUser seit:
    21.08.2005
    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?
     
  7. dms

    dms Gast

    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.

    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. :)
     
  8. librarian

    librarian Thread Starter MacUser Mitglied

    Beiträge:
    36
    Zustimmungen:
    0
    MacUser seit:
    21.08.2005
    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.
     
  9. dms

    dms Gast

    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 von einem Moderator bearbeitet: 30.08.2005
  10. maceis

    maceis MacUser Mitglied

    Beiträge:
    16.645
    Zustimmungen:
    596
    MacUser seit:
    24.09.2003
    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:
    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: 30.08.2005
Die Seite wird geladen...