IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Quel format de données pour insérer un pdf dans un champ BLOB ? [SQL-Server]


Sujet :

PHP & Base de données

  1. #21
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    ou des propriétés de sql server.. je cherche..

  2. #22
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    A quoi ressemble ta classe ConnectionDb surtout la partie "Connexion" ?
    As-tu essayé d'insérer un BLOB via le gestionnaire des requêtes de SQL Server ?
    Le bienfait n'est jamais perdu

  3. #23
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    Bonsoir,
    voici ma classe de connexion à la base de données :
    comme je l'ai indiqué, la connexion fonctionne pour tout le reste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?php
     
        class ConnectionDb{  
     
            private static $server = 'PC17\INS';
            private static $database = 'GestionF';
            //private static $port = '';
          	private static $user = 'user' ;
          	private static $password = 'user' ;
    	private static $myConnectionDb = null;
            private static $myPdo;
     
     
            /**
             * Constructeur privé, crée l'instance de PDO qui sera sollicitée
             * pour toutes les méthodes de la classe
             */				
    	private function __construct(){    
     
                //ConnectionDb::$myPdo = new PDO(ConnectionDb::$server.';'.ConnectionDb::$port.';'.ConnectionDb::$database, ConnectionDb::$user, ConnectionDb::$password);  //connexion avec spécification du port
                ConnectionDb::$myPdo = new PDO('sqlsrv:Server='.ConnectionDb::$server.';Database='.ConnectionDb::$database, ConnectionDb::$user, ConnectionDb::$password);
                        ConnectionDb::$myPdo->query("SET CHARACTER SET utf8");
            }
     
     
            /**
             *  Destructeur de l'instance.
             */
            public function _destruct(){
                        ConnectionDb::$myPdo = null;
            }
     
     
            /**
             * Fonction statique qui crée l'unique instance de la classe 
             * @return l'unique objet de la classe ConnectionDb
             */
    	public static function getConnectionDb(){
     
    		if(ConnectionDb::$myConnectionDb == null){
    			ConnectionDb::$myConnectionDb = new ConnectionDb();
    		}
    		return ConnectionDb::$myConnectionDb;  
    	}
    Voici le code php qui instancie la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
        //inclusions
        require_once ("modele/class.ConnectionDb.php");
        //require_once ("class.CommandsDb.php");
     
        require_once ("includes/fpdf181/fpdf.php");
        require_once ("includes/FPDI-1.6.1/fpdi.php");
     
     
        //instanciation de la connexion
        $connexion = ConnectionDb::getConnectionDb();
    Un exemple d'appel de fonction (les fonctions qui interagissent avec la base de données se trouvent dans la classe ConnectionDb :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $lesActions = $connexion->getLesActions();
            $lesTiers = $connexion->getLesTiers();
    Je n'ai pas encore essayé d'insérer un BLOB via SQL Server mais avec une application en VB.net sur la même base de données et table cela fonctionne.
    Je vais essayer.

  4. #24
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Tu ne gères pas les erreurs dans ta classe,
    Ajoute cette ligne dans ton constructeur ConnectionDb::$myPdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); , là s'il y a une erreur elle s'affichera.
    Tu devrais aussi jeter un coup d’œil aux constantes relatives à sql server http://php.net/manual/fr/ref.pdo-sqlsrv.php surtout PDO::SQLSRV_ENCODING_BINARY qui sera peut être plus utile que PDO::PARAM_LOB
    Le bienfait n'est jamais perdu

  5. #25
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    J'ai effectué d'autres tests avec tes derniers conseils et voici le message d'erreur retourné :

    Avec PDO:ARAM_LOB, PDO::SQLSRV_ENCODING_BINARY, PDO::SQLSRV_ENCODING_SYSTEM et PDO::SQLSRV_ENCODING_DEFAULT :
    ERREUR PDO dans C:\wamp64\www\cgf-signature-valide\modele\class.ConnectionDb.php L.360 : SQLSTATE[IMSSP]: An error occurred translating string for input param 1 to UCS-2: Il n�y a pas de caract�re correspondant au caract�re Unicode dans la page de codes multi-octet cible.

    Ensuite j'ai testé en convertissant au préalable les données avec la fonction utf8_encode et ça passe (dans une colonne nvarchar(max) et non image) mais le résultat dans la base est une chaine et non un pdf..
    De plus, je souhaiterais de préférence ne pas modifier la base de données car elle est utilisée notamment par une application en VB.net qui manipule également la colonne type blob en question.
    Donc la changer de type n'est pas souhaitable..

  6. #26
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par Adriano5787 Voir le message
    ...J'ai effectué d'autres tests...
    C'est bien !

    Mais en MONTRANT le CODE, c'est MIEUX.


    Sinon..... as-tu compris la signification du message d'erreur ?

  7. #27
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Si je comprends bien le message d'erreur, le problème vient du format des caractères avec certains qui ne passent pas?
    Par contre, je ne sais pas si ça vient de ma configuration PDO, PHP ou de la base de données.
    Je serais tenté de dire que ça ne vient pas de la base de données puisqu'elle accepte le même pdf sans problème venant de l'application vb.net .

    Pour les tests il s'agit grosso-modo de la même fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public function testBlob6() {    
     
        $msg = '';
        $file = 'documents/marge.pdf';
        $data = file_get_contents($file);
        $utf8 = utf8_encode($data);
    Try {
        $stmt = ConnectionDb::$myPdo->prepare("INSERT into TESTS (DOCPDF) values (:data)");
        $stmt->bindParam(':data', $utf8, PDO::PARAM_LOB);
        $stmt->execute();    
    }
    catch(PDOException $e){
    	$msg = 'ERREUR PDO dans ' . $e->getFile().' L.' . $e->getLine().' : ' . $e->getMessage();
    }
    	echo $msg;
    }
    ça c'est donc en encodant en utf8 .
    J'ai testé avec et sans cet encodage, et en remplaçant "PDO:ARAM_LOB" par les termes précisés précédemment...
    Avec l'encodage ça donne toujours une chaine, et sans, toujours ce message d'erreur..

  8. #28
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    ...Il n�y a pas de caract�re...
    Ca me parait bizarre ces "�"...

    As-tu vérifié que :
    • TOUT est en UTF-8 (PHP, Bdd,...) ?
    • les fichiers sont encodés en UTF-8 SANS BOM ?
    • ... ?



  9. #29
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    Enfin !!! ça fonctionne !!!!!


    Le projet php était bien en utf8, de même que la configuration php du serveur.

    Or, tu m'as mis la puce à l'oreille, j'ai vérifié aussi pour la bdd et si j'ai bien compris SQL Server (2012 en tout cas) est en UCS-2.

    Du coup en cherchant j'ai consulté cette page : https://docs.microsoft.com/en-us/sql...t-setattribute

    et avec cette ligne dans le constructeur (la seule valeur des trois proposées avec laquelle ça fonctionne):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ConnectionDb::$myPdo->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
    Donc plus d'erreur et il y a bien un pdf inséré en blob et non en chaine!
    Voilà pourquoi je n'avais pas eu le problème avec vb.net, c'était pas de l'utf8 comme ce projet php...

    En tout cas merci beaucoup à tous! Je n'aurais jamais trouvé sans votre aide et j'ai progressé un peu.

  10. #30
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    Code final de la fonction pour info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public function testBlob6() {    
     
        $msg = '';
        $file = 'documents/marge.pdf';
        $data = file_get_contents($file);
    Try {
        $stmt = ConnectionDb::$myPdo->prepare("INSERT into TESTS (DOCPDF) values (:data)");
        $stmt->bindParam(':data', $data, PDO::PARAM_LOB);
        $stmt->execute();    
    }
    catch(PDOException $e){
    	$msg = 'ERREUR PDO dans ' . $e->getFile().' L.' . $e->getLine().' : ' . $e->getMessage();
    }
    	echo $msg;
    }

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 11
    Dernier message: 11/07/2014, 11h47
  2. Réponses: 4
    Dernier message: 12/07/2010, 19h48
  3. quel etl peut faire ca : charger un pdf dans une colonne BLOB
    Par sulfurex dans le forum Alimentation
    Réponses: 0
    Dernier message: 09/04/2010, 10h01
  4. Comment fait-on pour insérer une date dans un champs DateTime
    Par gibea00 dans le forum Accès aux données
    Réponses: 1
    Dernier message: 14/01/2007, 01h04
  5. Probléme pour insérer une variable dans un champs
    Par BOUTRAIS dans le forum Access
    Réponses: 2
    Dernier message: 11/04/2006, 22h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo