1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Falsche php Zeile?

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von wapplegraph, 07.01.07.

  1. wapplegraph

    wapplegraph Normande

    Dabei seit:
    12.04.06
    Beiträge:
    571
    Was ist hier falsch?
    Glaube irgendetwas mit den Anführungszeichen:

    Code:
    mysql_query ("INSERT INTO tb_anmeldung (fd_Name = '$name', fd_Vorname = '$vname', fd_Strasse = '$str', fd_PLZ = '$plz', fd_Wohnort = '$ort', fd_Personen = '$anzahl') VALUES ($POST['name'], $POST['vname'], $POST['str'], $POST['plz'],$POST['ort], $POST['anzahl'])", $con);
    
    Danke wapplegraph
     
  2. wapplegraph

    wapplegraph Normande

    Dabei seit:
    12.04.06
    Beiträge:
    571
    Also habe schon bemerkt, das ich zuviel geschrieben habe, bei den Feldnamen , doch es ist immer noch etwas falsch.

    wapplegraph
     
  3. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    Fehlt da hinter dem zweiten ort nicht ein Hochkomma?
     
  4. csharp

    csharp Gast

    1. Gehört alles was in eine DB geschrieben wird validiert, was du da machst erlaubt es mir deine gesamten records zu löschen und schlimmer noch sogar die table zu droppen.
    2. Solltest du eine Abstraktionsklasse verwenden die es dir erlaubt deine Applikation auch auf andere Datenbanken zu portieren (PEAR anschauen)
    3. Reicht bei den Feldbeziechnungen fd_Name usw. das = '$name' usw. ist überflüssig bzw. falsch
    4. Das Hochkomma beim Ort fehlt auch wie schon angemerkt wurde.
     
  5. wapplegraph

    wapplegraph Normande

    Dabei seit:
    12.04.06
    Beiträge:
    571
    Also
    Den ersten Punkt habe ich nicht gecheckt. Den zweiten auch nicht so richtig.

    Hier die ganze Seite, damit man den zusammenhang sieht.


    Code:
    <?php
    
    include '../db_connect.php';
    
    if (isset($POST['name'])) {$name = $POST['name'];} else {$name = '';}
    if (isset($POST['vname'])) {$vname = $POST['vname'];} else {$vname = '';}
    if (isset($POST['str'])) {$str = $POST['str'];} else {$str = '';}
    if (isset($POST['plz'])) {$plz = $POST['plz'];} else {$plz = '';}
    if (isset($POST['ort'])) {$ort = $POST['ort'];} else {$ort = '';}
    if (isset($POST['anzahl'])) {$anzahl = $POST['anzahl'];} else {$anzahl = '';}
    if (isset($POST['send'])) {$send = $POST['send'];} else {$send = '';}
    
    
    
    
    mysql_query ("INSERT INTO tb_anmeldung (fd_Name, fd_Vorname, fd_Strasse, fd_PLZ, fd_Wohnort, fd_Personen) VALUES ($POST['name'], $POST['vname'], $POST['str'], $POST['plz'],$POST['ort'], $POST['anzahl'])", $con);
    
    ?>
    
    <html>
    <head>
    	<title>Anmeldung Ball 07</title>
    </head>
    
    <body>
    
    <form name="anmeldung" method="post">
    
    <?php
    
    if ($send == "send") 	{
    						echo "Wir danken Ihnen für die Anmeldung und wünschen Ihnen eine gute Zeit. Bis auf Wiedersehen am 2. Februar 07";
    						}
    						
    						else { 
    
    						
    
    echo '
    	
    	Name<input name="name" maxlength="30" value="Name" /><br>
    	Vorname<input name="vname" maxlength="25" value="Vorname" /><br>
    	Strasse<input name="str" maxlength="40" value="Strasse" /><br>
    	PLZ<input name="plz" maxlength="4" value="PLZ" /><br>
    	Wohnort<input name="ort" value="Wohnort" /><br>
    	Anzahl Personen<input name="anzahl" maxlength="2" value="z.B. 2" /><br>
    	
    	<input name="send" value="Anmeldung abschicken" type="submit">';
    	
    	}
    
    ?>
    
    </form>
    
    </body>
     
  6. Hilarious

    Hilarious Gelbe Schleswiger Reinette

    Dabei seit:
    10.08.05
    Beiträge:
    1.759
    Hier gibt es ein ernsthaftes Sicherheitsproblem, wenn Du die Werte ungefiltert aus der Benutzereingabe übernimmst (Stichwort »SQL Injection«).

    Ich würde das mal so umtexten, vielleicht hilft das gleich auch bei Deinem Problem:
    Code:
    <?php
    
    	include_once( '../dbconnect.php' );
    
    	$sql	=	"INSERT INTO tb_anmeldung SET ";
    	$sql	.=	(!empty( $_POST['name'] ))	?	sprintf( "fd_Name='%s', ", mysql_real_escape_string( $_POST['name'] ))
    											:	"fd_Name='', ";
    	$sql	.=	(!empty( $_POST['vname'] ))	?	sprintf( "fd_Vorname='%s', ", mysql_real_escape_string( $_POST['vname'] ))
    											:	"fd_Vorname='', ";
    
    /* usw. */
    
    	if ($result_ressource = mysql_query( $sql, $con )) {
    		$last_insert = mysql_insert_id();
    		// Liefert die letzte auto_increment-ID des eingefuegten Datensatzes.
    		// Hat dann geklappt.
    	}
    /* ... */
    ?>
    Zum einen kannst Du die SQL-Query auch so formulieren:
    INSERT INTO tabelle SET spalte1=wert1, spalte2=wert2, ...
    Das ist etwas einfacher innerhalb des PHP-Codes und genauso gut, zudem Du dann, wenn Du einen Datensatz aktualisieren möchtest dasselbe Statement nehmen kannst und nur »INSERT« durch »UPDATE« ersetzt.

    Weiterhin ist die Abfrage nach »isset( $_POST['asdf'] )« auch dann wahr, wenn der Benutzer hier ein Steuerzeichen, Leerzeichen oder eine Null übermittelt hat. Das kannst Du eleganter auffangen, wenn nach stattdessen nach »empty()« fragst.

    Drittens: mysql_real_escape_string() sollte unbedingt den String der Benutzereingabe vorbehandeln, bevor er in die Datenbank kommt. Ebenso wichtig ist, den String innerhalb des Statements immer mit einfachen Anführungsstrichen in Parenthese zu setzen, was ebenfalls ein wenig vor SQL Injection hilft (, wenn es nicht schon die obige Funktion täte).
     
  7. wapplegraph

    wapplegraph Normande

    Dabei seit:
    12.04.06
    Beiträge:
    571
    Könnte mir noch jemand diese Zeilen genauer erklären?

    Danke wapplegraph
     
  8. Hilarious

    Hilarious Gelbe Schleswiger Reinette

    Dabei seit:
    10.08.05
    Beiträge:
    1.759
    Da isses:

    1. Ausgangslage

    Die Idee ist hier, das SQL-Statement zusammenzusetzen. Ziel ist zum Beispiel ein solches Statement:
    Code:
    INSERT INTO tb_anmeldung
    	SET
    		fd_Name='graph',
    		fd_Vorname='wapple',
    		fd_PLZ='1234',
    		fd_Wohnort='Beinwill am See',
    		fd_Personen='5';
    
    2. Variablen müssen hinein
    Jetzt müssen natürlich die Formularwerte eingefügt werden, und das ganze in PHP gegossen:

    Code:
    $sql	=	"INSERT INTO tb_anmeldung";
    $sql	.=	"SET";
    $sql	.=	"fd_Name='" . $POST['name'] . "', ";
    $sql	.=	"fd_Vorname='" . $POST['vname'] . "', ";
    $sql	.=	"fd_PLZ='" . $POST['plz'] . "', ";
    $sql	.=	"fd_Wohnort='" . $POST['ort'] . "', ";
    $sql	.=	"fd_Personen='" . $POST['anzahl'] . "';";
    
    3. Sicherheit geht vor
    Das ist zwar schon was, aber übersichtlich ist das nicht mehr. Und vor allem sehr gefährlich (SQL-Injection mal bei Wikipedia nachschlagen). Besser ist es daher, die Formularwerte mit mysql_real_escape_string() vorzubehandeln:

    Code:
    $sql	=	"INSERT INTO tb_anmeldung";
    $sql	.=	"SET";
    $sql	.=	"fd_Name='" . mysql_real_escape_string( $POST['name'] ) . "', ";
    $sql	.=	"fd_Vorname='" . mysql_real_escape_string( $POST['vname'] ) . "', ";
    $sql	.=	"fd_PLZ='" . mysql_real_escape_string( $POST['plz'] ) . "', ";
    $sql	.=	"fd_Wohnort='" . mysql_real_escape_string( $POST['ort'] ) . "', ";
    $sql	.=	"fd_Personen='" . mysql_real_escape_string( $POST['anzahl'] ) . "';";
    
    4. Wartbarer machen
    Jetzt ist man zwar auf der sicheren Seite aber so richtig deutlich ist das nicht mehr, und man verhedeert sich schnell mit den Anführungseichen. Daher wird dies als »formatierte Ausgabe« in die Variable $sql geschrieben. Das tut man mit dem Befehl sprintf(), der Platzhalter in Form von %s, %u, %d, etc. für verschiedene Wertetypen annimmt, und diese durch die angehängten Werte ersetzt:

    Code:
    $sql	=	"INSERT INTO tb_anmeldung";
    $sql	.=	"SET";
    $sql	.=	sprintf( "fd_Name='%s', ", mysql_real_escape_string( $POST['name'] ));
    $sql	.=	sprintf( "fd_Vorname='%s', ", mysql_real_escape_string( $POST['vname'] ));
    $sql	.=	sprintf( "fd_PLZ='%s', ", mysql_real_escape_string( $POST['plz'] ));
    $sql	.=	sprintf( "fd_Wohnort='%s', ", mysql_real_escape_string( $POST['ort'] ));
    $sql	.=	sprintf( "fd_Personen='%u';", mysql_real_escape_string( $POST['anzahl'] ));
    
    5. Leere Felder berücksichtigen
    Neben den »Pflichtfeldern« gibt es ja auch bestimmt Felder, die freigelassen werden können, aber auch diese sollen ja in der Datenbank entsprechende Berücksichtigung finden. Dazu definiert man in der MySQL-Datenbank als Default-Wert »NULL«, dann kann die Datenbank schneller Ihre Inhalte indizieren und »NULL« wird als »absichtlich leer« betrachtet. Dazu müssen wir die Eingabewerte natürlich wiederum auf den Inhalt prüfen, wobei die Angabe »0« bei der Postleitzahl auch ein Leerzeichen hätte sein können. Dabei prüfe ich hier mit empty() und mithilfe eines ternären Operators, dem so genannten »funktionalen if«, der innerhalb einer Wertezuweisung gleich noch prüft, was geprüft werden soll, und nach Wunsch reagiert. Das sieht schematisch so aus:
    Code:
    $Wetter = (aufgegessen()) ? "Sonne" : "Regen";
    
    Wenn hier die Funktion aufgegessen() eine wahre Aussage erzeugt (also "TRUE" zurückgibt), wird $Wetter mit dem String "Sonne" befüttert, ansonsten mit "Regen". Diese Zuweisung muss man ein wenig üben, aber dann ist es enorm praktisch. Das ganze führt dann zu diesem Aufbau unseres SQL-Statements:

    Code:
    $sql	=	"INSERT INTO tb_anmeldung";
    $sql	.=	"SET";
    $sql	.=	(!empty( $_POST['name'] ))	?	sprintf( "fd_Name='%s', ", mysql_real_escape_string( $POST['name'] ))
    						:	"fd_Name=NULL, ";
    $sql	.=	(!empty( $_POST['vname'] ))	?	sprintf( "fd_Vorname='%s', ", mysql_real_escape_string( $POST['vname'] ))
    						:	"fd_Vorname=NULL, ";
    $sql	.=	(!empty( $_POST['plz'] ))	?	sprintf( "fd_PLZ='%s', ", mysql_real_escape_string( $POST['plz'] ))
    						:	"fd_PLZ=NULL, ";	
    $sql	.=	(!empty( $_POST['ort'] ))	?	sprintf( "fd_Wohnort='%s', ", mysql_real_escape_string( $POST['ort'] ))
    						:	"fd_Wohnort=NULL, ";
    $sql	.=	(!empty( $_POST['anzahl'] ))	?	sprintf( "fd_Personen='%u';", mysql_real_escape_string( $POST['anzahl'] ))
    						:	"fd_Personen=0;";
    /* Im letzten Fall gehe ich davon aus, dass die Spalte für Personen ganze, positive Zahlen enthalten soll, oder eben 0. */
    
    Klarer geworden? :D

    Ich habe das jetzt so getippt, aber nicht ausprobiert, einzelne Klammerfehler sind nicht auszuschließen.
     
    #8 Hilarious, 08.01.07
    Zuletzt bearbeitet: 08.01.07
    quarx gefällt das.
  9. wapplegraph

    wapplegraph Normande

    Dabei seit:
    12.04.06
    Beiträge:
    571
    Ja merci!

    Also ich habe jetzt heute leider keine Zeit mehr dies so zu machen, doch bis Ende Woche sollte ich Zeit gefunden haben, um dies alles genaustens zu studieren und auszuprobieren.

    wapplegraph
     
  10. wapplegraph

    wapplegraph Normande

    Dabei seit:
    12.04.06
    Beiträge:
    571
    Also ich habe jetzt es soweit fertig, doch die Ausführung klappt noch nicht.

    Ich muss da ja alles in einer Variable gespeichert ist, diese noch ausgeben. Wie am besten in einer if-Abfrage

    oben hat es so etwas, doch hm:

    Code:
    if ($result_ressource = mysql_query( $sql, $con )) {
    		$last_insert = mysql_insert_id();
    				}
    		else	{
    Wann wird dann überhaupt, diese if-Abfrage ausgeführt.

    wapplegraph
     
  11. Hilarious

    Hilarious Gelbe Schleswiger Reinette

    Dabei seit:
    10.08.05
    Beiträge:
    1.759
    Hier wird die Ausführung und die Prüfung kombiniert. Eine Konditionaloperation (if) fragt einfach ab, ob da etwas eine wahre Aussage ergibt (bool true):
    Code:
    $n = 1;
    if ($n) {
       echo "Stimmt, denn n wurde definiert. Also eine wahre Aussage.";
    }
    
    Wenn die SQL-Abfrage fehlschlägt, weil beispielsweise die Abfrage einen Fehler beinhaltet, wird die Zuweisung zu einer »falschen Aussage« (bool false). Daher sind diese Schreibweisen vom Ergebnis her gleich:
    Code:
    $result_ressource = mysql_query( $sql, $con );
    if ($result_ressource) {
       // usw.
    }
    
    und

    Code:
    if ( $result_ressource = mysql_query( $sql, $con ) ) {
      // usw.
    }
    
    ==> »Wenn die Abfrage (die, die durch die Variable sql bestimmt wird), erfolgreich war, also der Variable result_ressource einen Wert zuweist (und daher nicht false), handelt es sich innerhalb der Operation um eine wahre Aussage.«

    Und daher läuft eine Datenbankabfrage (, die nicht OOP-Ansätze verfolgt), so bei einem »INSERT« oder »UPDATE« (wobei bei diesem mysql_insert() entfällt) wie oben beschrieben.
     
  12. wapplegraph

    wapplegraph Normande

    Dabei seit:
    12.04.06
    Beiträge:
    571
    Code:
    <?php
    
    include_once ('db_connect.php');
    
    
    	$sql	=	"INSERT INTO tb_anmeldung SET ";
    	
    	$sql	.=	(!empty( $_POST['name'] ))		?	sprintf( "fd_Name='%s', ", mysql_real_escape_string( $_POST['name'] ))
    											:	"fd_Name='', ";
    											
    	$sql	.=	(!empty( $_POST['vname'] ))		?	sprintf( "fd_Vorname='%s', ", mysql_real_escape_string( $_POST['vname'] ))
    											:	"fd_Vorname='', ";
    											
    	$sql	.=	(!empty( $_POST['str'] ))		?	sprintf( "fd_Strasse='%s', ", mysql_real_escape_string( $_POST['str'] ))
    											:	"fd_Strasse='', ";
    											
    	$sql	.=	(!empty( $_POST['plz'] ))		?	sprintf( "fd_PLZ='%s', ", mysql_real_escape_string( $_POST['plz'] ))
    											:	"fd_PLZ='', ";
    											
    	$sql	.=	(!empty( $_POST['ort'] ))		?	sprintf( "fd_Wohnort='%s', ", mysql_real_escape_string( $_POST['ort'] ))
    											:	"fd_Wohnort='', ";
    											
    	$sql	.=	(!empty( $_POST['anzahl'] ))	?	sprintf( "fd_Personen='%s', ", mysql_real_escape_string( $_POST['anzahl'] ))
    											:	"fd_Personen='0', ";
    											
    
    ?>
    
    Wo liegt demfall hier der Fehler?

    Und kann man spans eine breite geben?

    wapplegraph
     
  13. Hilarious

    Hilarious Gelbe Schleswiger Reinette

    Dabei seit:
    10.08.05
    Beiträge:
    1.759
    Syntaktisch korrekt, jedoch könnte das letzte Komma im Statement zuviel sein ("fd_Personen=...,").

    Jain, das kommt auf den Zusammenhang an, da ein span-Tag kein Block-Tag ist. Wenn du das also nicht mit display:block, display:table, etc. »umdichtest« wird es immer auf die kleinste Breite kollabieren wollen. Ebenso kannst Du mit der Kombination position:absolute und width: 100% Effekte erzielen, wenn Du außernherum ein Block-Tag verwendest mit position:relative und width: 150px (zB). Aber das ist, glaube ich, eine andere Geschichte als eine PHP-Frage.
     
  14. wapplegraph

    wapplegraph Normande

    Dabei seit:
    12.04.06
    Beiträge:
    571
    Hallo
    Also es klappt eigentlich, doch etwas ganz komisches macht er mir.
    Wenn ich die Angegebenen Values löschen und in meinem Formular nichts übergebe, so fügt er mir einen neuen Eintrag hinzu, einfach mit der ID.
    Übergebe ich jedoch etwas, fügt er gar rein nichts in meine Tabelle ein.

    Was ist das?

    Hiermeine Seite:
    Code:
    <?php
    
    include 'db_connect.php';
    
    	if (isset($_POST['send']))	{$send = $_POST['send'];} else {$send = '';}
    
    
    
    	$sql	=	"INSERT INTO tb_anmeldung SET ";
    	
    	$sql	.=	(!empty( $_POST['name'] ))		?	sprintf( "fd_Name='%s' ", mysql_real_escape_string( $_POST['name'] ))
    											:	"fd_Name='', ";
    											
    	$sql	.=	(!empty( $_POST['vname'] ))		?	sprintf( "fd_Vorname='%s', ", mysql_real_escape_string( $_POST['vname'] ))
    											:	"fd_Vorname='', ";
    											
    	$sql	.=	(!empty( $_POST['str'] ))		?	sprintf( "fd_Strasse='%s', ", mysql_real_escape_string( $_POST['str'] ))
    											:	"fd_Strasse='', ";
    											
    	$sql	.=	(!empty( $_POST['plz'] ))		?	sprintf( "fd_PLZ='%s', ", mysql_real_escape_string( $_POST['plz'] ))
    											:	"fd_PLZ='', ";
    											
    	$sql	.=	(!empty( $_POST['ort'] ))		?	sprintf( "fd_Wohnort='%s', ", mysql_real_escape_string( $_POST['ort'] ))
    											:	"fd_Wohnort='', ";
    											
    	$sql	.=	(!empty( $_POST['anzahl'] ))	?	sprintf( "fd_Personen='%s' ", mysql_real_escape_string( $_POST['anzahl'] ))
    											:	"fd_Personen='0' ";
    	
    /*	echo $sql;										
    */
    ?>
    
    
    <html>
    <head>
    	<title>Anmeldung Ball 07</title>
    	
    
        <link href="formstyle.css" rel="stylesheet" type="text/css" media="screen">
    	
    </head>
    
    <body>
    
    <form name="anmeldung" method="post">
    
    <?php
    
    if ($send == 'Anmeldung abschicken') {
    		mysql_query( $sql, $con );
    		echo "Danke";
    		
    		
    		}
    		else	{
    						
    
    echo	'<div id="aussen">
    
    <table id="formularback">
    
    	<tr>
    		<td class="name">Name</td><td><input name="name" 	maxlength="30"	value="Name" />*</td>
    		<td class="name">Vorname</td><td><input name="vname" maxlength="25"	value="Vorname"/>*</td>
    	</tr>
    	
    	<tr>
    		<td class="name">Strasse</td><td colspan="3"><input name="str" 	maxlength="40"	value="Strasse" />*</td>
    	</tr>
    	
    	<tr>
    		<td class="name">PLZ	</td><td>				<input name="plz" 	maxlength="4" 	value="" />*</td>
    		<td class="name">Wohnort	</td><td>			<input name="ort" 					value="Wohnort" />*</td>
    		
    	</tr>
    	<tr>
    		<td class="name">Anzahl Personen</td><td colspan="3">		<input name="anzahl" maxlength="2" 	value="" />*</td>
    	</tr>
    	<tr><td id="pflicht" colspan="4">* Diese Felder sind Pflicht</td></tr>
    		
    	<tr><td colspan="2"><input id="button" name="send" value="Anmeldung abschicken" type="submit"></td></tr>
    	
    </table>
    ';
    
    	
    								}
    
    ?>
    
    </form>
    
    </body>
    </html>
    
    
    Danke wapplegraph
     
  15. Hilarious

    Hilarious Gelbe Schleswiger Reinette

    Dabei seit:
    10.08.05
    Beiträge:
    1.759
    Hi,

    oben bindest Du zwar Deinen Datenbank-Konnektor ein, initialisierst Du aber wirklich eine Datenbankverbindung? Falls nicht, steht Dir die Methode »mysql_real_escape_string« nicht zur Verfügung, da diese Methode eine gültige Verbindung zu MySQL-Client und dessen API voraussetzt.

    Wenn diese Methode nicht zur Verfügung steht, wird auch nichts in das SQL-Statement geschrieben.

    Du siehst möglicherweise mehr, wenn Du in der php.ini das error_reporting entsprechend einstellst oder in der Deinem Script als ersten Befehl das error_reporting so initialisierst:
    Code:
    error_reporting(E_ALL ^ E_NOTICE);
    
     
    Peter Maurer gefällt das.
  16. wapplegraph

    wapplegraph Normande

    Dabei seit:
    12.04.06
    Beiträge:
    571
    Hallo

    Ich habe gestern nach langem den Fehler herausgefunden, es war ein Kommafehler.:mad:
    Jetzt klappts und ich habe vieles gelernt, mit Formularen und Tabellen zu arbeiten.:)

    wapplegraph
     
  17. Hilarious

    Hilarious Gelbe Schleswiger Reinette

    Dabei seit:
    10.08.05
    Beiträge:
    1.759
    Glückwunsch!
     

Diese Seite empfehlen