Datenbank bearbeiten

Hallo Lime :)

danke für deine Hilfe!!

Ich habe den Code wie folgt verwendet und dabei diese fehlermeldung erhalten

Parse error: syntax error, unexpected $end in /www/htdocs/... eval()’d code on line 33

PHP:
<?php
$mysqlhost="xxx"; // MySQL-Host angeben
$mysqluser="xxx"; // MySQL-User angeben
$mysqlpwd="xxx"; // Passwort angeben
$mysqldb="xxx"; // Gewuenschte Datenbank angeben

$connection = mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die("Verbindungsversuch fehlgeschlagen.");
mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen.");

if(isset($_POST["speichern"]))
{
    $frage1= $_POST["frage1"];
    $id = $_POST['id'];
    $eintrag = "UPDATE `tabelle` SET frage1='{$frage1}' WHERE id={$id}";
    mysql_query($eintrag) or die("Änderung fehlgeschlagen.");
} else {
    $id = $_GET['id'];  //sollte später allerdings noch irgendwie gesichert werden, bevor man auf die DB zugreift. Stichwort SQL-Injection!
}

$query = mysql_query("SELECT * FROM `tabelle` WHERE id={$id}") or die(mysql_error());
while($row = mysql_fetch_object($query))
{
    echo '<form method="post" action="http://www.domain.de/datenbank-bearbeiten?id='.$id?>">';
        echo 'frage1: <input type="text" value="'.$row->frage1.'" name=frage1" /><br />';
        echo '<input type="hidden" name="id" value="'.$id.'" />';
        echo '<input type="submit" value="Änderungen speichern" name="speichern" />';
    echo '</form>';
}
mysql_close($connection);
?>

Ist es richtig, dass man hier verschiedene schreibweisen für die id-variable verwendet?

- {$id}
- '.$id.'

Danke für deine Hilfe!
 
Hm, ich seh schon wo der Fehler ist. (man sieht es hier im Forum eh sehr gut, weil es farblich hervorgehoben wird...)

Also die Sache ist die:
Wenn du ' als Anführungszeichen verwendest, werden Variablen innerhalb nicht geparst.
Wenn du " als Anführungszeichen verwendest, werden sie geparst.

PHP:
//geht nicht
echo 'Eine Variable $id steht hier.';
echo 'Eine Variable {$id} steht hier.';

//geht, wobei ich nicht weiß wie gut das funktioniert
echo "Eine Variable $id steht hier.";

//geht perfekt
echo "Eine Variable {$id} steht hier.";
echo "Eine Variable ".$id." steht hier.";
echo 'Eine Variable '.$id.' steht hier.';
(€: mir fällt auf, wie gut man das im Forum sieht, was klappt und was nicht. Wenn es klappt ist die Variable blau markiert!)

Je nach String macht es Sinn, die eine oder andere Art zu wählen.

So zu deinem Problem und der Lösung: Du hast dich beim Link vom Form verschrieben.

PHP:
<?php 
$mysqlhost="xxx"; // MySQL-Host angeben 
$mysqluser="xxx"; // MySQL-User angeben 
$mysqlpwd="xxx"; // Passwort angeben 
$mysqldb="xxx"; // Gewuenschte Datenbank angeben 

$connection = mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die("Verbindungsversuch fehlgeschlagen."); 
mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen."); 

if(isset($_POST["speichern"])) 
{ 
    $frage1= $_POST["frage1"]; 
    $id = $_POST['id']; 
    $eintrag = "UPDATE `tabelle` SET frage1='{$frage1}' WHERE id={$id}"; 
    mysql_query($eintrag) or die("Änderung fehlgeschlagen."); 
} else { 
    $id = $_GET['id'];  //sollte später allerdings noch irgendwie gesichert werden, bevor man auf die DB zugreift. Stichwort SQL-Injection! 
} 

$query = mysql_query("SELECT * FROM `tabelle` WHERE id={$id}") or die(mysql_error()); 
while($row = mysql_fetch_object($query)) 
{ 
    echo '<form method="post" action="http://www.domain.de/datenbank-bearbeiten?id='.$id.'">'; 
        echo 'frage1: <input type="text" value="'.$row->frage1.'" name=frage1" /><br />'; 
        echo '<input type="hidden" name="id" value="'.$id.'" />'; 
        echo '<input type="submit" value="Änderungen speichern" name="speichern" />'; 
    echo '</form>'; 
} 
mysql_close($connection); 
?>

