数据在第 256 个字符处被截断 - PHP 使用 HFSQL 数据库,使用 PDO ODBC pilot
Data truncated at the 256th character - PHP with HFSQL database, using PDO ODBC pilot
我正在使用 PHP 和 HyperFileSQL 创建一个网站,基于用于连接的 PDO 和 ODBC。
我正在使用 PHP 的 7.1.9 版本并在 WampServer 下工作。
但是 我在检索超过 255 个字符的文本数据时遇到问题:数据被截断并且一些随机字符出现在末尾。
我找到了一些关于这个问题的帖子,如下所示:
- https://bugs.php.net/bug.php?id=38805 ==> 这个问题是关于 MSSQL Server 的;我尝试了不同的建议,但对我没有任何用处(PHP.ini 和 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"备选):
// 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,这取决于你的 table 是否有 TEXT 字段(你必须将它们转换为 VARCHAR(XXXX)。
希望对同样情况的朋友有所帮助
尽管如此,我仍然在考虑更清洁的解决方案:)
我找到了一个替代解决方案,很脏...但是有效:
--> 将数据类型从 "TEXT" 转换为 "VARCHAR(10000)"
--> 使用 ODBC 而不是 PDO 和 ODBC
--> 配置你的 DAO 以使用 ODBC 或 PDO & ODBC,这取决于你的 table 是否有 TEXT 字段(你必须将它们转换为 VARCHAR(XXXX)。
希望对有相同情况的朋友有所帮助。
我正在使用 PHP 和 HyperFileSQL 创建一个网站,基于用于连接的 PDO 和 ODBC。
我正在使用 PHP 的 7.1.9 版本并在 WampServer 下工作。
但是 我在检索超过 255 个字符的文本数据时遇到问题:数据被截断并且一些随机字符出现在末尾。
我找到了一些关于这个问题的帖子,如下所示:
- https://bugs.php.net/bug.php?id=38805 ==> 这个问题是关于 MSSQL Server 的;我尝试了不同的建议,但对我没有任何用处(PHP.ini 和 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"备选):
// 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,这取决于你的 table 是否有 TEXT 字段(你必须将它们转换为 VARCHAR(XXXX)。
希望对同样情况的朋友有所帮助
尽管如此,我仍然在考虑更清洁的解决方案:)
我找到了一个替代解决方案,很脏...但是有效:
--> 将数据类型从 "TEXT" 转换为 "VARCHAR(10000)"
--> 使用 ODBC 而不是 PDO 和 ODBC
--> 配置你的 DAO 以使用 ODBC 或 PDO & ODBC,这取决于你的 table 是否有 TEXT 字段(你必须将它们转换为 VARCHAR(XXXX)。
希望对有相同情况的朋友有所帮助。