代码之家  ›  专栏  ›  技术社区  ›  Mickael

数据截断为256个字符-PHP和HFSQL数据库,使用PDO ODBC试验

  •  3
  • Mickael  · 技术社区  · 8 年前

    我正在用PHP和HyperFileSQL创建一个基于PDO&的网站;连接的ODBC。
    我正在使用PHP的7.1.9版本,并在WampServer下工作。
    但是 检索超过255个字符的文本数据时出现问题 :the 数据被截断 最后会出现一些随机字符。

    我找到了一些关于这个问题的帖子,如下所示:

    下面是我的代码:
    1) PHP:

    // Configuration de la connexion à la BDD --- Configuration of the connection to the database
    $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 --- Connection to the database
        $bdd = new PDO($dsn, '', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    
        // Initialisation de la requête --- SQL initialisation
        $sql        = 'SELECT CorpsHTML FROM T_ModeleEmail WHERE T_ModeleEmail.IDModeleEmail = :IDModeleEmail';
        $requete    = $this->getBDD()->prepare($sql);
    
        // Affectation des paramètres --- Bindings
        $tmpIDModeleEmail = 2;
        $requete->bindValue(':IDModeleEmail', $tmpIDModeleEmail, PDO::PARAM_INT);
    
        // Exécution de la requête --- SQL execution
        $requete->execute();
    
        // Récupération du 1er résultat --- Results parsing
        $donnees = $requete->fetch(PDO::FETCH_ASSOC);
    
        var_dump($donnees);
    
        // On libère la requête --- Unallocate the request
        $requete->closeCursor();
    
        // On vérifie qu'on a bien trouvé un modèle email --- email model found
        if(!empty($donnees)){
            // Renvoi de l'objet trouvé après hydratation --- Returns the object found
            return new ModeleEmail($donnees);
        }else{
            return null;
        }
    }catch(PDOException $e){
        // Gestion des exceptions : arrête le script s'il y a une erreur --- Issue with PDO
        die('Impossible de se connecter aux données du site. [Code de l\'erreur : '. $e->getCode() . '] Détails : ' . utf8_encode($e -> getMessage()));
    }
    

    2) 以下是我试图显示的记录(8字节),显示时截断为256个字符:

    <html><head><title>Activation de votre compte</title></head><body>Ceci est un texte supérieur à 255 caractères, et qui n'est par conséquent par récupéré entièrement, bien que ce soit stocké dans un mémo texte ! Cela semble provenir d'un ancien bug de PDO, mais tous les forums ne parlent que de MSSQL Server, et aucun ne parle d'une solution pour PDO ODBC.</body></html>
    

    3) 结果显示:

    array(1) {      
        ["CorpsHTML"]=> string(370) 
        "<html><head><title>Activation de votre compte</title></head><body>Ceci est un texte sup�rieur � 255 caract�res, et qui n'est par cons�quent par r�cup�r� enti�rement, bien que ce soit stock� dans un m�mo texte ! Cela semble provenir d'un ancien bug de PDO,Zk���-o�����������xj������X7o��(0o������@o���"
    }
    

    作为参考,我在调试期间发现了一些东西:当我添加“bindColumn”时,似乎可以找到全文…:
    PHP(“bindColumn”备选):

    // 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;
    

    结果是。。。魔法…:

    array(1) {
    ["CorpsHTML"]=>
    string(115) " mais tous les forums ne parlent que de MSSQL Server, et aucun ne parle d'une solution pour PDO ODBC.</body></html>"
    }
    
    TMP = <html><head><title>Activation de votre compte</title></head><body>Ceci est un texte sup�rieur � 255 caract�res, et qui n'est par cons�quent par r�cup�r� enti�rement, bien que ce soit stock� dans un m�mo texte ! Cela semble provenir d'un ancien bug de PDO,Zk���,o�����������xj������X7o��(0o������@o���
    

    我错过什么了吗?我是否应该考虑PDO以外的其他选项?还是应该将数据库迁移到MSSQL Server?

    非常感谢您的帮助!
    如果有什么不清楚的地方,我会编辑我的信息来澄清它。
    祝你今天愉快,
    米卡«l

    编辑-解决方案 哦,好吧, 我找到了另一个解决方案 肮脏的但工作:
    --&燃气轮机;将数据类型从“TEXT”转换为“VARCHAR(10000)”
    --&燃气轮机;使用ODBC而不是PDO&ODBC
    --&燃气轮机;将DAO配置为使用ODBC或PDO&ODBC,这取决于您的表是否有文本字段(您必须在其中将它们转换为VARCHAR(XXXX))或没有。
    我希望这将有助于同样情况的人。
    尽管如此,我仍在考虑一个更干净的解决方案:)

    1 回复  |  直到 8 年前
        1
  •  2
  •   Mickael    8 年前

    我找到了另一个解决方案,肮脏。。。但工作:
    --&燃气轮机;将数据类型从“TEXT”转换为“VARCHAR(10000)”
    --&燃气轮机;使用ODBC而不是PDO&ODBC
    --&燃气轮机;将DAO配置为使用ODBC或PDO&ODBC,这取决于您的表是否有文本字段(您必须在其中将它们转换为VARCHAR(XXXX))或没有。

    我希望这将有助于同样情况的人。

    推荐文章