/** * Populates a new bug's data with all table's columns with defaults */ private function initNewBug() { $this->bugID = Liste::getAIval($this->bugInfos->getTable()); foreach (Liste::getCols($this->bugInfos->getTable()) as $col) { $val = ''; if ($col === 'id') { $val = $this->bugID; } if ($col === 'date') { $val = date('Y-m-d H:i:s'); } if ($col === 'author') { $val = 'Admin'; } if ($col === 'priority') { $val = 4; } if ($col === 'closed') { $val = 0; } if ($col === 'FK_comment_ID') { $val = '[]'; } $this->bugData[$col] = $val; } }
/** * MISE À JOUR (SAVE) d'une entrée dans la table courante * @param STRING $filterKey Le nom de la colonne à utiliser pour identifier l'entrée (default 'id') * @param STRING $filterVal L'identifiant à utiliser (default 'this' -> correspond à l'entrée actuelle) * @param BOOLEAN $addCol TRUE pour ajouter la(les) colonne(s) si elle(s) n'existe(nt) pas * @param STRING $autoDate TRUE pour mettre à jour le champ de dernière modification avec la date courante, et la date de création dans le cas d'un INSERT, si la colonne est présente. (default TRUE) * @return STRING Le type de requête SQL qui vient d'être utilisée pour le save ('UPDATE', ou 'INSERT') */ public function save($filterKey = 'id', $filterVal = 'this', $addCol = true, $autoDate = true) { if (!$this->bddCx || !is_object($this->bddCx)) { $this->initPDO(); } // si pas d'argument on utilise l'entrée courante if ($filterVal == 'this') { $filterVal = @$this->data[$filterKey]; } // Mise à jour d'une éventuelle colonne de date de last modif (la constante de config LAST_UPDATE doit être définie) if ($autoDate && defined("LAST_UPDATE") && LAST_UPDATE !== false) { $this->data[LAST_UPDATE] = date("Y-m-d H:i:s"); } // Vérifie si tous les champs existent, sinon crée le champ à la volée if ($addCol) { $this->checkMissingCols(); } // Construction de la chaine des clés et valeurs SQL pour la requête $keys = ''; $vals = ''; $up = ''; foreach ($this->data as $k => $v) { if (is_array($v)) { $v = json_encode($v, JSON_UNESCAPED_SLASHES + JSON_UNESCAPED_UNICODE + JSON_NUMERIC_CHECK); } if (is_string($v)) { $v = addslashes($v); } $keys .= "`{$k}`, "; $vals .= "'{$v}', "; $up .= "`{$k}`='{$v}', "; } $keys = rtrim($keys, ', '); $vals = rtrim($vals, ', '); $up = rtrim($up, ', '); // Update de l'entrée si chargée en mémoire if ($this->loaded) { $req = "UPDATE `{$this->table}` SET {$up} WHERE `{$filterKey}` LIKE '{$filterVal}'"; } else { // Insertion de l'entrée si nouvelle $req = "INSERT INTO `{$this->table}` ({$keys}) VALUES ({$vals})"; // Ajout de la date de création (si la colonne est présente) (la constante de config DATE_CREATION doit être définie) if ($autoDate && defined("DATE_CREATION") && DATE_CREATION !== false) { $this->data[DATE_CREATION] = date("Y-m-d H:i:s"); } $nextid = Liste::getAIval($this->table); } // Sauvegarde en base de données $q = $this->bddCx->prepare($req); try { $q->execute(); } catch (Exception $e) { $msg = $e->getMessage(); if ($e->getCode() == 23000) { $keyOffset = strrpos($msg, "'", -2); $key = substr($msg, $keyOffset); throw new Exception("Infos::save() : Duplicate entry for '{$key}' in table '{$this->table}'."); } else { throw new Exception("Infos::save(), table '{$this->table}' -> {$msg}"); } } if (@$nextid) { $this->data['id'] = (int) $nextid; } $this->loaded = true; $err = $q->errorInfo(); if ($err[0] == 0) { return substr($req, 0, 6); } else { throw new Exception('Infos::save() : ' . $err[2]); } }