Hilfe zu Umfrage+Datenbank

  • Hallo liebe Community,
    Ich beschäftige mich schon etwas mit PHP und MySQL, aber MySQL behersche ich noch nicht so gut.

    Ich bin gerade dabei eine Umfrage zu gestallten, also ein Formular mit HTML aufbauen, und dann mittels PHP die datenbank einfügen.

    ICh habe ein paar kleie Probleme, und habe dazu aber auch nirgendst im web tutorials gefunden. UND NEIN, ich möchte kein vorgefertigtes tool verwenden um die umfrage zu erstellen, so lern ich ja nichts dazu.

    ICh möchte euch hier mal mein vorläufiges UNFERTIGES script geben, und das soll nur eine testumfrage sein, die umfrage die ich eig. dann erstellen möchte geht um was anderes.



    Wer Fehler findet, oder was verbesserungswürdig findet, bitt posten.

    Und ich würde mich freuen, wenn mir wer von euch hierbei helfen könnte.

    Thx im vorraus.

    MfG GmbH

    Einmal editiert, zuletzt von G.m.b.H. (7. Mai 2009 um 22:01) aus folgendem Grund: Zensur

  • Also, das prinzip ist so:

    Form (kann auch nur html sein) schickt mit drücken des buttons Informationen. Wenn deine Informationen von einem php-script ausgewertet werden soll muss also im bereich 'action' eine php-datei stehen.
    Wenn du nur eine datei benutzen möchtest an stelle von mehreren kannst du auch die datei mit dem formular erneut aufrufen (insofern da das php-script drinne ist).

    die vom Formular übermittelten Daten kannst du dann über superglobale Variablen, $_GET oder $_POST (abhängig von deiner angabe 'method' im form-Kopf), abgreifen.

    Ich persönlich schreibe übrigens meine verbindung zur datenbank immer in eine extra datei und binde sie dann per include ein.

    Was du nicht vergessen solltest ist die verbindung zur datenbank wieder zu beenden mit mysql_close($res_id);

    Hier mal meine datei zum verbindungsaufbau

    PHP
    <?php
    $host = 'localhost';
    $user = 'root';
    $pwd = 'root';
    /* Verbindung aufbauen, auswählen einer Datenbank */
    $link = mysql_connect($host, $user, $pwd)
        or die("Keine Verbindung möglich: " . mysql_error());
    //echo "Verbindung zum Datenbankserver erfolgreich";
    mysql_select_db("thilda") or die("Auswahl der Datenbank fehlgeschlagen");
    ?>

    Einmal editiert, zuletzt von thilda (7. Mai 2009 um 22:21)

  • infügen.

    ICh habe ein paar kleine Probleme, und habe dazu aber auch nirgendst im web tutorials gefunden. UND NEIN, ich möchte kein vorgefertigtes tool verwenden um die umfrage zu erstellen, so lern ich ja nichts dazu.


    Lobenswerte Einstellung ;)

    Code
    <form method=post action="XXX.php"> // Bei action muss ich ja auf eine PHP seite verweisen, aber welche, bzw. was muss ich bei der seite machen auf die ich verweiße?


    In diesem Fall ist es wohl am einfachsten, auf das Script selber zu verweisen, mit <form method=post action="<?php echo $_SERVER['PHP_SELF'];?>">
    Das verweist auf den Namen des Scripts, das du gerade ausführst.

    Code
    foreach ( $_POST['antwort'] as $f)
    echo $f."<br>";


    Ich nehme an, das benutzt du zum Debuggen? Dafür kannst du var_dump($_POST) benutzen ;)

    Code
    if (!mysql_query("INSERT INTO umfrage [COLOR='Red'](`spalte1`,  `spalte2`,`spalte3`)[/COLOR] VALUE[COLOR='Red']S[/COLOR]('wert_in_erste_spalte', 'wert_in_zweite_spalte', 'wert_in_dritte_spalte')"))


    Außerdem das, was thilda sagt, beachten.

    Information will frei verfügbar sein.

    Don't eat unpeeled hedgehogs.

  • Danke mal für die schnellen antworten.

    Zu [verbindung zur datenbank beenden]: Muss ich das am ende des PHP Scripts hinschreiben?
    versteh ich sowieso nicht ganz, wenn ich die verbindung zur datenbank wieder beende, kann ich dann ja nicht mehr zugreifen mit submit oder?
    Erklären PLS...

    Zu [action=]: Also das heißt hier verlinke ich wieder auf die umfrage seite, also wenn ich submit drücke komme ich wieder auf die gleiche seite? Da könnte ich ja rein theoretisch auch auf eine seite verlinken wo drauf steht Danke das sie an meiner umfrage teilgenommen haben oder sowas ähnliches nicht? Es muss halt eine PHP site sein oder?

    Zu [foreach]: verwende ich mehr oder minder zum debuggen, weil es mir weil ich eine radiogruppe ansprechen will nichts anzeigt... aber wenn ich var_dump nehme zeigt er dann ja [nein] oder [ja] = 1 und nicht wie bei foreach 1 an oder?

    Zu den [Variablen]: Kann ich nur danke sagen... is eig. logisch, keine ahnung... aber thx dafür.

    Thx nochmal für die schnelle antworten...

  • Danke mal für die schnellen antworten.

    Zu [verbindung zur datenbank beenden]: Muss ich das am ende des PHP Scripts hinschreiben?
    versteh ich sowieso nicht ganz, wenn ich die verbindung zur datenbank wieder beende, kann ich dann ja nicht mehr zugreifen mit submit oder?
    Erklären PLS...

    Das machst du dann wenn du die datenbank nicht mehr brauchst, also spätestens am ende des scriptes.
    Das submit hat ja mit der datenbank nichts zu tun, das ist ja html und sobald du drauf klickst wird die datei die in 'action' aufgezeigt ist angesprochen. Würde also heißen das wenn du die gleiche seite nochmal aufrufst es wieer von vorne anfängt.


    Zu [action=]: Also das heißt hier verlinke ich wieder auf die umfrage seite, also wenn ich submit drücke komme ich wieder auf die gleiche seite? Da könnte ich ja rein theoretisch auch auf eine seite verlinken wo drauf steht Danke das sie an meiner umfrage teilgenommen haben oder sowas ähnliches nicht? Es muss halt eine PHP site sein oder?

    Richtig, da kannst du eigentlich eintragen was du willst.
    Die php-Seite am anderen Ende sorgt halt dafür das das Formular ausgewertet wird, deswegen, ja eine php-Seite.


    Zu [foreach]: verwende ich mehr oder minder zum debuggen, weil es mir weil ich eine radiogruppe ansprechen will nichts anzeigt... aber wenn ich var_dump nehme zeigt er dann ja [nein] oder [ja] = 1 und nicht wie bei foreach 1 an oder?


    var_dump(); ist dafür da, dir den gesamten Inhalt der angegebenen Variablen anzuzeigen. Sieht am Bildschirm immer etwas verwirrend aus, am besten schaust du dazu der übersichtlichkeit halber in den neuen Quelltext. Da ist es dann schön strukturiert.
    hier mal ein Bsp eines mehrdimensionalen arrays


  • Ich persönlich schreibe übrigens meine verbindung zur datenbank immer in eine extra datei und binde sie dann per include ein.

    Was du nicht vergessen solltest ist die verbindung zur datenbank wieder zu beenden mit mysql_close($res_id);


    Verbindungsaufbau sollte auf jedenfall in eine Extra-Datei. Wenn aus irgendeinem Grund auf deinem Server mal php ausfällt wird der Code uninterpretiert ausgegeben und jeder Besucher liest deine Zugangsdaten.

    mysql_close schadet zwar nicht, ist aber unnötig.
    http://dontknow.me/at/?http://de.php.net/mysql_close

    Zitat

    Die Verwendung von mysql_close() ist für gewöhnlich nicht notwendig, weil offene, nicht persistente Verbindungen automatisch mit Beendigung des PHP-Skripts geschlossen werden.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook


  • In diesem Fall ist es wohl am einfachsten, auf das Script selber zu verweisen, mit <form method=post action="<?php echo $_SERVER['PHP_SELF'];?>">
    Das verweist auf den Namen des Scripts, das du gerade ausführst.


    Am einfachsten vielleicht, trotzdem ist davon abzuraten.

    http://wiki.hackerboard.de/index.php/Cross_Site_Scripting

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • HAllo Leute,
    thx wieder für die antworten.
    also ich habe mich jetzt mal ein bisschen herum gespielt, und ich habe es geschafft das er zur datenbank connectet...

    Zitat


    neinnachrichtenshoppingEs wurde erfolgreich zur Datenbank verbunden.



    Das zeigt er mir dann an, wenn ich auf absenden geklickt habe...

    also ich habe keine ''<br>'' verwendet, das werd ich dann noch einbringen...

    ich habe nein nachrichten und shopping angeklickt...

    Dann steht da ich habe erfolgreich zur datenbank verbunden, aber in der datenbank werden die abgeschickten dinger nicht gespeichert... pls um hilfe.



    also ich habe mal das ganze so gestalltet... kann mir wer helfen den fehler zu finden?

    Ich spiel jetzt schon seit 2 std herrum, am anfang kam immer fehler in zeile 13, fehler in zeile 15...

    und jetzt hab ich es geschafft zur datenbank zu connecten, aber er speichert das nicht rein *heul*

    Es muss der fehler irgendwo bei

    Zitat

    if(@mysql_select($mysql_db))

    liegen, weil er die datenbank ja nicht auswählt... und die variable hab ich richtig angegeben...*heul

    Einmal editiert, zuletzt von G.m.b.H. (8. Mai 2009 um 16:35) aus folgendem Grund: PS

  • Code
    [COLOR=#000000][COLOR=#006600]if (![/COLOR][COLOR=#0000cc]mysql_query[/COLOR][COLOR=#006600]([/COLOR][COLOR=#cc0000]"INSERT INTO umfrage (ja, nein, sport, nachrichten, musik, shopping) VALUES('ja', 'nein', 'sport', 'nachrichten', 'musik', 'shopping')"[/COLOR][COLOR=#006600]))
     die ([/COLOR][COLOR=#cc0000]'Fehler! SQL-Befehl ist falsch.'[/COLOR][COLOR=#006600])[/COLOR][/COLOR]

    nach dem INSERT INTO kommen in der Klammer die bezeichnungen der Spalten in deinem Tabel in der datenbank.
    Die einzutragenen werte hast du ja schon unter VALUES () definiert.

  • Die spaltenbezeichnungen in meiner datenbank heißen gleich wie meine values... das passt schon so...

    er müsste mir ja rein theoretisch noch

    Zitat

    Es wurde erfolgreich die Datenbank ausgewählt.



    zeigen, aber das tut er nicht, also muss der fehler bei

    PHP
    if(@mysql_select($mysql_db))


    liegen, aber ich weiß nicht was an dem falsch ist...

  • wenn du den Fehler sehen willst, nimm mal das '@' davor weg ;)

    Aber ums kurz zu machen: Die Funktion gibts nicht!

    richtig:

    PHP
    if(@mysql_select_db($mysql_db))

    Gruß,
    jojo


  • Ok danke, hab das jetzt ausgebessert in

    PHP
    if(mysql_select_db($mysql_db))



    SO jetzt steht wenigstenz mal da das, die datenbank erfolgreich ausgewählt ist, aber auch das der SQL-Befehl falsch ist.

    Muss ich bei

    PHP
    if (!mysql_query("INSERT INTO umfrage (ja, nein, sport, nachrichten, musik, shopping) VALUES('ja', 'nein', 'sport', 'nachrichten', 'musik', 'shopping')"))
     die ('Fehler! SQL-Befehl ist falsch.')



    bei Values immer

    PHP
    $_POST['ja']

    usw.

    schreiben? oder was ist da der fehler?

  • Schreib mal

    PHP
    or die(mysql_error());

    und poste die Ausgabe.

    Und vllt nen Dump von deiner Tabelle (in phpmyadmin die Tabelle auswählen und dann auf "Exportieren"). Sind die Felder vllt. nicht alle als Varchar definiert? Du willst alle Felder mit Strings füllen.

    Du schreibst jetzt auch statische Werte rein. Wenn du die Werte aus dem Formular reinschreiben willst mußt du mit dem $_POST-Array arbeiten:

    Die Verwendung von mysql_real_escape_string() zum Schutz vor SQL-Injection solltest du dir direkt angewöhnen.

    Alternativ kannst du, wenn du nur einen Datensatz einfügst, den INSERT-Befehl auch noch etwas übersichtlicher schreiben:

    PHP
    $sql = "
    INSERT INTO 
        umfrage
    SET
        ja='$ja', 
        nein='$nein', 
        sport='$sport', 
        nachrichten='$nachrichten', 
        musik='$musik', 
        shopping='$shopping'";

    Edit:
    Natürlich sollten vor dem INSERT die Formular-Daten sowieso auf vernünftige Eingaben überprüft werden. Wie diese Überprüfungen im speziellen aussehen hängt dann natürlich immer von den erwarteten Werten ab.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

    Einmal editiert, zuletzt von SinnlosS (8. Mai 2009 um 18:26)

  • Zitat

    Parse error

    Zitat

    : syntax error, unexpected T_STRING in /usr/export/www/vhosts/funnetwork/hosting/macluke/gesendet.php on line 57

    Zitat


    Das ist die fehlermeldung...

    Ist genau die Zeile wo das insert into beginnt...
    mit

    PHP
    mysql_real_escape_string

    kenn ich mich nicht aus, also weiß ich nicht wie ich den fehler entdecken soll...

    Einmal editiert, zuletzt von G.m.b.H. (8. Mai 2009 um 18:53) aus folgendem Grund: Script angehängt

  • Meine spalten heißen gleich wie meine values von den radio buttons oder checkboxen...

    also ja, nein, shopping, nachrichten...
    usw...

    Thx, ja ich hab noch nicht ein solch geschultes auge, scheint so^^

    Thx

  • Die Spalten ja und nein kannst du thoretisch direkt in ein Feld vom Typ boolean verschmelzen. Hier hast der User ja nur zwei Möglichkeiten. Du nennst die Spalte zum Beispiel wohlergehen. Wenn es ihm gut geht, trägst du eine 1 ein, sonst eine 0.

    Zitat von SinnlosS

    Am einfachsten vielleicht, trotzdem ist davon abzuraten.


    Mein Fehler. Ich ging davon aus, dass nichts schlimmes passieren könnte, wenn er keine Cookies verwendet. Allerdings könnte man da auch noch andere Sachen mit einstellen, wie mir gerade auffällt, zum Beispiel Hits für eine andere Webseite sammeln.


    Wo wir schon dabei sind, von der Ausgabe des SQLs und des SQL-Errors im Klartext ist auch generell abzuraten. Angenommen, der Benutzer schafft es, einen SQL-Error zu erzeugen, in dem auch Javascript vorkommt. Beispiel:

    Du hast ein Feld, das einen Zahlentyp erwartet. Der Benutzer schmuggelt einen String ein (wie, will ich an dieser Stelle nicht ausführen). Dann wirft deine Anwendung einen SQL-Error aus, in dem der eingeschmuggelte String ungefiltert ausgegeben wird.
    Schlußfolgerung: html_entities() auf $sql und mysql_error() anwenden und dann erst ausgeben.

    Information will frei verfügbar sein.

    Don't eat unpeeled hedgehogs.

  • Ok... ich hab mich im internet ein wenig schlau gemacht über eine fehlermeldung namens

    Zitat

    duplicate error 0-0-0-0 for key 1


    die kommt dann wenn der primär schlüssel in der datenbank nicht richtig gesetzt ist, oder nicht gesetzt werden darf oder?
    das heißt ich entferne den primärschlüssel einfach oder?

  • Was ist bei deiner Tabelle denn der Primärschlüssel? Normalerweise ist es ein Feld `id` vom typ int, das auf auto_increment und primary key gesetzt ist. Der Primärschlüssel dient dazu, jeden Eintrag eindeutig zu identifizieren. Das Feld erhöht sich bei jedem Eintrag selber um eins, es braucht kein Wert über PHP dafür gesetzt zu werden.

    Information will frei verfügbar sein.

    Don't eat unpeeled hedgehogs.


  • Wo wir schon dabei sind, von der Ausgabe des SQLs und des SQL-Errors im Klartext ist auch generell abzuraten. Angenommen, der Benutzer schafft es, einen SQL-Error zu erzeugen, in dem auch Javascript vorkommt. Beispiel:

    Du hast ein Feld, das einen Zahlentyp erwartet. Der Benutzer schmuggelt einen String ein (wie, will ich an dieser Stelle nicht ausführen). Dann wirft deine Anwendung einen SQL-Error aus, in dem der eingeschmuggelte String ungefiltert ausgegeben wird.
    Schlußfolgerung: html_entities() auf $sql und mysql_error() anwenden und dann erst ausgeben.


    Naja, die Asugabe ist natürlich nur für die Entwicklungszeit zu Debugging-zwecken gedacht. Bei Inbetriebnahme der Seite hast du vollkommen recht, da wird sowas selbstverständlich rausgenommen, genauso wie error-reporting komplett ausgestellt wird und man Funktionen die zu informative Fehlermeldungen schmeißen könnten zusätzlich noch mit nem @ versieht.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook