Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

Data Model Questions /

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

SS 2.4 DataObject write() writes 'NULL' to DB


Go to End


1226 Views

Avatar
BlackHawk

Community Member, 7 Posts

4 September 2012 at 4:58am

Hi @ all,

I have problems to write the value of a object variable to the database field.

This is the code of the dataobject (I am sorry for the code-comments in german, but I guess you know, what it is about):

class TestCode extends DataObject {
	
	protected $Code;
	
	static $singular_name = 'Code';
	static $plural_name = 'Codes';
	
	static $db = array (
		'Code' => 'Varchar'
	);
	
	static $has_one = array (
	);
	
	public function __construct() {
		$this->Code = $this->generateUniqueCode();
		parent::__construct();
	}
	
	protected function generateCode() {
		/*
		 * Anzahl der Zeichen des Codes
		 * Bedingung: $length <= count($chars)
		 */
		$length = 12;
		
		//Zeichen die für den Code verwendet werden sollen
		$chars = array_merge(
				range('1','9'),
				range('a','k'),
				array('m','n'),
				range('p','z'),
				range('A','H'),
				range('J','N'),
				range('P','Z'),
				array('!','$','#','%')
		);
		
		//Array in das die Zeichen aufgenommen werden sollen
		$codeArr = array();
		
		//Zufallszahlengenerator mit seed setzen
		mt_srand((double)microtime()*1000000);
		
		/*
		 * Das Array mit Zahlen füllen:
		 * Für jeden Schleifendurchlauf der äußeren Schleife
		 * wird immer ein neuer Buchstabe zufällig aus der inneren Schleife gewählt
		 * 
		 */
		for($i = 0; $i < count($chars); $i++){
			for($j = 1; $j <= (count($chars)*2); $j++){
				$swap = mt_rand(0, count($chars)-1);
				$tmp = $chars[$swap];
				$chars[$swap] = $chars[0];
				$chars[0] = $tmp;
			}
			$codeArr[$i] = $chars[0];
		}
		
		//generierter Code
		$code = substr(implode('', $codeArr),0,$length);
		
		return $code;
	}
	
	protected function questionDbForCode($code) {
		
		$sqlQuery = new SQLQuery();
		$sqlQuery->select('Code');
		$sqlQuery->from('TestCode');
		$sqlQuery->where("Code", $code);
		$val = $sqlQuery->execute()->value();
				
		if($val) {
			return true;
		} else {
			return false;
		}
	}
	
	protected function generateUniqueCode() {
		$code = '';
		$goOn = false;
		
		do {
			$code = TestCode::generateCode();
			$goOn = TestCode::questionDbForCode($code);
		} while ($goOn);
		
		return $code;
	}
	
	function getCode() {
		return $this->Code;
	}
	
}

So when a new instance of 'TestCode' is generated, the objectvariable will get a code.
Now in another class I am calling the function 'generateCode()'. This generates a new databaseentry but the value for the column 'Code' is NULL.

Here is the code for the function 'generateCode()'

function generateCode() {
   $tcode = new TestCode();
   $tcode->write();
}

I guess there is no association between the objectvariable '$Code' and the database field 'Code'.
What am I doing wrong?
Anybody an idea?

Thank's a lot!