Wie Auswahl aus <option> in Mysql Tabelle schreiben?

Skyrim

Grünschnabel
Guten Abend

Wie schreibe ich den Ausgewählten Wert in die Mysql Tabelle?:

PHP:
//Leeres Formular
if (empty($_GET[querytype]) && !empty($_POST)) {
$sql    = "INSERT INTO $table SET
TITLE   = '$_POST[title]',
SUMMARY = '$_POST[summary]',
CAT = '$_POST[cat]',
CONTENT = '$_POST[content]'";
$query  = @mysql_query($sql);
}

PHP:
<!-- Formular, insert/update -->
<form name="form1" method="post" action="dbinsert.php?querytype=<?php echo $querytype; ?>&id=<?php echo $_GET[id]; ?>">
<p>Title
<input type="text" name="title" size="50" value="<?php echo $row[TITLE]; ?>">
<br>
Summary
<input type="text" name="summary" size="50" value="<?php echo $row[SUMMARY]; ?>">
<br>
Content
<textarea name="content" cols="60" rows="15"><?php echo $row[CONTENT]; ?></textarea>
Categry
<select name="sprachen"><?php

$SQL = "SELECT * from $cat";
$result = mySQL_query( $SQL );

while( $row = mySQL_fetch_array( $result ) ) {
       
echo '<option>' . $row ['CAT'] . '</option>'; } ?></select>
</p>
<p>
<input type="submit" name="Submit" value="Submit">
</p>

<p>
<input type="reset" value="Zurücksetzen" />
</p>
</form>
 
Du müsstest die Option noch soweit erweitern, das sie ein Value enthält.
PHP:
echo'<option value="'.$row['CAT'].'">'.$row['CAT'].'</option>';

Anschließend kannst du, wenn das Formular abgeschickt wurde, den Ausgewählten Wert abfragen und für dein Query Nutzen.
PHP:
//Leeres Formular
if (empty($_GET[querytype]) && !empty($_POST)) {
$language = mysqli_real_escape_string ( $mysqlilink , $_POST["sprachen"]);
$sql   = "INSERT INTO $table SET
TITLE   = '$_POST[title]',
SUMMARY = '$_POST[summary]',
SUMMARY = '$_POST[summary]',
CAT = '$language',
CONTENT = '$_POST[content]'";
$result = mysqli_query($mysqlilink , $sql);

Als kleiner Hinweis gewöhne dir das Nutzen der mysql_* Funktionen garnicht erst an bzw. ab.
Diese sind alle als deprecated gekennzeichnet und werden demnächst alle abgeschafft.
Nutze dafür lieber die mysqli_* Funktionen (wie in mein Beispiel), die myqli-Klasse oder die pdo Klasse.

Außerdem würde ich alles, was du über GET und POST empfängst und für die Query nutzt noch escapen (Stichwort SQL-Injection).
Schönes WE noch.

Gruß merzi
 
Als kleiner Hinweis gewöhne dir das Nutzen der mysql_* Funktionen garnicht erst an bzw. ab.
Diese sind alle als deprecated gekennzeichnet und werden demnächst alle abgeschafft.
Nutze dafür lieber die mysqli_* Funktionen (wie in mein Beispiel), die myqli-Klasse oder die pdo Klasse.

Den Tipp habe ich ihm im anderen Thread auch schon gegeben. Ich sehe es kommen, in ein paar Monaten kommt die Ankündigung der entgültigen Entfernung in PHP 5.7 und dann haben wir hier jede Menge Threads, warum Tutorial xyz nicht funktioniert. Was IMHO gut wäre, also nicht die Posts sondern das die Tutorials nicht funktionieren :-)
 
Wenn ich jetzt einen Eintrag bearbeiten will, wird immer die erste Kategorie aus der Kategorien Datenbank angezeigt. Dann ist die Bearbeitung natürlich falsch.

Hier ist der ganze Code:
PHP:
<?PHP

include "mysql.php";

$table = ENTRIES;
$cat = CATEGORIES;

//Leeres Formular
if (empty($_GET[querytype]) && !empty($_POST)) {
    $language = mysqli_real_escape_string ( $mysqlilink , $_POST["cat"]);
$sql    = "INSERT INTO $table SET
TITLE   = '$_POST[title]',
SUMMARY = '$_POST[summary]',
CAT = '$language',
CONTENT = '$_POST[content]'";
$result = mysqli_query($mysqlilink , $sql);
}

//Formualar bearbeiten
if ($_GET[querytype] == 1 && !empty($_POST)) {
$language = mysqli_real_escape_string ( $mysqlilink , $_POST["cat"]);
$sql    = "UPDATE $table SET
TITLE   = '$_POST[title]',
SUMMARY = '$_POST[summary]',
CAT = '$language',
CONTENT = '$_POST[content]' WHERE ID = '$_GET[id]'";
$result = mysqli_query($mysqlilink , $sql);
}

//Prüfen ob die action 'delete' ist
if($_GET[action] == 'delete'){
    //Prüfen ob die ID auch brav eine Nummer ist
    //TODO: Wennn nicht, schöner abfangen und nicht den Code einfach abbrechen wie in diesem Beispiel
    $sql = "DELETE FROM $table WHERE ID = '$_GET[id]'";
    //und ausführen
    mysql_query($sql);
} 
//Eintröge abrufen
$SQL = "SELECT * from $table";
$result = mySQL_query( $SQL );
$currentIndex = 0;
while( $row = mySQL_fetch_array( $result ) ) {
  $bgColor = "#ffffff";
  if($currentIndex % 2 == 1)
  {
    $bgColor = "#e6e6e6";
  }
  echo "<div style=\"background-color: $bgColor;\">";
  echo "<h1>$row[TITLE]</h1>";
  echo "<p><B>$row[SUMMARY]</B></p>";
  echo "<p>$row[CONTENT]</p>";
  echo "<p>$row[CAT]</p>";
  echo "<p><a href=\"dbinsert.php?id=$row[ID]\">Edit</a></p>";
  echo "<p><a href=\"dbinsert.php?id=$row[ID]&action=delete\">löschen</a><br><br></div>";
  $currentIndex++;
}

//Abfrage um bestehenden Eintrag anzuzeigen.
$SQL = "SELECT * from $table WHERE ID = '$_GET[id]'"; $result = @mySQL_query( $SQL ); $row = @mySQL_fetch_array( $result );

echo $_GET[id];

if (!empty($_GET[id])) {
$querytype = 1;
}
?>

<!-- Formular, insert/update -->
<form name="form1" method="post" action="dbinsert.php?querytype=<?php echo $querytype; ?>&id=<?php echo $_GET[id]; ?>">
<p>Title
<input type="text" name="title" size="50" value="<?php echo $row[TITLE]; ?>">
<br>
Summary
<input type="text" name="summary" size="50" value="<?php echo $row[SUMMARY]; ?>">
<br>
Content
<textarea name="content" cols="60" rows="15"><?php echo $row[CONTENT]; ?></textarea>
Categry
<select name="cat"><?php

$SQL = "SELECT * from $cat";
$result = mySQL_query( $SQL );

while( $row = mySQL_fetch_array( $result ) ) {
       
echo '<option value="'.$row['CAT'].'">'.$row['CAT'].'</option>'; } ?></select>
</p>
<p>
<input type="submit" name="Submit" value="Submit">
</p>

<p>
<input type="reset" value="Zurücksetzen" />
</p>
</form>

Wie muss ich die Funktion mysql* in mysqli ändern damit es aktuell ist?
Außerdem würde ich alles, was du über GET und POST empfängst und für die Query nutzt noch escapen (Stichwort SQL-Injection).
Bedeutet dass, dass ich jedes mal wenn ich etwas in die DB schreibe, es mit einem Benutzernamen und Passwort das im Formular eingegeben wird validieren lasse? Wie ändere ich das?

Gruss und vielen Dank skyrim
 
Du müsstest die ausgelesene Kategorie mit der vergleichen, die der Eintrag hat und dann das Attribute selected="selected" setzen. Ungefähr so:

PHP:
$editCategory = $row['CAT']; // Hier die Kategorie des Eintrags merken

$result = mysqli_query( $SQL ) or die( mysqli_error() );

while( $row = mysqli_fetch_array( $result ) ) {
   $selected = "";
   if($editCategory == $row['CAT']) // Wenn die aktuelle Kategorie der entspricht, die der Eintrag hat...
   {
     $selected = ' selected="selected"';
   }
   echo '<option value="'.$row['CAT'].'"' . $selected .'>'.$row['CAT'].'</option>';
}
?></select>

Desweiteren ist dein Code sehr schwer lesbar. Du verwendest keine erkennbare Logik beim Einrücken noch hältst du dich an Konventionen. Bei assoziativen Arrays wie $_GET und $_POST werden die Indices als String-Keys hinterlegt.

Also

PHP:
$_GET['ID']

anstatt von

PHP:
$_GET[ID]

Außerdem solltest du dringend deine Kenntnisse zum Thema SQL-Injection erhöhen. Alles was von "außen" - also auch und gerade vom Browser - reinkommt, sollte als kompromitiert betrachtet und entsprechend gefiltert werden. mysqli_real_escape_string() hilft da weiter.
 
Okay, jetzt zeigt es mir die Kategorien im Formular nicht mehr an und wenn ich etwas in die DB eintragen will, erhalte ich Fehlermeldungen
Der Reset und Submit Button werden nicht mehr angezeigt

Was ist jetzt alles falsch?:

PHP:
<?PHP

include "mysql.php";

$table = ENTRIES;
$cat = CATEGORIES;

//Leeres Formular
if (empty($_GET[querytype]) && !empty($_POST)) {
    $language = mysqli_real_escape_string ( $con , $_POST['CAT']);
$sql    = "INSERT INTO $table SET
TITLE   = '$_POST[TITLE];
SUMMARY = '$_POST[SUMMARY]',
CAT = '$language',
CONTENT = '$_POST[CONTENT]'";
$result = mysqli_query( $con , $sql);
}

//Formualar bearbeiten
if ($_GET[querytype] == 1 && !empty($_POST)) {
$language = mysqli_real_escape_string ( $con , $_POST['CAT']);
$sql    = "UPDATE $table SET
TITLE   = '$_POST[TITLE]',
SUMMARY = '$_POST[SUMMARY]',
CAT = '$language',
CONTENT = '$_POST[CONTENT]' WHERE ID = '$_GET[ID]'";
$result = mysqli_query( $con , $sql);
}

//Prüfen ob die action 'delete' ist
if($_GET[action] == 'delete'){
    //Prüfen ob die ID auch brav eine Nummer ist
    //TODO: Wennn nicht, schöner abfangen und nicht den Code einfach abbrechen wie in diesem Beispiel
    $sql = "DELETE FROM $table WHERE ID = '$_GET[id]'";
    //und ausführen
    mysql_query($sql);
} 
//Eintröge abrufen
$SQL = "SELECT * from $table";
$result = mySQL_query( $SQL );
$currentIndex = 0;
while( $row = mySQL_fetch_array( $result ) ) {
  $bgColor = "#ffffff";
  if($currentIndex % 2 == 1)
  {
    $bgColor = "#e6e6e6";
  }
  echo "<div style=\"background-color: $bgColor;\">";
  echo "<h1>$row[TITLE]</h1>";
  echo "<p><B>$row[SUMMARY]</B></p>";
  echo "<p>$row[CONTENT]</p>";
  echo "<p>$row[CAT]</p>";
  echo "<p><a href=\"dbinsert.php?id=$row[ID]\">Edit</a></p>";
  echo "<p><a href=\"dbinsert.php?id=$row[ID]&action=delete\">löschen</a><br><br></div>";
  $currentIndex++;
}

//Abfrage um bestehenden Eintrag anzuzeigen.
$SQL = "SELECT * from $table WHERE ID = '$_GET[id]'"; $result = @mySQL_query( $SQL ); $row = @mySQL_fetch_array( $result );

echo $_GET[id];

if (!empty($_GET[id])) {
$querytype = 1;
}
?>

<!-- Formular, insert/update -->
<form name="form1" method="post" action="dbinsert.php?querytype=<?php echo $querytype; ?>&id=<?php echo $_GET['ID']; ?>">
<p>Title
<input type="text" name="title" size="50" value="<?php echo $row['TITLE']; ?>">
<br>
Summary
<input type="text" name="summary" size="50" value="<?php echo $row['SUMMARY']; ?>">
<br>
Content
<textarea name="content" cols="60" rows="15"><?php echo $row['CONTENT']; ?></textarea>
Categry
<select name="cat"><?php

$editCategory = $row['CAT']; // Hier die Kategorie des Eintrags merken
$result = mysqli_query( $SQL ) or die( mysqli_error() );
while( $row = mysqli_fetch_array( $result ) ) {
   $selected = "";
   if($editCategory == $row['CAT']) // Wenn die aktuelle Kategorie der entspricht, die der Eintrag hat...
   {
     $selected = ' selected="selected"';
   }
   echo '<option value="'.$row['CAT'].'"' . $selected .'>'.$row['CAT'].'</option>';
}
?></select>
</p>
<p>
<input type="submit" name="Submit" value="Submit">
</p>

<p>
<input type="reset" value="Zurücksetzen" />
</p>
</form>
 
Du verwendest teilweise mysql und mysqli. Das ist beides nicht mit einander kompatibel. Zuerst mach folgendes: Suche in deinem Code (auch in included Scripts) nach mysql_ und tausch es durch mysqli_ aus.
Zweitens: Schreib in die erste Zeile deines Scripts die Zeilen

PHP:
ini_set('display_errors', 1);
error_reporting(-1);

Wenn du dann immer noch Fehler hast, siehst du zumindest schon mal welche und kannst die Meldungen posten, das macht die Analyse leichter.
 
Nutze dafür lieber die mysqli_* Funktionen (wie in mein Beispiel), die myqli-Klasse oder die pdo Klasse.
Nein, bitte nicht!
Das Beispiel von merzi86 fügt Variablen von außerhalb direkt in ein SQL-Query ein. Wenn man schon zu MySQLi wechselt, wieso dann nicht direkt Prepared Statements nutzen? Letzteres ist auch nur das einzig Mögliche bei PDO. Da brauchst du auch kein Escapen mehr.

Code wie $_POST[TITLE] ist fehlerhaft! Würdest du alle Fehler- und Warnmeldungen eingeschaltet haben, würdest du E_NOTICE-Meldungen sehen. Es muss $_POST['TITLE'] heißen! Und die Anführungszeichen fehlen bei jedem Arrayzugriff!

Bist du sicher, dass du dich auch per MySQLi zur Datenbank verbindest? Was ist denn $con bei dir?
Auch die Ausgabe der DB-Inhalte im HTML solltest du mit Vorsicht genießen. Stichwort htmlspecialchars().

Mit Verlaub ist der Code voll von schlechtem Code. Das obige Genannte ist nur der Anfang.
 
Okay, mein Code sieht jetzt so aus:

PHP:
<?PHP

ini_set('display_errors', 1);
error_reporting(-1);

include "mysql.php";

$table = 'ENTRIES';
$cat = 'CATEGORIES';
$QUERYTYPE = '1';

//Leeres Formular
if (empty($_GET['QUERYTYPE']) && !empty($_POST)) {
    $language = mysqli_real_escape_string ( $con , $_POST['CAT']);
$sql    = "INSERT INTO $table SET
TITLE   = '$_POST[title]',
SUMMARY = '$_POST[summary]',
CAT = '$language',
CONTENT = '$_POST[content]'";
$result = mysqli_query($con , $sql);
}

