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.

Data Model Questions /

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

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


Go to End
Reply


642 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!