# Werte aus einem Array in Datenbank schreiben



## johannes123 (24. November 2012)

Hallo,

Ich bin leider PHP Anfänger, und nachdem ich schon mehr als einen Tag an einem Problem arbeite versich ich es mal hier.

Ich habe ein Formular, in diesem frage ich eine Datenbank ab. Das Abfrageergebnis ist eine mehrzeilige Tabelle, in der ich Werte ändern möchte. Die Abfrage und das Befüllen der Tabelle funktioniert, Auch das Array enthält die richtigen Werte. Ich habe damit ich eindeutige Feldbezeichner bekomme den Feldnamen zusätzlich einen Pin zugewisen, der auch aus der DB kommt.
Ich kürze den "pin" beim Eintragen in die db mit substr. wider weg, damit die Bezeichnungen der Felder wirder mit der DB stimmen. Nur kommt bei der Datenbank nichts an.
Kann da jemand helfen ?


```
$sqlprov = "SELECT * FROM schule_termine WHERE ort='moenichwald'"; "ORDER BY pin";
										$result_prov = mysql_query($sqlprov,$connection5);
										$users_prov = mysql_num_rows($result_prov);
										$dataprov = mysql_fetch_array ($result_prov);
										for ($provdetails = 1; $provdetails <= $users_prov; $provdetails++) 
										{
										$dataprov = mysql_fetch_array ($result_prov);
									
										
	foreach ($_POST as $key => $val) { 
    if (substr($key,3) == 'pin_') { 
         $key = substr($key,3); 
		 $pin = $val; 
         $ort = $val; 
		 $von_tag = $val;
		 $von_monat = $val;
		 $von_jahr = $val;
		 $bist_tag = $val;
		 $bis_monat = $val;
		 $bis_jahr = $val;
		 $bezeichnung = $val;
         
    } 
}	
$sql = "UPDATE schule_termine SET bezeichnung=substr('".$_POST['bezeichnung']."',0,-3) WHERE pin=substr('".$_POST['pin']."',0,-3)";
//$sql = "UPDATE schule_termine SET ort=".$_POST['ort']."',von_tag='".$_POST['von_tag']."',von_monat='".$_POST['von_monat']."',von_jahr='".$_POST['von_jahr']."',bis_tag='".$_POST['bis_tag']."',bis_monat='".$_POST['bis_monat']."',bis_jahr='".$_POST['bis_jahr']."',bezeichnung='".$_POST['bezeichnung']."' WHERE pin='".$_POST['pin']."'" ;
mysql_query($sql);
?>

                                </tr>
                              <tr>
                                <td width="97" align="right" class="weiss_headline"><div align="left" class="Stil1">PIN:
                                  <input name="pin_<? echo $dataprov[pin]; ?>" type="text" id="PIN" value="<?php echo $dataprov['pin']; ?>" size="3" />
                                </div></td>
                                <td width="131"><span class="Stil1">ORT:
                                  </span><span class="weiss_headline">
                                  <input name="ort_<? echo $dataprov[pin]; ?>" type="text" id="Ort" value="<?php echo $dataprov['ort']; ?>" size="10" />
                                  </span></td>
                                <td ><span class="Stil1">Von:</span> 
                                  <input name="von_tag_<? echo $dataprov[pin]; ?>" type="text" id="von_tag" value="<?php echo $dataprov['von_tag']; ?>" size="3" />
                                  /
                                    <input name="von_monat_<? echo $dataprov[pin]; ?>" type="text" id="von_monat" value="<?php echo $dataprov['von_monat']; ?>" size="3" />
                                    /
                                    <input name="von_jahr_<? echo $dataprov[pin]; ?>" type="text" id="von_jahr" value="<?php echo $dataprov['von_jahr']; ?>" size="3" /> 
                                    <span class="Stil1">Bis:</span> 
                                    <input name="bis_tag_<? echo $dataprov[pin]; ?>" type="text" id="bis_tag" value="<?php echo $dataprov['bis_tag']; ?>" size="3" />
                                    /
                                    <input name="bis_monat_<? echo $dataprov[pin]; ?>" type="text" id="bis_monat" value="<?php echo $dataprov['bis_monat']; ?>" size="3" />
                                    /
                                    <input name="bis_jahr_<? echo $dataprov[pin]; ?>" type="text" id="bis_jahr" value="<?php echo $dataprov['bis_jahr']; ?>" size="3" /> 
                                    <span class="Stil1">Kurs:</span> <textarea name="bezeichnung_<? echo $dataprov[pin]; ?>" cols="45" id="bezeichnung"><?php echo $dataprov['bezeichnung']; ?></textarea></td>
                                    
 
   <?php
```


