• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Textareas in DB

Status
Für weitere Antworten geschlossen.

THE_fan

Neues Mitglied
Hallo,

ich lese Inhalte aus einer Datenbank mit einer while-Schleife aus. In dem nächsten Schritt, wird zu jedem Datensatz eine Textarea hinzugefügt, in der weitere Daten eingegeben werden sollen.

PHP:
while($row=mysql_fetch_array($res)){
$i++;

          $sql_kat = mysql_query("SELECT name FROM kategorie WHERE id = '".$row['kategorie']."'");#Name der kategorie auslesen
          $kat = mysql_fetch_object($sql_kat);
          $kategorie = $kat->name;#name in variable speichern
          $gesamtpreis = $row['anzahl'] * $row['preis'];

echo "                <tr class='bst_tr_art'>";
#echo "                  <form method='post'>";
echo "                    <td><input type='hidden' name='id' value='".$row['id']."' readonly></td>";
echo "                    <td class='bst_tbl2'>".ucfirst($kategorie)."</td>";
echo "                    <td class='bst_tbl2'>".$row['typ']."</td>";
echo "                    <td class='bst_tbl2'>".$row['anzahl']."</td>";
echo "                    <td class='bst_tbl2''>".number_format($gesamtpreis, 2, ',', '')."&nbsp;€</td>";
echo "                <tr class='bst_tr_art'>";
echo "                    <td colspan='5' class='tbl2'>";
echo "                        <b>Nutzenbegruendung</b> <span class='small'>(Muss ausgefuellt werden!)</span><br>";
echo "                         <textarea rows='3' cols='95' name='kommentar[".$i."]' class='bst_txtarea'></textarea>";
echo "                    </td>";
echo "                </tr>";
echo "                <tr>";
echo "                    <td colspan='5' class='tbl2'><hr></td>";
#echo "                  </form>";
echo "                </tr>";

}

Die textarea wird NICHT gefüllt, da kein Inhalt in der DB vorhanden.
Nun habe ich schon erfahren, dass mit Hilfe einer foreach-Schleife die Inhalte ausgelesen werden können (es sind meist mehr als nur ein Datensatz, ergo mehr als eine Textarea) und in die DB eingetragen werden.
problem ist, dass wenn ich z.B. drei Datensätze auslesen, nur der letzte geupdatet wird.

PHP:
           foreach($_POST['kommentar'] as $val){
               $name = $_POST['vname']." ".$_POST['nname'];
               mysql_query("UPDATE bestellungen SET kommentar = '".$val."', name = '".$name."' WHERE  id = '".$_POST['id']." ' ") or die(mysql_error());
            }

Habe schon diverse Möglichkeiten durch, komme aber irgendwie nicht auf den richtigen Zweig.

Kann mir jemand helfen?

Danke im Voraus!

//edit:
Natürlich liegt das alles in einer <form> und ich frage auch ab, ob ein Button gedrückt wurde ;)
 
Werbung:
Werbung:
öh nee^^ dachte da mehr an ein mysql_real_escape_string() und an ein var_dump() innerhalb der Schleife um zu sehen, ob da überhaupt alles durchgegangen wird.
 
Hallo,

inwiefern ne Testausgabe? Ich sehe ja, dass wenn drei Textareas zu drei Datensätzen generiert werden, lediglich der Inhalt der letzten Textarea in die DB eingetragen wird..

MfG & Danke!
 
