MISE A JOUR DES DONNEES DANS UNE TABLE EN FONCTION D'UNE IMAGE

Eléphanteau du PHP | 24 Messages

13 mars 2021, 17:52

Bonjour, la mise à jour que je veux effectuer ne se fait pas.

J'ai 4 messages d'erreurs :

Notice: Undefined index: id in C:\wamp64\www\php-mysql-avance-projet-images\process\process-image.php

Notice: Undefined index: title in C:\wamp64\www\php-mysql-avance-projet-images\process\process-image.php

Notice: Undefined index: descr in C:\wamp64\www\php-mysql-avance-projet-images\process\process-image.php

Notice: Undefined index: filename in C:\wamp64\www\php-mysql-avance-projet-images\class\Image.php

Fatal error: Uncaught Exception: FILENAME doit être une chaîne de caractères.L'objet ne peut pas être créé. in C:\wamp64\www\php-mysql-avance-projet-images\class\Image.php

Besoin d'aide, merci d'avance.

Merci d'avance.

class/Image.php

class Image {

    private $_id;
	private $_title;
	private $_descr;
    private $_filename;

    private static $_error;

    const MSG_ERROR_ID = 'ID doit être un entier.';
    const MSG_ERROR_TITLE = 'TITRE doit être une chaîne de caractères.';
    const MSG_ERROR_DESCR = 'DESCR doit être une chaîne de caractères.';
    const MSG_ERROR_FILENAME = 'FILENAME doit être une chaîne de caractères.';
    const MSG_ERROR_END = 'L\'objet ne peut pas être créé.';
			
	public function __construct(array $data) {

        $this->setId($data['id']);
        $this->setTitle($data['title']);
        $this->setDescr($data['descr']);
        $this->setFilename($data['filename']);

        if(!empty(self::$_error)) {

            throw new Exception(self::$_error . self::MSG_ERROR_END);
        }
    }

    public function setError($msg) {

        self::$_error = $msg;
    }
 
    public function getError() {
 
        return self::$_error;
    }
 
    public function setId($id) {

        if((is_int($id)) AND ($id > 0)) {

            $this->_id = $id;
        }
        else {
  
            $this->setError(self::MSG_ERROR_ID);
        }
    }

    public function setTitle($title) {
	 
	    if(is_string($title)) {

            $this->_title = $title;
        }
        else {

            $this->setError(self::MSG_ERROR_TITLE);
        }
    }

    public function setDescr($descr) {
     
        if(is_string($descr)) {

            $this->_descr = $descr;
        }
        else {

            $this->setError(self::MSG_ERROR_DESCR);
        }
    }

    public function setFilename($filename) {
     
        if(is_string($filename)) {

            $this->_filename = $filename;
        }
        else {

            $this->setError(self::MSG_ERROR_FILENAME);
        }
    }

    public function getId() {

        return $this->_id;
    }

    public function getTitle() {

        return $this->_title;
    }

    public function getDescr() {

        return $this->_descr;
    }

    public function getFilename() {

        return $this->_filename;
    }
}

class/imageManager.php

class imageManager {

    private $_db;
 
    public function __construct($db) {

        $this->setDb($db);
    }
 
    public function setDb(PDO $dbh) {

        $this->_db = $dbh;
    }

    public function getImages($image_dir) {

        $i = 0; 

    	if($handle = opendir($image_dir)) {

    		while(false !== ($entry = readdir($handle))) {

    			if($entry != "." && $entry != "..") {

                    $i++;

                    $images[$i]['filename'] = $entry;
                    
                    $image_data = $this->getImage($entry);

                    $images[$i]['title'] = $image_data['title'];
                    $images[$i]['descr'] = $image_data['descr'];
                }
            }
        }
        
        closedir($handle); 
        
        return $images; 
    }

    public function getImage($filename) {

        try {

            $sql = 'SELECT id, title, descr, filename FROM image WHERE filename = :filename';

            $stmnt = $this->_db->prepare($sql); 

            $stmnt->execute(array(

                ':filename' => $filename
            ));

            $count = $stmnt->rowCount();

            if($count > 0) {

                return $stmnt->fetch();
            }
            else {

                return false;
            }
        }
        catch(PDOException $e) {

            echo 'Erreur au niveau de la requête ' . $e->getMessage();
        }
    }