----------



## para_noid (24. November 2012)

Hallo,

probier mal bitte das aus, was hier drin steht, das error_reporting ist nötig 
(unter der Zeile mit dem error_reporting ggf. noch *ini_set('display_errors', 1);* schreiben, falls du keine Fehlerausgabe hast)

Paar Hinweise schonmal:


```
if (substr($key,3) == 'pin_')
```
substr erwartet als zweiten Parameter den Startpunkt und als dritten die Länge des Teilstrings, den es zurückgeben soll. Da $key hier mit "pin_" anfängt, musst du als zweiten Parameter 0 und als dritten 4 mitgeben.

```
if (substr($key,0,4) == 'pin_')
```

Bei Bedingungsverzeigungen immer mal ein echo dazuwerfen, damit du logische Fehler mitbekommst.




```
$sql = "UPDATE schule_termine SET bezeichnung=substr('".$_POST['bezeichnung']."',0,-3) usw."
```
Du verwendest hier substr von MySQL, nicht von PHP. Die Funktion läuft in MySQL fast genauso, unterscheidet sich aber mindestens in einer Eigenschaft:


> Wenn len (dritter Parameter) kleiner als 1 ist, wird der Leer-String zurückgegeben.


 MySQL-Referenz

Schätze du wolltest ursprünglich die PHP-Entsprechung verwenden (mit den Parametern haut das trotzdem nicht hin, aber das solltest du dann beim Debuggen merken). Dann musst du den Teil auch aus dem String herausnehmen, den du an die Datenbank übergibst.


```
$sql = "UPDATE schule_termine SET bezeichnung='".substr($_POST['bezeichnung'],0,-3)."' usw."
```




```
<? echo $dataprov[pin]; ?>
```

Wenn der Index eines Arrays ein String ist, muss er auch in Single oder Double Quotes gesetzt werden. Dass es trotzdem so funktioniert, liegt daran, dass pin erst als Konstante gesucht wird, und wenn eine solche nicht exisitiert, wird es automatisch als String angenommen. Das wirft 'ne Warnung, die du dir sparen kannst:


```
<? echo $dataprov['pin']; ?>
```

Und noch ein Hinweis: du kannst in Formularen auch mit Arrays arbeiten. Statt

```
<input name="pin_<? echo $dataprov['pin']; ?>" />
```
kannst du 

```
<input name="pin[<? echo $dataprov['pin']; ?>]" />
```
schreiben. Danach hast du im Postarray dann diese Struktur:

```
Array(
  pin => Array(
    daswasechoausgibt => Wert
  )
)
```

und damit könntest du dir das Stringgeschnibbel sparen.


----------



## johannes123 (24. November 2012)

Hallo, danke für die Tips.
das Error und SQL Errorreporting hat zu Tage gebracht dass ich keine Daten in meiner SQL Anweisung zum verarbeiten habe.
// Notice: Undefined index: pin in /var/www/web218/html/update/termine.php on line 120
// UPDATE schule_termine SET bezeichnung=substr('',0,-3) WHERE pin=substr('',0,-3) 

Ich habe aber ein volles Array

```
echo '<pre>'.print_r($_POST, true).'</pre>';
```
Sagt das zumindest, da sind 10 Datensätze drin mit den richtigen Feldbezeichner. 

