Outils personnels
Vous êtes ici : Accueil Symfony Propel Récupérer les champs VARCHAR de plus de 255 caractères dans une base de données Microsoft SQL Server.
Actions sur le document
  • Send this page to somebody
  • Print this page
  • Add Bookmarklet

Récupérer les champs VARCHAR de plus de 255 caractères dans une base de données Microsoft SQL Server.

Par Pierre-Yves Landuré - Dernière modification 19/03/2008 11:52

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


Réalisé avec Plone

Ce site respecte les normes suivantes :

Wikio