    public function addImage(Image $image) {

        try {

            $sql = 'INSERT INTO image (title, descr, filename) VALUES(:title, :descr, :filename)';

            $title = strip_tags($image->getTitle());
            $descr = strip_tags($image->getDescr());
            $filename = strip_tags($image->getFilename());

            $stmnt = $this->_db->prepare($sql);

            $stmnt->bindParam(':title', $title);
            $stmnt->bindParam(':descr', $descr);
            $stmnt->bindParam(':filename', $filename);

            $stmnt->execute();
        }
        catch(PDOException $e) {

            echo 'Erreur au niveau de la requête ' . $e->getMessage();
        }
    }

    public function updateImage(Image $image) {

        try {

            $sql = 'UPDATE image SET title = :title, descr = :descr WHERE filename = :filename';

            $title = strip_tags($image->getTitle());
            $descr = strip_tags($image->getDescr());
            $filename = strip_tags($image->getFilename());

            $stmnt = $this->_db->prepare($sql);

            $stmnt->bindParam(':title', $title);
            $stmnt->bindParam(':descr', $descr);
            $stmnt->bindParam(':filename', $filename);

            $stmnt->execute();
        }
        catch(PDOException $e) {

            echo 'Erreur au niveau de la requête ' . $e->getMessage();
        }
    }
}
process/process-image.php

if(!isset($_POST['submit_form'])) {

	$message = '<p class="error">Aucune donnée n\'est fournie. <a href="admin.php">retour</a></p>';
}

if(isset($_POST['submit_form'])) {

	$title_form = trim($_POST['title_form']);
	$descr_form = trim($_POST['descr_form']);
	$filename_form = trim($_POST['filename_form']);

	if((empty($title_form)) OR empty($descr_form) OR empty($filename_form)) {

		$message = '<p class="error">Une des informations est manquante. <a href="admin.php">retour</a></p>';
    }
    else {

        $image_data = array(

            'id' => 1,
            'title' => $title_form,
            'descr' => $descr_form,
            'filename' => $filename_form
        );

        $image = new Image($image_data);

    	$manager = new imageManager($db);

        $current_image = $manager->getImages(IMAGE_DIR_PATH);

        $new_content = array('id' => (int) $current_image['id'], 'title' => $current_image['title'],
                             'descr' => $current_image['descr'], 'filename' => $current_image['filename']);

        $image_to_update = new Image($new_content);

        $image_to_update->setTitle($title_form);
        $image_to_update->setDescr($descr_form);
        $image_to_update->setFilename($filename_form);

        if(isset($_POST['update'])) {

            $addImage = $manager->updateImage($image_to_update);
        }
        else {

            $addImage = $manager->addImage($image);

            if(true === $addImage) {

                $message = '<p class="success">Les informations ont bien été enregistrées dans la base de données.</p>';
            }
            else {

                $message = '<p class="error">Une erreur est survenue lors de l\'insertion
                              ou de la mise à jour des données dans la base.<br>
                              
                              Aucune information n\'a été enregistrée ou modifiée.</p>';
            }
        }
    }
}

config.php

define('WEB_TITLE', 'Projet Images');
define('WEB_DIR_NAME', 'php-mysql-avance-projet-images'); 
define('WEB_DIR_URL', 'http://' . $_SERVER['HTTP_HOST'] . '/' . WEB_DIR_NAME . '/');

define('IMAGE_DIR_NAME', 'images');
define('IMAGE_THUMB_NAME', 'thumbnails');

define('IMAGE_DIR_PATH', $_SERVER['DOCUMENT_ROOT'] . '/' . WEB_DIR_NAME . '/' . IMAGE_DIR_NAME . '/');

define('IMAGE_DIR_URL', 'http://' . $_SERVER['HTTP_HOST'] . '/' . WEB_DIR_NAME . '/' . IMAGE_DIR_NAME . '/');

define ('THUMB_DIR_PATH', $_SERVER['DOCUMENT_ROOT'] . '/' . WEB_DIR_NAME . '/' . IMAGE_DIR_NAME . '/' .IMAGE_THUMB_NAME . '/');
define ('THUMB_DIR_URL', 'http://' . $_SERVER['HTTP_HOST'] . '/' . WEB_DIR_NAME . '/' . IMAGE_DIR_NAME . '/ ' .IMAGE_THUMB_NAME . '/');