Es sieht so aus als hätte ich hier was falsch gemacht, aber nur was?

```
$sql = "UPDATE schule_termine SET bezeichnung=substr('".$_POST['bezeichnung']."',0,-3) WHERE pin=substr('".$_POST['pin']."',0,-3)";
```


----------



## Dimenson (24. November 2012)

Morgen,

und ganz wichtig bei allen $_POST Variablen ein mysql_real_escape_string  verwenden wenn die Daten in die Datenbank geschrieben werden soll.

von 

```
$_POST['bezeichnung']
```

in

```
mysql_real_escape_string($_POST['bezeichnung']);
```


Dies verhindert SQL-Injections


----------



## johannes123 (24. November 2012)

Das mit dem Array funktioniert, kannst du mir noch sagen wie ich dann meine sql abfrage gestalten soll das ich die werte aus dem array in die Datenbank schreiben kann?


----------



## timestamp (24. November 2012)

```
// BeispielDaten
$_POST['names'] = array('Hans', 'Peter', 'Gabi', 'Klaus');

$sql = 'INSERT INTO tbl_names (`name`) VALUES ';
foreach( $_POST['names'] as $name ){
  $sql .= ' ("'.mysql_real_escape_string($name).'"), ';
}
// überschüssiges Komma entfernen
$sql = substr($sql, 0, -2);
mysql_query($sql);
```


----------



## johannes123 (25. November 2012)

Danke für die Hilfe,
aber ich bin da auf keinen grünen Zweig gekommen.
Ich habs nun so gelöst, das ich einfach bei jeder Zeile einen button dazubekomme und darüber in einem Formular den Datensatz editiere.


----------



## timestamp (25. November 2012)

Ach du willst ein UPDATE, dann passe mein INSERT einfach dementsprechend an.


----------



## mike-pretzlaw (25. November 2012)

In diesem Zusammenhang sind auch Prepared-Statements von PDO ganz nett.
Da kannst sicher gehen, dass keine QueryInjection rein kommt und es dürfte dir in Zukunft auch weiterhelfen.
mysql_* sind ziemlich überholte Funktionen die mittlerweile gut von MySQLi abgelöst werden:

http://php.net/manual/de/pdo.prepare.php
http://php.net/manual/de/book.mysqli.php


----------



## johannes123 (25. November 2012)

Das mit dem Update ist mir scho klar, was mir dabei immer noch nicht klar ist wie ich dass array mit dem array genau machen soll dass er mir dir richtigen werte einträgt.

```
$_POST['names'] = array('Hans', 'Peter', 'Gabi', 'Klaus');
```

Ich weis nicht wass ich da reinschreiben soll ( =array(`Hans','Peter,...)) 
Ich kann da nix fixes festlegen, weil das alles variablen sind, und ich nicht wiss wie ich die da richtig raushole.
Damit jeder datensatz eindeutig ist erstelle ich ein array wo ich bei den Feldnamen einen pin der gleichzeitig der priärschlussel in der Datenbank ist angehängt habe. Wenn ich mir den Inhalt in dem array anschaue passt der auch.
Jetzt stehe ich aber vor dem problem dass ich dass Konstukt zum Eintragen wider irgendwie sortieren und zu den richtigen Feldbezeichnungen kommen muß da er mir sonst nichts einträgt. 
Wahrscheinlich denke ich da irgendwie zu kompliziert.

Ich hab mir mittlerweile ein PHP Buch organisiert und werde das ganze noch einmal durchackern.


----------



## timestamp (25. November 2012)

johannes123 hat gesagt.:


> ```
> $_POST['names'] = array('Hans', 'Peter', 'Gabi', 'Klaus');
> ```
> Ich weis nicht wass ich da reinschreiben soll ( =array(`Hans','Peter,...))



Ich hatte doch dazu geschrieben dass das nur Beispieldaten sind. $_POST['names'] kommt natürlich von deinen input Feldern, da steht dann das drin was der User eingibt.


----------

