Zum Inhalt springen

Daten in Datenbank speichern -> Tx_Extbase_Persistence_Storage_Exception_SqlError

Erstellt am 5. Juli 2011 · 5 Antworten · letzte Antwort am 5. Juli 2011

Tags: TCA, Frage

Unbekannter Benutzer ·

Hi,

In meinen Controller PkwController möchte ich Daten in die Datenbank speichern, welche jedoch in eine andere Tabelle gehören, als die des Models Pkw (es geht hier nicht ums Mapping).

Ich erzeuge also ein Repository $reifenRep sowie eine Instanz $reifen der Klasse Reifen um dieses dann in die Tabelle des Models Reifen zu speichern.

<?php
$this->reifenRep = t3lib_div::makeInstance('Tx_MyExt_Domain_Repository_ReifenRepository');
$reifen = t3lib_div::makeInstance('Tx_MyExt_Domain_Model_Reifen');
$this->reifenRep->add($reifen);
?>

Die Tabelle wird wie folgt erstellt:

CREATE TABLE tx_myext_domain_model_reifen (

	uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
	pid int(11) DEFAULT '0' NOT NULL,
	
	hersteller varchar(255) DEFAULT '' NOT NULL,
	durchmesser int(11) unsigned DEFAULT '0' NOT NULL,
	
	crdate int(11) unsigned DEFAULT '0' NOT NULL,
	deleted tinyint(3) unsigned DEFAULT '0' NOT NULL,

	PRIMARY KEY (uid),
	KEY parent (pid)
);

Das ganze endet jedoch mit der Ausgabe dieser Fehlermeldung:

Tx_Extbase_Persistence_Storage_Exception_SqlError
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE uid='6'' at line 1

In der Tabelle wird ein Eintrag erzeugt, jedoch sind, bis auf das UID Feld, alle anderen Felder leer. Die Daten kommen also nicht an.

Ins TCA habe für das Domain Model Reifen nichts eingetragen, denn ich brauch das nicht übers Backend bearbeiten zu können. Oder ist ein Eintrag im TCA dennoch notwendig?

Wo liegt der Fehler?

Vielen Dank eure Hilfe.

Unbekannter Benutzer ·

Update:

ich hab das TCA um das Domain Model Reifen erweitert. Jetzt werden die Datensätze korrekt angelegt. Ich möchte diese Informationen aber nicht übers Backend erreichbar machen. Kann man das nicht abschalten?

Falls man das nicht umgehen kann, kann man dann vielleicht einen eigene StoragePid nur für dieses Domain Model angeben? Die Datensätze landen alle im SysFolder 1714 (also dem ersten aus der Liste) und das sollte nicht sein.

Mein Setup sieht wie folgt aus.

plugin.tx_myext {
	settings {
		storageFolder = 1714, 1715, 1716, 1717, 1718
	}
	persistence.storagePid < .settings.storageFolder
}
Eydamos ·

Trag einfach in die ext_tables.php folgendes ein:

$TCA['tx_myext_domain_model_reifen'] = array(
	'ctrl' => array(
		'hideTable'			=> true,
	),
);

Dadurch werden die Datensätze nichtmehr im BE angezeigt.

Unbekannter Benutzer ·

Hi,

ok vielen Dank! 🙂

Warum muss ich überhaupt etwas ins TCA eintragen? Ich dachte immer, dass wäre nur dafür, dass die Tabellen im Backen erscheinen, oder etwa nicht?

Eydamos ·

Nein das TCA sagt auch wie die Daten gespeichert werden sollen. TYPO3 achtet nicht darauf ob in deiner .sql steht das ein Feld vom Typ varchar z.B. ist, sondern TYPO3 guckt im TCA was dort definiert ist.
Abgesehen von ein paar Feldern für Übersetzungen und Versionierung müssen daher alle Felder die auch in der Datenbank gespeichert werden sollen ins TCA eingetragen werden.