Envoyer le nom d'un fichier en base de données par upload

Eléphanteau du PHP | 13 Messages

17 sept. 2021, 11:41

Bonjour, rien ne s'enregistre dans la table.

Voici mon code :

includes/inc-connexion.php

try {

	$db = new PDO('mysql:host=localhost; charset=utf8; dbname=projet_images', 'root', '');
	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {

	echo 'Echec de la connexion ' . $e->getMessage();
}
includes/inc-config.php

define('WEB_TITLE', 'Projet images');

define('WEB_DIR_NAME', 'projet-images');

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('WEB_DIR_URL', 'http://' . $_SERVER['HTTP_HOST'] . '/' . WEB_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 . '/');
class/Image.php
class Image
{
	protected $id;
	protected $title;
	protected $descr;
	protected $filename;

	protected 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 insertImageData(Image $image)
    {
        try {

            $sql = 'INSERT INTO images(title, descr, filename, dt_creation)
                    VALUES(:title, :descr, :filename, NOW())';

            $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 'Une erreur est survenue lors de la récupération des données dans la base. Message d\'erreur : ' . $e->getMessage();
        }
    }

    public function updateImageData(Image $image)
    {
        try {

            $sql = 'UPDATE images 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 'Une erreur est survenue lors de la récupération des données dans la base. Message d\'erreur : ' . $e->getMessage();
        }
    }

    public function getImagesData()
    {
        try {

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

            $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['id']]['id'] = $row['id'];
                    $image_data[$row['id']]['title'] = $row['title'];
                    $image_data[$row['id']]['descr'] = $row['descr'];
                    $image_data[$row['id']]['filename'] = $row['filename'];
                    $image_data[$row['id']]['exist'] = 'OK';
                }

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

            echo 'Une erreur est survenue lors de la récupération des données dans la base. Message d\'erreur : ' . $e->getMessage();
        }
    }

    public function getImageData($filename)
    {
        try {

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

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

            $stmnt->execute(array(

                ":filename" => $filename
            ));

            $count = $stmnt->rowCount();

            if ($count > 0) {

                return true;
            } else {

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

            echo 'Une erreur est survenue lors de la récupération des données dans la base. Message d\'erreur : ' . $e->getMessage();
        }
    }

    public function upload($files)
    {
        $upload_dir = IMAGE_DIR_PATH;

        foreach ($files['upload']['error'] as $key => $error) {

            $type = $files['upload']['type'][$key];
            $size = $files['upload']['size'][$key];

            if ($type == 'image/jpeg') {

                if ($size <= 40913) {

                    $error = 0;

                    if ($error == UPLOAD_ERR_OK) {

                        $tmp_name = $files['upload']['tmp_name'][$key];
                        $name = $files['upload']['name'][$key];

                        $name = $this->cleanText($name);

                        if (move_uploaded_file($tmp_name, $upload_dir . $name) === false) {

                            $error++;
                        } else {

                            $this->createThumbnail($name);
                        }
                    } else {

                        $error++;
                    }
                } else {

                    $error++;

                    echo 'Les images doivent être inférieur ou égal à 40913 octets';
                }
            } else {

                $error++;

                echo 'Les images doivent êtres au format jpg';
            }
        }

        if ($error == 0) {

            return true;
        } else {

            return false;
        }
    }

    public function createThumbnail($filename)
    {

        $image = IMAGE_DIR_PATH . $filename;
        $vignette = THUMB_DIR_PATH . $filename;

        $size = getimagesize($image);
        $largeur = $size[0];
        $hauteur = $size[1];

        $largeur_max = 200;
        $hauteur_max = 200;

        $image_src = imagecreatefromjpeg($image);

        if ($largeur > $largeur_max or $hauteur > $hauteur_max) {

            if ($hauteur <= $largeur) {

                $ratio = $largeur_max / $largeur;
            } else {

                $ratio = $hauteur_max / $hauteur;
            }
        } else {

            $ratio = 1;
        }

        $image_destination = imagecreatetruecolor(round($largeur * $ratio), round($hauteur * $ratio));

        imagecopyresampled(
            $image_destination,
            $image_src,
            0,
            0,
            0,
            0,
            round($largeur * $ratio),
            round($hauteur * $ratio),
            $largeur,
            $hauteur
        );

        if (!imagejpeg($image_destination, $vignette)) {

            echo 'la création de la vignette a echouée pour l\'image ' . $image;

            return false;

            exit;
        } else {

            return true;
        }
    }

    public function cleanText($filename)
    {

        $special = array(
            ' ', '\'', 'á', 'à', 'â', 'ä', 'ã', 'å', 'ç', 'é', 'è', 'ê', 'ë', 'í', 'ì', 'î', 'ï',
            'ñ', 'ó', 'ò', 'ô', 'ö', 'õ', 'ú', 'ù', 'û', 'ü', 'ý', 'ÿ', 'Á', 'À', 'Â', 'Ä', 'Ã',
            'Å', 'Ç', 'É', 'È', 'Ê', 'Ë', 'Í', 'Ï', 'Î', 'Ì', 'Ñ', 'Ó', 'Ò', 'Ô', 'Ö', 'Õ', 'Ú',
            'Ù', 'Û', 'Ü', 'Ý'
        );

        $normal = array(
            '-', '', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e',
            'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'u',
            'u', 'u', 'u', 'y', 'y', 'A', 'A', 'A', 'A', 'A', 'A', 'C',
            'E', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'N', 'O', 'O',
            'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y'
        );

        $result = str_replace($special, $normal, $filename);

        $results = strtolower($result);

        return $results;
    }
}
admin/upload.php
<?php

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

?>

<h1>Upload</h1>

<?php if (isset($message)) : ?>
    <p class="success"><?php echo $message ?></p>
<?php endif ?>

<form id="upload" action="" method="post" enctype="multipart/form-data">
    <p>Ajoutez des images</p>
    <input type="file" value="" name="upload[]" multiple="multiple">
    <p>Titre : <input type="text" name="title_form"></p>
    <p>Description :<br>
        <textarea name="descr_form" cols="50" rows="5"></textarea>
    </p>
    <input type="submit" id="submit" name="submit_form">
</form>
process/process-image-upload.php

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

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

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

    $title_form = trim($_POST['title_form']);
    $descr_form = trim($_POST['descr_form']);
    $upload = $_FILES['upload']['name'];

    if ((empty($title_form)) or empty($descr_form) or empty($upload)) {

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

        $image = new imageManager($db);
        $images = $image->upload($_FILES);

        if ($images === false) {

            $message = '<p class="error">Le chargement a échoué</p>';
        } else {

            $message = '<p class="success">Le chargement a réussi</p>';

            $images_data = array(

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

            $image_data = new Image($images_data);
            $image = new imageManager($db);

            if (!$image->getImageData($upload)) {

                $image->insertImageData($image_data);

                $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\'enregistrement des données dans la base.<br>
                                             Aucune information n\'a été enregistrée.</p>';
            }
        }
    }
}
Merci d'avance pour votre aide.

Mammouth du PHP | 2703 Messages

17 sept. 2021, 11:57

<form id="upload" action="" method="post" enctype="multipart/form-data">

les données du formulaire ne sont donc pas envoyées à process/process-image-upload.php

Eléphanteau du PHP | 13 Messages

17 sept. 2021, 13:42

<form id="upload" action="../process/process-image-upload.php" method="post" enctype="multipart/form-data">

ça donne toujours rien.

Eléphanteau du PHP | 13 Messages

17 sept. 2021, 13:44

<form id="upload" action="" method="post" enctype="multipart/form-data">

message d'erreur => Fatal error: Uncaught Exception: FILENAME doit être une chaîne de caractères.L'objet ne peut pas être créé. in C:\xampp\htdocs\projet-images\class\Image.php:48 Stack trace: #0 C:\xampp\htdocs\projet-images\process\process-image-upload.php(44): Image->__construct(Array) #1 C:\xampp\htdocs\projet-images\admin\upload.php(7): require('C:\\xampp\\htdocs...') #2 {main} thrown in C:\xampp\htdocs\projet-images\class\Image.php on line 48

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

17 sept. 2021, 14:16

FILENAME doit être une chaîne de caractères.
Il faut que tu avances dans ton debugage.
Regarde quelle partie de ton code génère ce message d'erreur, fais alors des var_dump() pour vérifier le contenu des variables et des conditions dans ton code afin de comprendre le problème.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 13 Messages

13 mars 2022, 17:11

Bonjour, je reviens vers vous car j'ai repris le projet y a 2 jours.

J'ai réussi quelque chose, les fichiers concernant les images vont bien dans le dossier images et images/thumbnails,

ainsi que dans la base. Mais petit bémol, les noms de fichiers images sont bien renommés mais sont insérés dans la base avec les accents, apostrophes et espaces. Besoin d'aide, bon Dimanche.
if(!isset($_POST['submit_form'])) {

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

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

    $title_form = htmlspecialchars(trim($_POST['title_form']));
    $descr_form = htmlspecialchars(trim($_POST['descr_form']));
    $file_form = htmlspecialchars(trim($_FILES['upload_form']['name'][0]));
    
    if((empty($title_form)) OR (empty($descr_form)) OR (empty($file_form))) {
        
        $message = '<p class="msg_error">Une des informations est manquante.
                    <a href="' . WEB_DIR_URL . 'admin/create-image.php">retour</a></p>';
    }
    else {
        
        $images_data = array(
            
            'imgID'    => 1,
            'title'    => $title_form,
            'descr'    => $descr_form,
            'filename' => $file_form
        );
    
        $image_data = new Image($images_data);

        $manager = new imageManager($db);

        if(!$manager->readImageData($file_form)) {

            $images = $manager->upload($_FILES);

            if($images !== true) {

                $message = '<p class="msg_error">Seules les fichiers jpg qui ont une taille inférieurs
                                                 ou égal à 70 000 000 Octets sont autorisés.</p>';
            }
            else {
            
                if($manager->createImageData($image_data)) {
                
                    $message = '<p class="msg_success">Les informations ont bien été enregistrées
                                                       dans la base de données.</p>';

                    echo '<p><a href="admin/update-image.php">Mise à jour des données</a></p>';
                }
                else {

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

Eléphanteau du PHP | 44 Messages

23 mars 2022, 12:43

Bonjour,
attention aux fonctions que tu as utilisés, https://www.php.net/manual/fr/function.htmlspecialchars, et https://www.php.net/manual/fr/function.trim ne vont transformer que les &, ", ', <, > et supprimer les espaces a la fin et au debut d'une chaine.
L'illogisme n'est que la logique des autres!