Bonjour chers amis développeurs !
Je suis en train de mettre en place un site web en PHP, et je dois me connecter à une base de données HyperFile SQL.
Jusque là tout va bien, j'arrive à interagir sans soucis sur la base de données via PDO & ODBC.
J'ai juste un petit soucis : lorsque je récupère les données des mémos texte, ces données sont tronquées au bout de 255 caractères. Les autres caractères récupérés sont complètement buggés.
Je précise que je travaille actuellement avec WAMP Manager et donc je n'ai qu'un serveur de test, pas un vrai, et je travaille sous la version PHP 7.1.9 (j'ai essayé de changer de passer en version 5.6.31 mais cela n'a rien changé).
Plusieurs forums tentent d'apporter une solution à ce bug, mais aucune n'a fonctionné jusqu'à présent pour mon cas (il faut dire que les solutions proposées concernent MSSQL Server et pas HFSQL ou ODBC, donc difficile de trouver une solution adaptée :s) :
- https://bugs.php.net/bug.php?id=38805 ==> Les solutions proposées parlent de MSSQL Server, mais j'ai essayé de trafiquer le fichier PHP.ini en vain (ex : odbc.defaultlrl = 2147483648)
- https://forum.pcsoft.fr/fr-FR/pcsoft...e-sql/read.awp ==> Le problème est lié à un "DISTINCT" sur des mémos texte, et je n'en utilise pas
- https://stackoverflow.com/questions/...n-php-pdo-free ==> Le problème est lié à FreeTDS que je n'utilise pas, et j'ai essayé de faire un CAST xxx AS TEXT ainsi que d'ajouter un "TextSize" dans le fichier php.ini, mais cela n'a rien changé.
Des exemples en disent plus long que du texte, donc voici le problème en détails :
1) Le code PHP :
Code php : 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 // Configuration de la connexion à la BDD $connexion['DSN'] = '{HFSQL}'; $connexion['IPServeur'] = 'XXX'; $connexion['Port'] = 'XXX'; $connexion['NomBDD'] = 'XXX'; $connexion['LoginServeur'] = 'XXX'; $connexion['MDPServeur'] = 'XXX'; $dsn = sprintf('odbc:DRIVER=%s;Server Name=%s;Server Port=%s;Database=%s;UID=%s;PWD=%s;', $connexion['DSN'], $connexion['IPServeur'], $connexion['Port'], $connexion['NomBDD'], $connexion['LoginServeur'], $connexion['MDPServeur']); try{ // Connexion à la BDD $bdd = new PDO($dsn, '', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); // Initialisation de la requête $sql = 'SELECT CorpsHTML FROM T_ModeleEmail WHERE T_ModeleEmail.IDModeleEmail = :IDModeleEmail'; $requete = $this->getBDD()->prepare($sql); // Affectation des paramètres $tmpIDModeleEmail = 2; $requete->bindValue(':IDModeleEmail', $tmpIDModeleEmail, PDO::PARAM_INT); // Exécution de la requête $requete->execute(); // Récupération du 1er résultat $donnees = $requete->fetch(PDO::FETCH_ASSOC); var_dump($donnees); // On libère la requête $requete->closeCursor(); // On vérifie qu'on a bien trouvé un modèle email if(!empty($donnees)){ // Renvoi de l'objet trouvé après hydratation return new ModeleEmail($donnees); }else{ return null; } }catch(PDOException $e){ // Gestion des exceptions : arrête le script s'il y a une erreur die('Impossible de se connecter aux données du site. [Code de l\'erreur : '. $e->getCode() . '] Détails : ' . utf8_encode($e -> getMessage())); }
2) L'enregistrement récupéré en base de données, qui est un mémo texte (8 octets), et qui est tronqué à 255 caractères lors de la récupération :
3) Le résultat affiché :
Pour information, notez que j'ai également trouvé une alternative "bizarre" pour afficher le reste du contenu, mais évidemment ce n'est pas une solution. Je le poste aussi ci-dessous à titre informatif car je ne comprends pas pourquoi ça parvient à afficher la suite ni de quelle manière
Le code PHP (ajout d'un "bindColumn") :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 // Affectation des paramètres $tmpIDModeleEmail = 2; $requete->bindValue(':IDModeleEmail', $tmpIDModeleEmail, PDO::PARAM_INT); $requete->bindColumn('CorpsHTML', $tmp); // Exécution de la requête $requete->execute(); // Récupération du 1er résultat $donnees = $requete->fetch(PDO::FETCH_ASSOC); var_dump($donnees); echo 'TMP = '. $tmp;
Et là comme par magie ça m'affiche la suite du texte, certes de manière un peu tordue mais bon :
PS : Je précise que l' "EXCEPTION" que l'on voit à la fin n'a aucun rapport, c'est moi qui l'ai déclenchée manuellement pour éviter de charger toute la page derrière, et ainsi garder uniquement le texte tronqué.
Merci beaucoup d'avance pour votre aide
Bonne journée,
Mickaël
Partager