Like already stated you need to tell us exactly what the problem is; however, in my opinion you’re making you classes to specific in my opinion. While the following is base on the Active Record Design pattern this probably can be rework into MVC or give a good idea on to go about doing it.
You should pull the users data into an array (doing it the HTML Form is the easiest way) then set that to a class. Here’s an example of what I’m talking about
class CMS extends DatabaseObject
{
protected static string $table = "cms"; // Table Name:
static protected array $db_columns = ['id', 'user_id', 'thumb_path', 'image_path', 'Model', 'ExposureTime', 'Aperture', 'ISO', 'FocalLength', 'author', 'heading', 'content', 'data_updated', 'date_added'];
public $id;
public $user_id;
public $page;
public $thumb_path;
public $image_path;
public $Model;
public $ExposureTime;
public $Aperture;
public $ISO;
public $FocalLength;
public $author;
public $heading;
public $content;
public $date_updated;
public $date_added;
/*
* Create a short description of content and place a link button that I call 'more' at the end of the
* shorten content.
*/
#[Pure] public static function intro($content = "", $count = 100): string
{
return substr($content, 0, $count) . "...";
}
public function setImagePath($image_path) {
$this->image_path = $image_path;
}
public static function styleTime($prettyDate): string
{
try {
$dateStylized = new DateTime($prettyDate, new DateTimeZone("America/Detroit"));
} catch (Exception $e) {
}
return $dateStylized->format("Y-m-d H:i:s");
}
public static function countAllPage($page)
{
static::$searchItem = 'page';
static::$searchValue = $page;
$sql = "SELECT count(id) FROM " . static::$table . " WHERE page=:page";
$stmt = Database::pdo()->prepare($sql);
$stmt->execute([ static::$searchItem => static::$searchValue ]);
return $stmt->fetchColumn();
}
protected static function filterwords($text){
$filterWords = array('Edited for Obvious Reasons');
$filterCount = sizeof($filterWords);
for ($i = 0; $i < $filterCount; $i++) {
$text = preg_replace_callback('/\b' . $filterWords[$i] . '\b/i', function($matches){return str_repeat('*', strlen($matches[0]));}, $text);
}
return $text;
}
/*
* Put the date from 00-00-0000 00:00:00 that is stored in the MySQL
* database table to a more presentable format such as January 1, 2021.
*/
public static function styleDate($prettyDate): string
{
try {
$dateStylized = new DateTime($prettyDate, new DateTimeZone("America/Detroit"));
} catch (Exception $e) {
}
return $dateStylized->format("F j, Y");
}
/*
* Construct the data for the CMS
*/
public function __construct($args = [])
{
// $this->user_id = $args['user_id'] ?? null;
// $this->author = $args['author'] ?? null;
// $this->heading = $args['heading'] ?? null;
// $this->content = $args['content'] ?? null;
// $this->date_updated = $args['date_updated'] ?? null;
// $this->date_added = $args['date_added'] ?? null;
// Caution: allows private/protected properties to be set
foreach ($args as $k => $v) {
if (property_exists($this, $k)) {
$v = static::filterwords($v);
$this->$k = $v;
static::$params[$k] = $v;
static::$objects[] = $v;
}
}
} // End of construct method:
} // End of class:
Here’s the HTML form that I used:
<form id="formData" class="form_classes" action="edit.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="cms[id]" value="<?= $id ?>">
<input type="hidden" name="cms[user_id]" value="<?= $_SESSION['id'] ?>">
<input type="hidden" name="cms[author]" value="<?= Login::full_name() ?>">
<input type="hidden" name="cms[date_updated]" value="<?= $date_updated ?>">
<input type="hidden" name="action" value="upload">
<input type="hidden" name="cms[image_path_name]" value="<?= $cms->image_path ?>">
<img src="<?= "../" . $_SESSION['old_image'] ?>" alt="current image">
<br>
<div class="file-style">
<input id="file" class="file-input-style" type="file" name="image" value="<?= $cms->image_path ?>">
<label for="file">Select file</label>
</div>
<div class="heading-style">
<label class="heading_label_style" for="heading">Heading</label>
<input class="enter_input_style" id="heading" type="text" name="cms[heading]" value="<?= $cms->heading ?>"
tabindex="1" required autofocus>
</div>
<div class="content-style">
<label class="text_label_style" for="content">Content</label>
<textarea class="text_input_style" id="content" name="cms[content]"
tabindex="2"><?= $cms->content ?></textarea>
</div>
<div class="submit-button">
<button class="form-button" type="submit" name="submit" value="enter">submit</button>
<button class="form-button" formaction="delete.php?id=<?= $id ?>"
onclick="return confirm('Are you sure you want to delete this item?');">Delete
</button>
</div>
</form>
That way you simple can do the following in a class (I’ll use the update method as it’s a little shorter):
Example:
/*
* This is the update that method that I came up with and
* it does use named place holders. I have always found
* updating is easier than creating/adding a record for
* some strange reason?
*/
public function update(): bool
{
/* Initialize an array */
$attribute_pairs = [];
/* Create the prepared statement string */
foreach (static::$params as $key => $value)
{
if($key === 'id') { continue; } // Don't include the id:
$attribute_pairs[] = "{$key}=:{$key}"; // Assign it to an array:
}
/*
* The sql implodes the prepared statement array in the proper format
* and updates the correct record by id.
*/
$sql = 'UPDATE ' . static::$table . ' SET ';
$sql .= implode(", ", $attribute_pairs) . ' WHERE id =:id';
/* Normally in two lines, but you can daisy chain pdo method calls */
Database::pdo()->prepare($sql)->execute(static::$params);
return true;
}
Like I said it’s not coded of MVC, but the Active Record Design pattern, but it should be easy to modify it to MVC or at least get a good idea. The whole GitHub repository can be found here → https://github.com/Strider64/phototechguru