admin.php

require('includes/inc-connexion.php');
require('config.php');
require('class/Image.php');
require('class/imageManager.php');
require('process/process-image.php');

$manager = new imageManager($db);
$images = $manager->getImages(IMAGE_DIR_PATH);

?>

<h1><?php echo WEB_TITLE; ?></h1>
<ul>
	<?php foreach($images as $image) : ?>
		<li>
			<img src="<?php echo IMAGE_DIR_URL . $image['filename']; ?>" width="400" height="400">

			<form method="post" action="">
				<p>Titre : <input type="text" name="title_form" value="<?php echo $image['title']; ?>"></p>
				
				<input type="hidden" name="filename_form" value="<?php echo $image['filename']; ?>">

				<?php if(!empty($image['title'])) : ?>

				<input type="hidden" name="update" value="1">

				<?php endif; ?>
				
				<p>Description<br>
					<textarea name="descr_form" cols="50" rows="5"><?php echo $image['descr']; ?></textarea>
				</p>

				<p><input type="submit" name="submit_form" value="valider"></p>
			</form>
		</li>
	<?php endforeach; ?>
</ul>

<?php if(isset($message)) echo $message; ?>


Mammouth du PHP | 2703 Messages

13 mars 2021, 18:09

$current_image = $manager->getImages(IMAGE_DIR_PATH);

$new_content = array('id' => (int) $current_image['id'], 'title' => $current_image['title'],
'descr' => $current_image['descr'], 'filename' => $current_image['filename']);

getImages retourne un tableau, pas une seule image.
$current_image['id'] ne permet donc pas d'accéder au champ id.

Eléphanteau du PHP | 24 Messages

13 mars 2021, 18:34

J'ai fait ceci -> $current_image = $manager->getImage($filename_form);

ça fonctionne, mais les messages d'erreurs ou de succès ne s'affichent pas sur la page.

Eléphanteau du PHP | 24 Messages

19 mars 2021, 16:22

Bonjour, je voudrais maintenant vérifier si les images existes ou pas avec la fonction file_exists() et les afficher en conséquence.

J'ai remplacé la fonction qui est plus haut par celle ci.

Aucune image du répertoire s'affiche.

Merci d'avance pour votre aide.

class/imageManager.php
public function getImages() {

        try {

            $sql = 'SELECT id, title, descr, filename FROM image';

            $stmnt = $this->_db->prepare($sql);

            $stmnt->execute();

            while($row = $stmnt->fetch(PDO::FETCH_ASSOC)) {

                $path = IMAGE_DIR_PATH . $row['filename'];
                
                if(file_exists($path)) {

                    $image_data[] = $row;
                }
            }

            return $image_data;
        }
        catch(PDOException $e) {

            echo 'Erreur au niveau de la requête ' . $e->getMessage();
        }
    }
admin/admin.php
require('../includes/inc-connexion.php');
require('../includes/config.php');
require('../class/Image.php');
require('../class/imageManager.php');
require('../process/process-image-insert.php');

require('header.php');

$manager = new imageManager($db);
$images = $manager->getImages();

?>

<h1><?php echo WEB_TITLE; ?></h1>

<?php if(isset($message)) echo $message; ?>

<ul>
	<?php if(!empty($images)) : ?>
		<?php foreach($images as $image) : ?>
			<li><img src="<?php echo IMAGE_DIR_URL . $image['filename']; ?>" width="400" height="400">
				<form method="post" action="">
					<p>Titre : <input type="text" id="title" name="title_form" value="<?php echo $image['title']; ?>"></p>

					<input type="hidden" name="filename_form" value="<?php echo $image['filename']; ?>">

					<p>Description :<br>
						<textarea id="descr" name="descr_form" cols="50" rows="25"><?php echo $image['descr']; ?></textarea>
					</p>
                    
                    <p><input type="submit" id="submit" name="submit_form" value="validez"></p>
                </form>
            </li>
		<?php endforeach; ?>
	<?php endif; ?>
</ul>

<?php require('menu.php'); ?>

<?php require('footer.php'); ?>