Récupérer les champs VARCHAR de plus de 255 caractères dans une base de données Microsoft SQL Server.
Un bug de PHP tronque les champs VARCHAR récupérés d'une base Microsoft SQL Server à 255. Les valeurs dépassant cette longueur sont incomplétes. Voici un bout de code qui vous permettra de contourner ce problème avec Symfony.
Modifiez la classe de l'objet qui dispose d'un champ VARCHAR d'une taille supérieure à 255 caractères (fichier lib/model/Classe.php), et ajoutez y les deux codes suivants (dans cet exemple, le champs est nommé COMMENT):
- Ce code est un drapeau qui permet de savoir si l'on a récupéré la valeur complète du champs ou non.
/**
* full_length_comment Flag.
* True if the full length of COMMENT field has been fetched.
*
* @var boolean
* @access protected
*/
protected $full_length_comment = false; - Cette méthode remplace celle utilisée pour récuperer la valeur du champs, et permet de récupèrer la valeur compléte du champ.
/**
* Get the full length of COMMENT field.
*
* @access public
* @return string The COMMENT field value.
*/
public function getComment()
{
$map = TacheUtilisateurPeer::getTableMap();
$column = $map->getColumn('COMMENT');
if(($column->getCreoleType() == CreoleTypes::VARCHAR) && ($column->getSize() > 255) && !$this->full_length_comment)
{
$criteria = new Criteria();
$criteria->addSelectColumn(TacheUtilisateurPeer::ID);
for($counter = 0; ($counter * 255) < $column->getSize(); $counter++)
{
$criteria->addAsColumn(sprintf('value_%d', $counter),
sprintf('SUBSTRING(%s, %d, 255)', TacheUtilisateurPeer::COMMENT, ($counter * 255) + 1)
);
}
$criteria->add(TacheUtilisateurPeer::ID, $this->getId(), Criteria::EQUAL);
$rs = TacheUtilisateurPeer::doSelectRS($criteria);
if($rs->next())
{
$this->comment = '';
for($counter = 0; ($counter * 255) < $column->getSize(); $counter++)
{
$this->comment .= $rs->getString($counter + 2);
}
}
else
{
$this->comment = null;
}
$this->full_length_comment = true;
}
return $this->comment;
}
Attention: Pour l'adapter à votre besoin, remplacez les valeurs :
- COMMENT par le nom de votre champ en majuscules.
- Comment par le nom "PHP" de votre champ.
- comment par le nom de votre champ en minuscules.
Ce code crée une requête séparant le champ problèmatique en autant de morceaux de 255 caractères que nécessaire, et les réassemble en PHP pour obtenir la valeur complète du champ. Ce code ne fonctionne (et n'est nécessaire) que pour une base de donnée MSSQL.
Remerciements
- Merci à Chung Leong pour m'avoir mis sur la piste de ce code dans sa réponse à Nasty Problem PHP / SQL Server and Varchar fields > 255 in Length.