Werbung:
Habs (:

PHP:
if(isset($_POST['finish_bst'])){
    if($_POST['vname'] != "" && $_POST['nname'] != ""){
          $name = $_POST['vname']." ".$_POST['nname'];
          $session_id = session_id();
          $id = $_POST['id'];
           foreach($_POST['kommentar'] as $key => $val){
              if($id = $key){
                echo $key;
               mysql_query("UPDATE bestellungen SET kommentar = '".$val."', name = '".$name."' WHERE session_id = '".$session_id."' AND id = ".$id." ") or die(mysql_error());#session_id = '".session_id()."' &&
              #echo "<meta http-equiv='refresh' content='0;URL=?d=finbest'>";
              }
              }
     }else{
          $fehler = "Sie haben Ihren Namen nicht vollstaendig angegeben!";
     }
}
 
Na, iwie funzt es doch nich.
Wenn ich es mit zwei Datensätzen teste, wird wieder nur die letzte Textarea eingegeben.

Jmd noch ne Idee?
 
Es kann ja auch nicht funktionieren

Angenommen du hast 3 Kommentare

Schleifendurchlauf:
1. Setzen von `kommentar` auf 'test1'
:arrow: das Feld kommentar hat den Wert test1
2. Setzen von `kommentar` auf 'test2'
:arrow: das Feld kommentar hat den Wert test2
3. Setzen von `kommentar` auf 'test3'
:arrow: das Feld kommentar hat den Wert test3
------------------------------------------------------------------
Wie willst du also DREI verschiedene Werte in dein EINES Feld unterbringen?
Du könntest höchstens die Kommentare aneinanderhängen, aber so wie du es machst hast du nur EIN feld in das du jedes mal den neuen Kommentar einträgst und den alten ÜBERSCHREIBST.
 
Werbung:
Aaah, das macht Sinn wie du es erklärst.. Also dann es so nicht funktioniert.

Ich hatte nur mal ganz plump die if-Abfrage hinzugefügt und damit hat es geklappt. Wahrscheinlich zu viel durcheinander.. ^^

In der Theorie weiß ich ja, wie es funktionieren soll. Nur die Syntax fehlt mir irgendwie.

Nachdem die ID in $key gespeichert wird, muss eben geschaut werden, was in kommentar[$id] steht. Das wird doch dann in $val gespeichert, oder?
Eben deswegen dachte ich, dass bei jedem Schleifendurchlauf $val zum passenden $key eingetragen wird..

Danke vorab!
 
du müsstest halt vor dem update den inhalt herauslesen, den neuen inhalt hinzufügen und es wieder eintragen (könnten man als array machen)

PHP:
foreach($_POST['kommentar'] as $val) {
    $name = mysql_real_escape_string($_POST['vname'])." ".mysql_real_escape_string($_POST['nname']);
    $qry = mysql_query("SELECT `kommentar` FROM `bestellungen` WHERE  id = ".intval($_POST['id'])) or die(mysql_error());
    list($kommentar) = mysql_fetch_array($qry);
    $kommentar = unserialize($kommentar);
    array_push($kommentar, mysql_real_escape_string($val);
    $kommentar = serialize($kommentar);
    mysql_query("UPDATE `bestellungen` SET `name` = '".$name."', `kommentar` = '".$kommentar."' WHERE `id` = ".intval($_POST["id"])) or die(mysql_error());
}
 
Danke soweit.
Der Code überfordert mich ein wenig, ich steig da nicht ganz durch, weil ich die Funktionen nicht kenne.

Zudem kommt es zu folgender Fehlermeldung:
Code:
Warning: array_push() [function.array-push]: First argument should be an array in /home/www/mafotos/webform/bestellung.php on line 25

Warning: array_push() [function.array-push]: First argument should be an array in /home/www/mafotos/webform/bestellung.php on line 25

Zeile 25 ist
Code:
    array_push($kommentar, mysql_real_escape_string($val));
(Habe dort lediglich ein ")" hinzugefügt weil es fehlte. Der restliche Code ist original von dir, Frank.)

Ich habe das Gefühl, dass er wegen $kommentar meckert, was vorher nirgendwo definiert wurde!?

Danke vorab!
MfG
 
Werbung:
Genau das ist das Problem, da die Funktion array_push() nicht erkennen kann, dass es sich bei $kommentar um einen array handelt.

Abhilfe:
PHP:
$kommentar = array();

Gruß thuemmy
 
Danke!

Trotzdem immernoch der selbe Fehler.

PHP:
foreach($_POST['kommentar'] as $val) { 
    $name = mysql_real_escape_string($_POST['vname'])." ".mysql_real_escape_string($_POST['nname']); 
    $qry = mysql_query("SELECT `kommentar` FROM `bestellungen` WHERE  id = ".intval($_POST['id'])) or die(mysql_error()); 
    $kommentar = array();
    list($kommentar) = mysql_fetch_array($qry); 
    $kommentar = unserialize($kommentar); 
    array_push($kommentar, mysql_real_escape_string($val)); 
    $kommentar = serialize($kommentar); 
    mysql_query("UPDATE `bestellungen` SET `name` = '".$name."', `kommentar` = '".$kommentar."' WHERE `id` = ".intval($_POST["id"])) or die(mysql_error()); 
}

Was mir auch noch aufgefallen ist: In die Datenbank wird in der Spalte `kommentar` "b:0;" eingetragen statt dem was ich in die Textarea schreibe.

Tut mir leid, dass ich hier selbst nich wirklich viel tun kann. Ich bin eben, wie erwähnt, mit den Funktionen nicht vertraut..

Danke vorab!
MfG
 
Dann mach dich damit vertraut...

Damit die Sache funktioniert musst du in der datenbank bereits ein leeres, serialized array haben, sonst klappts net

mach einfach
PHP:
<?=serialie(array());?>
und mach das in der DB in die Spalte kommentar hinein (am besten gleich als Standard setzen)
 
Werbung:
Klar, tue ich ja ;)
Aber wenn ich das hier lese, weiß ich einfach nich was die Funktion soll.
> PHP: mysql_real_escape_string - Manual

Ist es denn nicht auf "einfachem" Weg möglich, das irgendwie zu realisieren?
Sowas sieht man doch 100x auf irgendwelchen Seiten, so schwer kann das doch garnich sein. Ich werd mal weiter tüfteln..

Trotzdem vielen Dank bis hierher :)
 
Ja die anderen Seiten speichern die Kommentare auch net in einem einzigen Feld ab sondern legen neue Tabellen mit beziehungen an...
Code:
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

SET AUTOCOMMIT=0;
START TRANSACTION;

CREATE TABLE `bestellungen` (
  `id` bigint(20) NOT NULL auto_increment,
  `product` bigint(20) NOT NULL,
  `text` text collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE `kommentare` (
  `id` bigint(20) NOT NULL auto_increment,
  `news` bigint(20) NOT NULL,
  `author` varchar(255) collate utf8_unicode_ci NOT NULL,
  `text` text collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `news` (`news`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `kommentare`
  ADD CONSTRAINT `kommentare_ibfk_1` FOREIGN KEY (`news`) REFERENCES `bestellungen` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

COMMIT;
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben