Updatebypk() Löscht Nicht Übergebene Felder


(Crodealer) #1

Hi,

im User-Backend habe ich 5 Felder zur Verfügung gestellt die geupdatet werden können.

Der Controller sieht wie folgt aus:




if(isset($_POST['Users']))

{

	$oUser = new Users;

	$oUser->id = $_POST['tID'];

	$oUser->setAttributes($_POST['Users']);


	$oUser->updateByPk($oUser->id,$oUser->getAttributes());

			

	$this->redirect(array('admin/userupdate', 'id' => $oUser->id));

}



Übergeben werden im POST folgende Felder:


[username] => ding

[prename] => Vornic

[surname] => Nachnai

[email] => mail@solalala.com

[city] => Cologne

[country_id] => 6

Yii updatet jedoch auch das Passwort in der DB, obwohl dies nicht im POST enthalten ist.

So wie es aussieht werden die übergebenen Felder geupdatet und alle anderen geleert.

Wie kann ich Yii sagen, dass er nur die übergebenen Felder updaten soll?

thx!


(Mario Mahr) #2

Hallo yii,

kenn mich mit Yii auch nicht so gut aus, habe erst wieder vor kurzem angefangen micht damit zu beschäftigen, aber vielleicht geht es so:




$oUser->updateByPk($oUser->id,$_POST['Users']);



Gruß…


(Crodealer) #3

Hi Mekroth,

danke das klappt.

Verstehen tue ich es aber nicht…


(Benjamin Woester) #4

Liegt an der getAttributes()-Methode. Die gibt laut Doku auch nicht aus der DB geladene Felder zurück. In deinem Fall also alle Properties der User-Klasse. Die die aus dem $_POST-Array zugewiesen werden konnten sind befüllt, alle anderen NULL.

Um das Verhanlten zu ändern, probier’s mal mit


$oUser->updateByPk( $oUser->id, $oUser->getAttributes(null) );

Und vergiss nicht dein Model zu validieren bevor du speicherst. ;)


(Mh) #5

Dumme Frage: Warum machst du das überhaupt mit updateByPk() und nimmst nicht den Standardweg über save()?


(Crodealer) #6

Mit save hat er mir ständig einen neuen Eintrag angelegt.

Dann habe ich ein hiddenField erzeugt mit "ID" und dort den Wert angelegt, jedoch wurde dieser dann nicht mit übertragen.


(Mh) #7

Dann hast du prinzipiell schon was falsch gemacht. Du hast vermutlich einfach ein neues Record angelegt und dann versucht das mit der selben ID zu speichern. Richtig wäre, erst das alte Objekt anhand der ID zu laden, dann die POST-Daten zuzuweisen und zu speichern.


(Spatan2002) #8

Why did you tell him stupid question. Thats rude. The fact that you know better doesn’t me you should be rude.