J'ai donc une classe d'article comme suit:Extension objet PHP Question
class Item { private $db; private $data = array( 'AltItem1' => null, 'AltItem2' => null, 'BaseUOM' => null, 'Category1' => null, 'Category2' => null, 'Category3' => null, 'Category4' => null, 'Iden' => null, 'IsHCS' => null, 'ItemDesc' => null, 'ItemNmbr' => null, 'ItemType' => null, 'MSDS' => null, 'NoteText' => null, 'NonStock' => null, 'PrcLevel' => null, 'TipPrice' => null, 'DTM_UpdType' => null, 'DTM_UpdDateTime' => null, 'DTM_DownloadDateTime' => null, 'DTM_UploadDateTime' => null ); public function __construct(mysqli $db, $id = null){ $this->db = $db; if(!empty($id)){ $id = (int)$id; $this->populate($id); } } public function __get($key) { if(array_key_exists($key, $this->data)){ return $this->data[$key]; } error_log("Invalid key '$key'"); return null; } public function __set($key, $value) { if(array_key_exists($key, $this->data)){ $this->data[$key] = $value; return true; } return false; } public function populate($id) { $sql = sprintf( "SELECT %s FROM ItemMaster WHERE id = ?", implode(", ", array_keys($this->data)) ); $stmt = $this->db->stmt_init(); $stmt->prepare($sql) or die ("Could not prepare statement:" . $stmt->error); $stmt->bind_param('i', $id); $stmt->execute() or die('exec'); $stmt->store_result(); if($stmt->num_rows == 1) { $params = array(); foreach($this->data as $key => $val){ $params[] = &$this->data[$key]; } call_user_func_array(array($stmt, 'bind_result'), $params); $stmt->fetch(); $return = true; } else{ user_error("No rows returned for id '$id'"); $return = false; } return $return; } public function insert() { $params = $this->data; $values = array(); foreach($params as $param){ $values[] = "?"; } $sql = sprintf( "INSERT INTO recurrence (%s) VALUES (%s)", implode(", ", array_keys($params)), implode(", ", $values) ); $stmt = $this->db->stmt_init(); $stmt->prepare($sql) or die ("Could not prepare statement:" . $stmt->error); $types = str_repeat("s", count($params)); array_unshift($params, $types); call_user_func_array(array($stmt, "bind_param"), $params); $stmt->execute(); $stmt->store_result(); $result = $stmt->result_metadata(); } public function update() { $sql = "UPDATE recurrence SET "; $params = array(); foreach($this->data as $key => $value){ $params[] = "$key = ?"; } $sql .= implode(", ", $params) . " WHERE id = ?"; $stmt = $this->db->stmt_init(); $stmt->prepare($sql) or die ("Could not prepare statement:" . $stmt->error); $params = $this->data; $params[] = $this->data['id']; $types = str_repeat("s", count($params)); array_unshift($params, $types); call_user_func_array(array($stmt, "bind_param"), $params); $stmt->execute(); $stmt->store_result(); $result = $stmt->result_metadata(); } }
Ma question est quelle serait la meilleure façon d'étendre cette classe avec la structure de données comme je l'ai? Je veux essentiellement une autre classe pour un article dans un panier. Donc, certains champs supplémentaires seraient la quantité, l'id du panier, etc. Ou y a-t-il une meilleure façon de le faire sans allonger la classe? Sur une autre note, disons que j'ai une autre variable $ price qui n'est pas stockée directement dans la base de données. Donc, je fais une variable publique, mais je devrais faire des méthodes d'assistance pour y accéder, n'est-ce pas? Si c'est le cas, mon tableau $ data est-il la meilleure solution pour ce type d'article?
Merci d'avance.
J'aime cette idée, le seul problème est l'insertion et les méthodes de mise à jour que je viens d'ajouter à la question d'origine. Ils sont un peu bizarres, mais ils rendent les quires bien plus faciles. Est-il possible de lier dans votre méthode d'enregistrement des variables avec mes méthodes d'insertion et de mise à jour. Accordé je pourrais faire une longue requête énorme pour inclure chaque variable mais de cette manière mes méthodes d'insertion et de mise à jour fonctionnent à travers le conseil pour toutes mes classes tant qu'elles ont cette variable de données de $. Qu'est-ce que tu penses? – MackDaddy