Ich habe hier die Möglichkeit gewählt, das ganze mit ' auszugeben, da ich mir dann das Escapen der " vom String spare.
Alternative wäre:
PHP:
echo "<form method=\"post\" action=\"http://www.domain.de/datenbank-bearbeiten?id={$id}\">";
 
Zuletzt bearbeitet:
Hallo Lime :)

nochmals ein großes dankeschön! die farbliche hervorhebung ist wirklich wunderbar. danke für die beispiele!

Ich habe den Code nun wie unten umgeschrieben. Nun wird zwar das formular angezeigt und der richtige wert in das input-feld geladen, allerdings wird der bestehende oder veränderte wert aus dem feld & datenbank gelöscht, wenn man auf den "Änderungen speichern"-Button klickt. Scheint als würde der Wert nicht korrekt übermittelt. Hast du eine Idee woran das liegen könnte?


PHP:
<?php
$mysqlhost="xxx"; // MySQL-Host angeben 
$mysqluser="xxx"; // MySQL-User angeben 
$mysqlpwd="xxx"; // Passwort angeben 
$mysqldb="xxx"; // Gewuenschte Datenbank angeben 

$connection = mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die("Verbindungsversuch fehlgeschlagen.");
mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen.");

if(isset($_POST["speichern"]))
{
    $frage1= $_POST["artikel_name"];
    $id = $_POST['id'];
    $eintrag = "UPDATE `tabelle` SET artikel_name='{$artikel_name}' WHERE id={$id}";
    mysql_query($eintrag) or die("Änderung fehlgeschlagen.");
} else {
    $id = $_GET['id'];  //sollte später allerdings noch irgendwie gesichert werden, bevor man auf die DB zugreift. Stichwort SQL-Injection!
}

$query = mysql_query("SELECT * FROM `tabelle` WHERE id={$id}") or die(mysql_error());
while($row = mysql_fetch_object($query))
{
    echo "<form method=\"post\" action=\"http://www.domain.de/testdb?id={$id}\">";
  
        echo 'artikel_name: <input type="text" value="'.$row->artikel_name.'" name=artikel_name" /><br />';
        echo '<input type="hidden" name="id" value="'.$id.'" />';
        echo '<input type="submit" value="Änderungen speichern" name="speichern" />';
    echo '</form>';
}
mysql_close($connection);
?>
 
Zuletzt bearbeitet:
Auch hier gibts einen einfachen Grund. Das input-Feld "artikel_name" hat einen Syntaxfehler:

PHP:
//so siehts aus
echo 'artikel_name: <input type="text" value="'.$row->artikel_name.'" name=artikel_name" /><br />';
//so solls sein
echo 'artikel_name: <input type="text" value="'.$row->artikel_name.'" name="artikel_name" /><br />';
//artikel_name hatte ein " zu wenig
 
Leider immer noch das gleiche problem. die einträge des felds werden beim absenden einfach gelöscht.

Laut PHPMyAdmin ist der wert des feldes nicht "NULL", sondern es steht einfach gar nicht drin. als würde man ein leeres feld übergeben?!

Hier noch der komplette code:
PHP:
<?php
$mysqlhost="xxx"; // MySQL-Host angeben 
$mysqluser="xxx"; // MySQL-User angeben 
$mysqlpwd="xxx"; // Passwort angeben 
$mysqldb="xxx"; // Gewuenschte Datenbank angeben 

$connection = mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die("Verbindungsversuch fehlgeschlagen.");
mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen.");

if(isset($_POST["speichern"]))
{
    $frage1= $_POST["artikel_name"];
    $id = $_POST['id'];
    $eintrag = "UPDATE `tabelle` SET artikel_name='{$artikel_name}' WHERE id={$id}";
    mysql_query($eintrag) or die("Änderung fehlgeschlagen.");
} else {
    $id = $_GET['id'];  //sollte später allerdings noch irgendwie gesichert werden, bevor man auf die DB zugreift. Stichwort SQL-Injection!
}