//Formualar bearbeiten
if ($_GET['QUERYTYPE'] == 1 && !empty($_POST)) {
$language = mysqli_real_escape_string ( $con , $_POST['CAT']);
$sql    = "UPDATE $table SET
TITLE   = '$_POST[title]',
SUMMARY = '$_POST[summary]',
CAT = '$language',
CONTENT = '$_POST[content]' WHERE ID = '$_GET[id]'";
$result = mysqli_query($con , $sql);
}

//Prüfen ob die action 'delete' ist
if($_GET['ACTION'] == 'delete'){
    //Prüfen ob die ID auch brav eine Nummer ist
    //TODO: Wennn nicht, schöner abfangen und nicht den Code einfach abbrechen wie in diesem Beispiel
    $sql = "DELETE FROM $table WHERE ID = '$_GET[id]'";
    //und ausführen
    mysqli_query($sql);
} 
//Eintröge abrufen
$SQL = "SELECT * from $table";
$result = mysqli_query($con, $SQL );
$currentIndex = 0;
while( $row = mysqli_fetch_array( $result ) ) {
  $bgColor = "#ffffff";
  if($currentIndex % 2 == 1)
  {
    $bgColor = "#e6e6e6";
  }
  echo "<div style=\"background-color: $bgColor;\">";
  echo "<h1>$row[TITLE]</h1>";
  echo "<p><B>$row[SUMMARY]</B></p>";
  echo "<p>$row[CONTENT]</p>";
  echo "<p>$row[CAT]</p>";
  echo "<p><a href=\"dbinsert.php?id=$row[ID]\">Edit</a></p>";
  echo "<p><a href=\"dbinsert.php?id=$row[ID]&action=delete\">löschen</a><br><br></div>";
  $currentIndex++;
}

//Abfrage um bestehenden Eintrag anzuzeigen.
$SQL = "SELECT * from $table WHERE ID = '$_GET[id]'"; $result = @mysqli_query( $SQL ); $row = @mysqli_fetch_array( $result );

echo $_GET[id];

if (!empty($_GET[id])) {
$querytype = 1;
}
?>

<!-- Formular, insert/update -->
<form name="form1" method="post" action="dbinsert.php?querytype=<?php echo $querytype; ?>&id=<?php echo $_GET[id]; ?>">
<p>Title
<input type="text" name="title" size="50" value="<?php echo $row[TITLE]; ?>">
<br>
Summary
<input type="text" name="summary" size="50" value="<?php echo $row[SUMMARY]; ?>">
<br>
Content
<textarea name="content" cols="60" rows="15"><?php echo $row[CONTENT]; ?></textarea>
Categry
<select name="cat"><?php

$SQL = "SELECT * from $cat";
$result = mysqli_query( $SQL );

while( $row = mysqli_fetch_array( $result ) ) {
       
echo '<option value="'.$row['CAT'].'">'.$row['CAT'].'</option>'; } ?></select>
</p>
<p>
<input type="submit" name="Submit" value="Submit">
</p>

<p>
<input type="reset" value="Zurücksetzen" />
</p>
</form>

& ich erhalte diese Fehler:

Notice: Undefined index: QUERYTYPE in .../dbinsert.php on line 24

Notice: Undefined index: ACTION in .../dbinsert.php on line 35

Fatal error: Call to undefined function: mysqli_query() in .../dbinsert.php on line 45

So verbinde ich mit der DB:
PHP:
<?php
$con = mysqli_connect("*", "*", "*", "*");

if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

?>
 
Notice: Undefined index: QUERYTYPE in .../dbinsert.php on line 24
Notice: Undefined index: ACTION in .../dbinsert.php on line 35
Zu diesen Warnungen gibt es zuhauf Hinweise im Internet. Das Problem ist, dass die GET- oder POST-Variablen nicht übertragen worden sind - aus welchem Grund auch immer. Deswegen existiert $_GET['QUERYTYPE'] auch nicht.

Fatal error: Call to undefined function: mysqli_query() in .../dbinsert.php on line 45
Welche PHP-Version verwendest du?
 
Zurück