在第 256 个字符处截断数据 - PHP 与 HFSQL 数据库,使用 PDO ODBC 试点

Posted

技术标签:

【中文标题】在第 256 个字符处截断数据 - PHP 与 HFSQL 数据库,使用 PDO ODBC 试点【英文标题】:Data truncated at the 256th character - PHP with HFSQL database, using PDO ODBC pilot 【发布时间】:2018-10-04 17:02:12 【问题描述】:

我正在使用 php 和 HyperFileSQL 创建一个网站,基于 PDO 和 ODBC 进行连接。 我正在使用 7.1.9 版本的 PHP 并在 WampServer 下工作。 但是我在检索超过 255 个字符的文本数据时遇到了问题数据被截断,一些随机字符出现在末尾。

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

https://bugs.php.net/bug.php?id=38805 ==> 这个问题是关于 MSSQL Server 的;我尝试了不同的建议,但没有任何效果(PHP.ini with odbc.defaultlrl = 2147483648, mssql.textsize, ...)因为我没有使用 MSSQL Server。 https://forum.pcsoft.fr/fr-FR/pcsoft.fr.webdev/3590-memo-texte-tronque-dans-requete-sql/read.awp ==> 是法语,但问题是在文本上使用“DISTINCT”,但我不使用 DISTINCT 或 GROUP BY 函数,所以我不关心这个。 ODBC query on MS SQL Server returning first 255 characters only in PHP PDO (FreeTDS) ==> 这个问题是关于 FreeTDS 的;我尝试投射我的文本 (CAST xxx AS TEXT),但我仍然遇到同样的问题。

所以,这是我的代码: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”替代): /p>

// 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 吗?

非常感谢您的帮助! 如果有不清楚的地方,我会编辑我的信息以澄清它。 祝你有美好的一天, 米凯尔

编辑 - 解决方案 哦,好吧,我找到了一个替代解决方案,很脏……但是可以工作: --> 将数据类型从“TEXT”转换为“VARCHAR(10000)” --> 使用 ODBC 代替 PDO 和 ODBC --> 将您的 DAO 配置为使用 ODBC 或 PDO & ODBC,具体取决于您的表是否有 TEXT 字段(您必须将它们转换为 VARCHAR(XXXX) 或不。 我希望这能帮助那些处于相同情况的人。 尽管如此,我仍然在考虑更清洁的解决方案:)

【问题讨论】:

php.ini 中的 TEXTSIZE 是什么? @SaadSuri 我有以下几行: [ODBC] TextSize = 2097152 [Pdo] TextSize = 2097152 我听说使用 ODBC,textsize 是隐式的,所以我们甚至不需要定义它。 . :/ 我刚刚用另一种解决方案编辑了我的帖子。肮脏,但工作;) 您应该将此解决方案发布为答案并将其选择为已接受,以便对其他用户有所帮助。是的,我想建议你使用 ODBC :) 【参考方案1】:

我找到了一个替代解决方案,很脏......但工作正常: --> 将数据类型从“TEXT”转换为“VARCHAR(10000)” --> 使用 ODBC 代替 PDO 和 ODBC --> 将您的 DAO 配置为使用 ODBC 或 PDO & ODBC,具体取决于您的表是否有 TEXT 字段(您必须将它们转换为 VARCHAR(XXXX) 或不。

我希望这将帮助那些处于相同情况的人。

【讨论】:

以上是关于在第 256 个字符处截断数据 - PHP 与 HFSQL 数据库,使用 PDO ODBC 试点的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 在特殊字符处截断字符串

PHP:在分词处截断字符串

使用 MySQL 选择时截断字符串

使用 sf_open 时,libsndfile 在 512 个字符处截断路径

PHP 将字符串长度截断为n个字符并使用...

java 如何对中英文和符号数字混合的字符串进行截取,其中包含各种括号( ( [ < >] ) )?