$query = mysql_query("SELECT * FROM `tabelle` WHERE id={$id}") or die(mysql_error());
while($row = mysql_fetch_object($query))
{
    echo "<form method=\"post\" action=\"http://www.domain.de/testdb?id={$id}\">";  
        echo 'artikel_name: <input type="text" value="'.$row->artikel_name.'" name="artikel_name" /><br />';
        echo '<input type="hidden" name="id" value="'.$id.'" />';
        echo '<input type="submit" value="Änderungen speichern" name="speichern" />';
    echo '</form>';
}
mysql_close($connection);
?>
 
PHP:
<?php 
$mysqlhost="xxx"; // MySQL-Host angeben  
$mysqluser="xxx"; // MySQL-User angeben  
$mysqlpwd="xxx"; // Passwort angeben  
$mysqldb="xxx"; // Gewuenschte Datenbank angeben  

$connection = mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die("Verbindungsversuch fehlgeschlagen."); 
mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen."); 

if(isset($_POST["speichern"])) 
{ 
    $artikel_name = $_POST['artikel_name']; 
    $id = $_POST['id']; 
    $eintrag = "UPDATE `tabelle` SET artikel_name='{$artikel_name}' WHERE id={$id}"; 
    mysql_query($eintrag) or die("Änderung fehlgeschlagen."); 
} else { 
    $id = $_GET['id'];  //sollte später allerdings noch irgendwie gesichert werden, bevor man auf die DB zugreift. Stichwort SQL-Injection! 
} 

$query = mysql_query("SELECT * FROM `tabelle` WHERE id={$id}") or die(mysql_error()); 
while($row = mysql_fetch_object($query)) 
{ 
    echo "<form method=\"post\" action=\"http://www.domain.de/testdb?id={$id}\">";   
        echo 'artikel_name: <input type="text" value="'.$row->artikel_name.'" name="artikel_name" /><br />'; 
        echo '<input type="hidden" name="id" value="'.$id.'" />'; 
        echo '<input type="submit" value="Änderungen speichern" name="speichern" />'; 
    echo '</form>'; 
} 
mysql_close($connection); 
?>

Ich habs nicht nochmal ganz durchgemacht, sondern nur den Fehler gesucht.
Du hast oben die Variable geändert gehabt (von Spalte1 in frage1), jedoch hast du artikel_name als Variable in die DB geschrieben. Da die noch nicht existiert hatte, war sie immer null (leer). So sollte es (endlich) gehen.
 
Du bist der Beste! :) Es funktioniert!! Danke!


PHP:
$id = $_GET['id'];  //sollte später allerdings noch irgendwie gesichert werden, bevor man auf die DB zugreift. Stichwort SQL-Injection!

Wenn ich dafür das hier schreibe:

PHP:
$id = preg_replace(‘~\D~’, ”, $_GET['id']);

‘~\D~’, heißt eigentlich ‘~\D~’, wird hier falsch dargestellt.

bekomme ich diese fehlermeldung:

Parse error: syntax error, unexpected ‘~’

Gibt es darüber hinaus aus deiner sicht noch potenzielle sicherheitslücken?
 
Zuletzt bearbeitet:
Was willst du damit bitteschön erreichen****?
Du musst eigentlich nur schauen, dass die ID nicht negativ ist und eben eine Zahl ist (ohne Komma).
 
Guten Morgen :)

ich habe jetzt einfach an den anfang des codes die folgenden zeilen gesetzt, damit kann man nur dann auf die seite zugreifen, wenn die id eine zahl ist. ich denke das sollte reichen, um eine sql injection zu verhindern.

ist das so ok? würdest du noch etwas verbessern?

PHP:
<?php if (!is_numeric($_GET['id']))
{
    header("Location: http://www.domain.de/");
    exit;
}  ?>

nun muss ich nur noch die eingaben der input-felder filtern/entschärfen.
 
Eventuell noch überprüfen ob die Zahl über 0 ist, weil negative IDs gibts bekanntlich nicht. ;)

PHP:
<?php if(!is_numeric($_GET['id']))
{
    header("Location: http://www.domain.de/");
    exit;
} else {
   if($_GET['id'] <= 0)
   {
       header("Location: http://www.domain.de/");
       exit;
   }
} ?>
 

Neue Beiträge

Zurück