ou des propriétés de sql server.. je cherche..
ou des propriétés de sql server.. je cherche..
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
Bonsoir,
voici ma classe de connexion à la base de données :
comme je l'ai indiqué, la connexion fonctionne pour tout le reste.
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
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; }
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
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();
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $lesActions = $connexion->getLesActions(); $lesTiers = $connexion->getLesTiers();
Je vais essayer.
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
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..
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 :
ça c'est donc en encodant en utf8 .
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; }
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..
Bonjour,
Ca me parait bizarre ces "�"......Il n�y a pas de caract�re...
As-tu vérifié que :
- TOUT est en UTF-8 (PHP, Bdd,...) ?
- les fichiers sont encodés en UTF-8 SANS BOM ?
- ... ?
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):
Donc plus d'erreur et il y a bien un pdf inséré en blob et non en chaine!
Code : Sélectionner tout - Visualiser dans une fenêtre à part ConnectionDb::$myPdo->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
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.
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; }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager