---
title: "Repository->add() generiert leere Datenbankeinträge?!"
url: "https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege"
source: "typo3.net"
tags: ["Extensions","Extbase","Frage"]
created: "2011-07-28"
last_reply: "2016-02-09"
replies: 16
solved: false
page: 1
pages: 1
lang: "de"
---

# Repository->add() generiert leere Datenbankeinträge?!

Extensions › Extbase · 16 Antworten · gestartet 2011-07-28

## Eröffnungsbeitrag

**Unbekannter Benutzer** · 2011-07-28 · [Beitrag #1](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/1)

Hi,

ich hab ein ziemliches Problem mit dem erstellen von Datenbankeinträgen. Genauer gesagt werden Datenbankeinträge eines bestimmten Domain Models zwar angelegt, jedoch fehlen jegliche Daten.

Hier die Funktion, welche den Datensatz speichert (Klasse: *Tx_MyExt_Controller_ObjectController*):

```php
<?php
/**
 * 
 * @param string $code
 * @param Tx_MyExt_Domain_Model_Object $object
 * 
 * @return void
 */
public function storeObjectCode($code='', $object=NULL) {
	if(!empty($code) && $object) {
		$persistenceManager = t3lib_div::makeInstance('Tx_Extbase_Persistence_Manager');
		$newCode = t3lib_div::makeInstance('Tx_MyExt_Domain_Model_Object');
		$newCode->setCode($code);
		$newCode->setObjectId($object->getUid());
		$newCode->setUserId($this->accessControlService->getFrontendUserUid());
		$this->objectCodeRepository->add($newCode);
		$persistenceManager->persistAll();
		t3lib_div::debug($this->objectCodeRepository->getAddedObjects(), '$this->objectCodeRepository->getAddedObjects()');
	}
}
?>
```

Die Debug-Anweisung in der letzten Zeile gibt folgendes aus:

```php
<?php
$this->objectRepository->getAddedObjects()
|Object:

Tx_Extbase_Persistence_ObjectStorage Object
(
    [storage:protected] => Array
        (
            [a43b13d7d70921c4b2d63015384e3f30] => Tx_MyExt_Domain_Model_ObjectCode Object
                (
                    [code:protected] => 071128.20.38.1115.171710
                    [objectId:protected] => 38
                    [pid:protected] => 
                    [userId:protected] => 1115
                    [quantityPrinting:protected] => 1
                    [_cleanProperties:private] => Array
                        (
```

```plaintext
 => 071128.20.38.1115.171710
                            [objectId] => 38
                            [pid] => 
                            [userId] => 1115
                            [quantityPrinting] => 1
                            [uid] => 9239
                        )

                    [uid:protected] => 9239
                    [isClone:private] => 
                )

        )

    [isInitialized:protected] => 1
)
?>
```

In der Datenbank wird der Datensatz wie folgt gespeichert (Ausgabe aus Windows cmd)

```php
mysql> select * from tx_myext_domain_model_objectcode;
+-----+------+------+-----------+---------+-------------------+------------+------------+---------+--------+
| uid | pid  | code | object_id | user_id | quantity_printing | tstamp     | crdate     | deleted | hidden |
+-----+------+------+-----------+---------+-------------------+------------+------------+---------+--------+
|  60 | 2123 |      |         0 |       0 |                 0 | 1311866227 | 1311866227 |       0 |      0 |
+-----+------+------+-----------+---------+-------------------+------------+------------+---------+--------+
```

Alle nötigen Informationen sind vorhanden, jedoch werden sie nicht in die Datenbank gespeichert. Die Felder *code*, *object_id*, *user_id* und *quantity_printing* sind leer obwohl ich sie befüllt habe?!

Ich seh den Fehler nicht :(. Weiß da jemand Rat?

Danke.

## Antworten

### [#2](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/2) · BlackPixel · 2011-07-29

Passen die Felder der DB zum Model`? Sind im Model die Annotationen korrekt? Hast Du mal eine kleine Testunit für Dein Model geschrieben und getestet ob mit den getter/setter alles passt?

Gruß Manfred

### [#3](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/3) · Unbekannter Benutzer · 2011-07-29

Hi,

ja das passt alles eigentlich. Ich hab die Extension ursprünglich auf einer anderen Serverumgebung entwickelt. Dort lief alles reibungslos. Dann ging die Extension ins Produktivsystem über und nun hab ich den Salat :(

Ich hab noch folgendes ausprobiert:

1. Objekt erstellen und sofort in die DB speichern:

```php
<?php
$newCode = t3lib_div::makeInstance('Tx_MyExt_Domain_Model_Object');
$this->objectCodeRepository->add($newCode);
$persistenceManager = t3lib_div::makeInstance('Tx_Extbase_Persistence_Manager');
$persistenceManager->persistAll();
?>
```

2. Übers Repository das zuletzt gespeicherte Object holen und mit allen nötigen Informationen füllen:

```php
<?php
$newCode = $this->objectCodeRepository->findLatestEntry(); // Absteigend nach crdate sortieren mit Limit 1
$newCode->setCode($code);
$newCode->setObjectId($object->getUid());
$newCode->setUserId($this->accessControlService->getFrontendUserUid());
?>
```

3. Den Datensatz mittels *Repository->update()* aktualiseren:

```php
<?php
$this->objectCodeRepository->update($newCode);
?>
```

Ergebnis: die Daten wurden korrekt gespeichert.

Woran kann es liegen, dass **update()** funktioniert, **add()** jedoch nicht?!

Ich bin mit der Lösung aber eigentlich gar nicht zufrieden, denn das setzt vorraus, dass zum Zeitpunkt des 2. Schrittes kein anderer Datensatz erstellt wurde, sonst liefert mir die Repository Funktion **findLatestEntry()** den falschen Datensatz.

Gibt eine Möglichkeit, das im ersten Schritt erstellte Objekt in **$newCode** mit **add()** zu speichern und direkt weiterzunutzen, so dass ich **findLatestEntry()** weglassen kann?

### [#4](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/4) · oliver_g · 2011-08-03

Da bleibt dir nichts anderes übrig als einen Debugger anzuschmeißen und in den Persistence-Layer hinabzusteigen. Keine Sorge so schlimm ist das nicht ;-)

Was sagt das Datenbank-Log? Eventuell liegt das Problem außerhalb deiner Programmierung, du sagtest ja, in der Dev-Umgebung läuft es.

### [#5](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/5) · Unbekannter Benutzer · 2011-08-03

Hi,

ich vermute es hängt mit folgendem Problem zusammen -> [/d/106569-sr-feuser-register-fehler-bei-der-benutzer-authentifizierung](https://www.typo3.net/d/106569-sr-feuser-register-fehler-bei-der-benutzer-authentifizierung)

Dort habe ich beschrieben, wie eine Master-Slave Serverkonfiguration (Replikation der DB über den Master) Probleme beim Speichern und Lesen der Datenbank verursacht. Ich hab das Problem auf die Funktion **$TYPO3_DB->sql_insert_id();** eingrenzen können. Diese lieferte keine passende UID zurück.

Weißt du vielleicht wie die **add()** Funktion genau arbeitet? Kann man das irgendwo nachlesen?

### [#6](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/6) · oliver_g · 2011-08-03

Du musst in das StorageBackend für Typo3 von Extbase rein. Einfach mal den Debugger nehmen und hinabsteigen bis du zu den eigentlichen Schreiboperationen kommst. Das ganze ist ziemlich geschichtet, ohne Debugger das anschauen ist hoffnungslos.

Gruß

### [#7](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/7) · Unbekannter Benutzer · 2011-08-03

Hmm ok, dann werd ich das mal versuchen. Jedoch kenne ich den Debugger, von dem du sprichst, nicht. Ist das ne eigene Extension oder wo krieg ich das her?

### [#8](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/8) · oliver_g · 2011-08-03

ZendDebugger oder Xdebug. ZendDebugger läuft problemlos mit Eclipse, xdebug mit Eclipse + Netbeans. Andere IDEs kenne ich nicht. Beide Debugger sind Erweiterungen für PHP selbst (werden als Dll bzw. .so) eingebunden.

### [#9](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/9) · Unbekannter Benutzer · 2011-08-03

Hmm, das ist mir jetzt alles zu zeitaufwendig. Ich brauche eine pragmatischere Lösung ;)

Ich hab mir mal die Klasse **Classes/Persistence/Storage/Typo3DbBackend** in extbase 1.0.2 angeschaut und da gibt es folgende Funktion:

```php
<?php

/**
 * Adds a row to the storage
 *
 * @param string $tableName The database table name
 * @param array $row The row to be inserted
 * @param boolean $isRelation TRUE if we are currently inserting into a relation table, FALSE by default
 * @return int The uid of the inserted row
 */
public function addRow($tableName, array $row, $isRelation = FALSE) {
	$fields = array();
	$values = array();
	$parameters = array();
	if (isset($row['uid'])) {
		unset($row['uid']);
	}
	foreach ($row as $columnName => $value) {
		$fields[] = $columnName;
		$values[] = '?';
		$parameters[] = $value;
	}

	$sqlString = 'INSERT INTO ' . $tableName . ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
	$this->replacePlaceholders($sqlString, $parameters);
	// debug($sqlString,-2);
	$this->databaseHandle->sql_query($sqlString);
	$this->checkSqlErrors();
	$uid = $this->databaseHandle->sql_insert_id();
	if (!$isRelation) {
		$this->clearPageCache($tableName, $uid);
	}
	return (int)$uid;
}
?>
```

Relativ weit unten findet man den Befehl **sql_insert_id()**, der, wie von mir vermutet, bei einer Master-Slave-Serverkonfiguration nicht funktioniert.

Da es dafür keinen anständigen Workaround gibt, muss ich wie im oben verlinkten Beitrag den Datensatz nach dem **add()** neu auslesen und mittels **update()** alle Informationen nachträglich abspeichern.

Wie ich aber schon erwähnt habe, kann es zu Problemen führen wenn zwei Datensätze zeitgleich erzeugt werden. Dann erhalte ich unter Umständen den falschen Datensatz zurück.

Ich würde den Datensatz zusätzlich über das Feld **user_id** identifizieren und hab gedacht, dass man zumindest diesen Wert schon im TCA (tca.php) über das Attribut **default** vorbelegen kann.

Also so irgendwie (nur exemplarisch):

```php
<?php
'user_id' => array(
	'exclude' => 1,
	'label'   => 'FE User ID',
	'config' => array(
		'type' => 'input',
     		'size' => 4,
		'eval' => 'trim,int',
		'default' => ### Hier die USER ID des eingeloggten Frontend User abfragen ###
	),
),
?>
```

Dazu hab ich vorhin einen neues Thema eröffnet -> [/d/106627-fe-user-id-als-default-value-im-tca](https://www.typo3.net/d/106627-fe-user-id-als-default-value-im-tca)

Weißt du vielleicht ob das möglich ist?

Besten Dank bisher :)

### [#10](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/10) · oliver_g · 2011-08-03

Ich kenn mich nicht so aus mit Master/Slave Konfigurationen von MySQL. Weißt du das genau, dass mysql_insert_id() nicht mit M/S funktioniert?

Vermutungen lassen sich gut durch einen Debugger bestätigen ;-) Nicht dass du noch falsch liegst...

### [#11](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/11) · Unbekannter Benutzer · 2011-08-03

Meine Vermutung stimmt (leider). Ich hab das von Hand debugged.

### [#12](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/12) · Unbekannter Benutzer · 2011-08-03

Problem gelöst, wenn auch nicht schön aber anders gehts nun mal nicht!

Funktion **addRow()** in **typo3/sysext/extbase/Classes/Persistence/Storage/Typo3DbBackend.php** erweitert:

```php
<?php
if($tableName == 'tx_myext_domain_model_objectcode') { 
	$values[] = '?';
	$fields[] = 'user_id';
	$parameters[] = intval($GLOBALS['TSFE']->fe_user->user['uid']);
}
?>
```

Nun wird das Datenbankfeld "user_id" mit der aktuellen FE User ID befüllt und ich kann sie zur Weiterverarbeitung nutzen. Ich musste jedoch dieses Feld aus meinem Domain Model entfernen, sonst überschreibt das Model diesen Wert.

Dadurch konnte ich im Repository das Feld nicht mehr direkt ansprechen und musste zu **$query->statement()** greifen.

Es funktioniert und das genügt mir :)

### [#13](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/13) · kainobi · 2011-08-04

An Deiner Stelle würde ich es mal noch mit einem Update versuchen. Version 1.0.2 ist steinalt ;-)
Aktuell stable ist die Version 1.3.0 (mit TYPO3 4.5). Da wurden in der Zwischenzeit Unmengen an Sachen gefixt und geändert...

### [#14](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/14) · Unbekannter Benutzer · 2011-08-04

Hi,

ich weiß, Version 1.0.2 is wirklich alt. Es wurde mir hier im Forum schon nahegelegt upzudaten (anscheinend soll das auch ohne Probleme gehen) aber ich zögere noch etwas. Es existieren schon einige Extbase Extension und ich weiß nicht was passiert, wenn ich ein Update durchführe.

Außerdem, in extbase 1.3.0 sieht die von mir angepasste Funktion **Typo3DbBackend::addRow()** wie folgt aus:

```php
<?php
/**
 * Adds a row to the storage
 *
 * @param string $tableName The database table name
 * @param array $row The row to be inserted
 * @param boolean $isRelation TRUE if we are currently inserting into a relation table, FALSE by default
 * @return int The uid of the inserted row
 */
public function addRow($tableName, array $row, $isRelation = FALSE) {
	$fields = array();
	$values = array();
	$parameters = array();
	if (isset($row['uid'])) {
		unset($row['uid']);
	}
	foreach ($row as $columnName => $value) {
		$fields[] = $columnName;
		$values[] = '?';
		$parameters[] = $value;
	}

	$sqlString = 'INSERT INTO ' . $tableName . ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
	$this->replacePlaceholders($sqlString, $parameters);
	// debug($sqlString,-2);
	$this->databaseHandle->sql_query($sqlString);
	$this->checkSqlErrors($sqlString);
	$uid = $this->databaseHandle->sql_insert_id();
	if (!$isRelation) {
		$this->clearPageCache($tableName, $uid);
	}
	return (int)$uid;
}
?>
```

Wie man sieht hat sich hier nicht viel getan, die aktuelle UID wird nach wie vor mittels **sql_insert_id()** ausgelesen, was ja genau mein Problem bei einer Master-Slave-Serverkonfiguration ist ;)

Deswegen lasse ich das alles erst mal so wie es ist. Dennoch danke für deinen Tipp.

### [#15](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/15) · invigo · 2011-09-05

hmm hmm hmm

```php
$newCode = t3lib_div::makeInstance('Tx_MyExt_Domain_Model_Object');
```

ich würde stattdessen

```php
$newCode =  new Tx_MyExt_Domain_Model_Object;
```

ausprobieren.

Meines Wissens nach erzeugt t3lib_div::makeInstance nicht zwingend ein neues Objekt

Desweiteren:
nach Repository->add($newCode) bekommst Du die Insertuid durch $newCode->getUid();,bin mir nur grad nicht sicher, ob ein Persist erforderlich ist oder nicht

### [#16](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/16) · Unbekannter Benutzer · 2011-09-06

> **invigo schrieb:**
>
> hmm hmm hmm
>
> ```php
> $newCode = t3lib_div::makeInstance('Tx_MyExt_Domain_Model_Object');
> ```
>
> ich würde stattdessen
>
> ```php
> $newCode =  new Tx_MyExt_Domain_Model_Object;
> ```
>
> ausprobieren.
>
> Meines Wissens nach erzeugt t3lib_div::makeInstance nicht zwingend ein neues Objekt
>
> Desweiteren:
> nach Repository->add($newCode) bekommst Du die Insertuid durch $newCode->getUid();,bin mir nur grad nicht sicher, ob ein Persist erforderlich ist oder nicht

Das bringt alles nichts, hab ich schon bis zum Erbrechen ausprobiert. Das Problem liegt bei der Server-Konstellation (Master/Slave). Trotzdem danke ;)

### [#17](https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege/17) · davidczadilek · 2016-02-09

Hatte das selbe Problem. Bei mir war die Ursache eine fehlende TCA Konfiguration:
<http://stackoverflow.com/questions/9110272/extbase-stores-empty-values-in-database>

---

Quelle: „Repository->add() generiert leere Datenbankeinträge?!“, typo3.net, https://www.typo3.net/d/106553-repository-add-generiert-leere-datenbankeintraege
Beiträge von Mitgliedern des Forums. Bitte mit Link auf die Diskussion zitieren.
