"image/gif", "jpg" => "image/jpeg", "jpeg" => "image/jpeg", "png" => "image/png", "webp" => "image/webp"); const MTGI_BOOLEANDB = 1000001; private $id = 0; private $filename = ""; private $enabled = true; private $width = 0; private $height = 0; private $created = "1972-08-16 00:00:00"; public function getId() { return $this->id; } public function getFileName() { return $this->filename; } public function getFileExtension() { return pathinfo($this->filename, PATHINFO_EXTENSION); } public function getEnabled($flag = 0) { switch ($flag) { case MTGImage::MTGI_BOOLEANDB: return ($this->enabled) ? 1 : 0; break; default: return $this->enabled; break; } } public function getWidth() { return $this->width; } public function getHeight() { return $this->height; } public function getDimensions() { return $this->width . "x" . $this->height; } public function getCreated() { return $this->created; } public function getAge() { $now = new DateTime(); $mydate = new DateTime($this->getCreated()); $interval = $mydate->diff($now); return $interval->d; } public function setId($value = null) { if ( is_null($value) ) return false; if ( !is_int($value) ) return false; if ( $value <= 0 ) return false; $this->id = $value; return true; } public function setFileName($value = "") { if ( $value == "" ) return false; if ( strpos($value, ".") === false ) return false; if ( strpos($value, "\"") !== false ) return false; $testvalue = basename($value); if ( $testvalue != $value ) return false; $extension = pathinfo($value, PATHINFO_EXTENSION); if ( !in_array(strtolower($extension), MTGImage::VALID_EXTENSIONS) ) return false; $this->filename = $value; return true; } public function setEnabled($value = null) { if ( is_null($value) ) return false; if ( is_int($value) && (($value == 1) || ($value == 0)) ) { $this->enabled = ($value == 1) ? true : false; } elseif ( is_bool($value) ) { $this->enabled = $value; } else { return false; } return true; } public function setWidth($value = null) { if ( is_null($value) ) return false; if ( !is_int($value) || ($value < 0) ) return false; $this->width = $value; return true; } public function setHeight($value = null) { if ( is_null($value) ) return false; if ( !is_int($value) || ($value < 0) ) return false; $this->height = $value; return true; } public function renameImage($value = "") { $oldname = $this->getFileName(); $conflictImage = MTGImage::getImageByFileName($value); if ( $conflictImage !== false ) return false; if ( !$this->setFileName($value) ) { return false; } if ( !is_file(IMAGEPATH . $oldname) ) { $this->setFileName($oldname); return false; } if ( !rename(IMAGEPATH . $oldname, IMAGEPATH . $value) ) { $this->setFileName($oldname); return false; } $this->save(); return true; } public static function getRandomImage($id = 0) { global $globaldbh; if ( $id == 0 ) { $query = "SELECT id FROM images WHERE enabled = TRUE ORDER BY RAND() LIMIT 1"; $sth = $globaldbh->prepare($query); } else { $query = "SELECT id FROM images WHERE enabled = TRUE AND id <> :id ORDER BY RAND() LIMIT 1"; $sth = $globaldbh->prepare($query); $sth->bindValue(":id", intval($id), PDO::PARAM_INT); } $sth->execute(); if ( $row = $sth->fetch(PDO::FETCH_ASSOC) ) { return new MTGImage($row["id"]); } else { return false; } } public static function getImageByFileName($value = "") { global $globaldbh; $query = "SELECT id FROM images WHERE BINARY filename=:filename"; $sth = $globaldbh->prepare($query); $sth->bindValue(":filename", $value, PDO::PARAM_STR); $sth->execute(); if ( $row = $sth->fetch(PDO::FETCH_ASSOC) ) { return new MTGImage($row["id"]); } else { return false; } } public static function getList() { global $globaldbh; $query = "SELECT id FROM images ORDER BY LOWER(filename)"; $sth = $globaldbh->prepare($query); $sth->execute(); $thelist = array(); while ( $row = $sth->fetch(PDO::FETCH_ASSOC) ) { $thelist[] = new MTGImage($row["id"]); } return $thelist; } public function jsonSerialize(): mixed { if ( $this->getHeight() < 400 ) { $size = "small"; } elseif ( $this->getHeight() < 700 ) { $size = "medium"; } else { $size = "large"; } return [ 'id' => $this->getId(), 'filename' => $this->getFileName(), 'title' => pathinfo($this->getFileName(), PATHINFO_FILENAME), 'enabled' => $this->getEnabled(), 'width' => $this->getWidth(), 'height' => $this->getHeight(), 'dimensions' => $this->getDimensions(), 'created' => $this->getCreated(), 'age' => $this->getAge(), 'size' => $size, ]; } public function delete() { global $globaldbh; if ( is_file("images/" . $this->getFileName()) ) { if ( !unlink("images/" . $this->getFileName()) ) return false; } if ( $this->getId() == 0 ) return false; $query = "DELETE FROM images WHERE id=:id"; $sth = $globaldbh->prepare($query); $sth->bindValue(":id", (int) $this->getId(), PDO::PARAM_INT); $sth->execute(); $this->id = 0; return true; } public function save() { global $globaldbh; $query = "INSERT INTO images (id, filename, width, height) VALUES(:id, :filename, :width, :height) ON DUPLICATE KEY UPDATE filename=:filename, enabled=:enabled, width=:width, height=:height"; $sth = $globaldbh->prepare($query); $sth->bindValue(":id", (int) $this->getId(), PDO::PARAM_INT); $sth->bindValue(":filename", $this->getFileName(), PDO::PARAM_STR); $sth->bindValue(":enabled", (int) $this->getEnabled(MTGImage::MTGI_BOOLEANDB), PDO::PARAM_INT); $sth->bindValue(":width", (int) $this->getWidth(), PDO::PARAM_INT); $sth->bindValue(":height", (int) $this->getHeight(), PDO::PARAM_INT); $sth->execute(); if ( $this->getId() == 0 ) $this->setId($globaldbh->lastInsertId()); return; } public function __construct($imgid = 0) { global $globaldbh; if ( !is_int($imgid) || $imgid == 0 ) return; $query = "SELECT id, filename, enabled, width, height, created FROM images where id=:id"; $sth = $globaldbh->prepare($query); $sth->bindValue(":id", (int) $imgid, PDO::PARAM_INT); $sth->execute(); if ( $row = $sth->fetch(PDO::FETCH_ASSOC) ) { $this->setId($row["id"]); $this->setFileName($row["filename"]); $this->setEnabled($row["enabled"]); $this->setWidth($row["width"]); $this->setHeight($row["height"]); $this->created = $row["created"]; } } } // vim:ts=3 sw=3 et: