Zum Inhalt springen

Datensätze ergänzen

Erstellt am 25. Februar 2010 · 7 Antworten · letzte Antwort am 26. Februar 2010

Tags: Frage

DJ-Mingo ·

Hallo liebe Forumsmitglieder,

quäle mich schon einige Zeit mit folgendem Problem:

Möchte in einer Extension zur Verwaltung von Lagerbeständen den Ort 1:1 tauschen und in einem Feld <historie> einen Text anhängen.
Das mit dem Wechsel des Ortes (Ort1 -> Ort2) klappt vortrefflich mit exec_UPDATEquery...

Doch die Bearbeitung des Feldes <historie> bereitet Probleme.
Habe folgenden Code:

$neuHistory = 'Eine neue Zeile<br />';
				
		$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tx_tkbestand_basis','akttk = "'.$this->piVars['DATA']['alter_tk'].'"');
		$count = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
		$rows = array();
		
		if ($count) {
		while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))   {
				$rows = $row['history'].$neueHistory;				
				
		}
		}
		$neuerTkRecord = array (
   				'akttk' => addslashes($this->piVars['DATA']['neuer_tk']),
   				'history' => $rows['history']
   		    );	
		$res = $GLOBALS['TYPO3_DB']->exec_UPDATEquery ('tx_tkbestand_basis','akttk = "'.$this->piVars['DATA']['alter_tk'].'" AND not consumed',$neuerTkRecord);
		
		$GLOBALS['TYPO3_DB']->sql_free_result($res);

Ich weiss, dass da etliche Fehler drin sind, aber als Nicht-Profi würde ich mich über ein paar Tipps sehr freuen.

Im Prinzip geht es mir darum, wie ich innerhalb einer Tabelle ein Textfeld um weitere Einträge erweitere und diese in der Datenbank dann auch abspeichere.

VG Christian

ammannd ·

dein problem ist folgendes: wenn du auf zeile 15 den neuen wert zuweisen willst, weist du eine leere variable zu, denn $rows['history'] wurde ja nie definiert. Du weist aber der Variable $rows den neuen wert zu (und überschreibst damit mit jedem durchgang der Schleife (Zeile 8-10) den Wert erneut.

vorausgesetzt, deine select-abfrage gibt dir nur einen datensatz zurück (womit die schleife eigentlich hinfällig würde), sollte es ab zeile 7 bei dir etwa so aussehen:

if ($count)
  $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
  $newValue = $row['history'].$neueHistory;

  $neuerTkRecord = array(
    'attk' => addslashes($this->piVars['DATA']['neuer_tk']),
    'history' => $newValue
  );

  $res = $GLOBALS['TYPO3_DB']->exec_UPDATEquery(...)
}

ich hoffe, ich habe dich richtig verstanden und diese lösung erfüllt deinen wunsch! ansonsten frag einfach!

DJ-Mingo ·

Hallo ammannd,

vielen Dank für die Rückmeldung. Bringt mich wieder ein ganzes Stück weiter. Nur...es sollten durch die Select Abfrage >= 1 Eintrag geändert werden. Sage mal...es können 10, 100, 200 Einträge sein.

Mein Ziel ist ja folgendes.
Über ein kleines Eingabeformular im Frontend kann der Wechsel von einem Ort1 zu Ort2 vorgenommen werden. In der Datenbank wird dann bei allen Einträgen mit Ort1 dieser Wert überschrieben. Soweit so gut. Doch in dem Feld <Historie> soll dann protokolliert werden, dass dieser Wechsel nun grad stattgefunden hat. Es ist quasi ein Logbuch.

Habe den Code eben ausprobiert, bewirkt leider nix.

Für mein Verständnis: exec_UPDATEquery macht doch für alle Datensätze in einem Rutsch eine Aktualisierung der ausgewählten Felder. Im Falle fon Ort1 schreibt es eben Ort2 in alle Felder <Ort>, doch bei Historie müsste die Funktion ja das Array von 0 bis x einfügen.... #paralyzed#

ammannd ·

ok, jetzt weiss ich, was du machen willst! hm... ich lasse mich gerne korrigieren, glaube aber nicht, dass du dem update befehl ein array mit verschiedenen werten (als für jede row einen anderen wert) übergeben kannst. du kannst das ganze aber sehr einfach mit einer schlaufe lösen, also so:

if ($count) {
  while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))   {
    $neuerTkRecord = array(
      'attk' => addslashes($this->piVars['DATA']['neuer_tk']),
      'history' => $row['history'].'neue zeile or whatever...'
    );

    $res = $GLOBALS['TYPO3_DB']->exec_UPDATEquery(
      'tx_tkbestand_basis',
      'akttk = "'.$this->piVars['DATA']['alter_tk'].'" AND not consumed',
      $neuerTkRecord
    );
  }
}

wie gesagt, ich lasse mich gerne korrigieren. ich denke aber, dass auch eine schlaufe nicht grundlegende performance-probleme mit sich bringt.

DJ-Mingo ·

Suuuuuuuuuuuuppppppppppperr!

Phantastisch, das ist es. Klappt hervorragend. Vielen Dank Ammannd!

Einzig, bekomme noch eine Fehlermeldung:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /var/www/typo3_src-4.1.6/t3lib/class.t3lib_db.php on line 809

der Schnippsel sieht nun so aus:

$neuHistory = 'Eine neue Zeile<br>';
		
				
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tx_tkbestand_basis','akttk = "'.$this->piVars['DATA']['alter_tk'].'"');
$count = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
if ($count) {
while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))   {
	$neuerTkRecord = array (
   		'akttk' => addslashes($this->piVars['DATA']['neuer_tk']),
   		'history' => $row['history'].$neuHistory
   		    	);					
	$res = $GLOBALS['TYPO3_DB']->exec_UPDATEquery('tx_tkbestand_basis','akttk = "'.$this->piVars['DATA']['alter_tk'].'" AND not consumed',$neuerTkRecord);
}
}
		
$GLOBALS['TYPO3_DB']->sql_free_result($res);
ammannd ·

ja, mein fehler... im der update-query darfst du das resultat natürlich nicht der $res variable zuweisen, da die ja bereits die resultate der select-abfrage speichert. benenne sie einfach um, z.b in $res2 oder sowas!