2012-06-18 10 views
10

que estoy haciendo un generador .php RSS y tengo un problema al intentar obtener datos de mi base de datos en esta línea:htmlspecialchars UTF-8 vuelve vacía cadena

<description><![CDATA[<?=htmlspecialchars(utf8_substr($row['texto'], 0, 100), ENT_QUOTES, 'utf-8') ?>...]]></description> 

Algunas entradas muestran muy bien, y los demás no devolverá ningún texto ... ¿Alguna idea sobre qué podría estar mal?

Este es todo el código:

<?php 

require('php/config.php'); 
require('php/db.php'); 
require('php/utils.php'); 

header("Content-type: application/xml"); 

$db = new TSQL('SELECT * FROM entradas WHERE estado = 1 ORDER BY fecha DESC LIMIT 20'); 
if ($db->executeQuery()) { 

?><?='<?xml version="1.0" encoding="utf-8" ?>' ?> 
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> 
    <channel> 
     <title>Tu Secreto</title> 
     <link>http://www.tusecreto.com.ar/</link> 
     <description>TuSecreto/No se lo cuentes a nadie, contaselo a todos</description> 
     <language>es-ar</language> 
     <copyright>TuSecreto (C) 2005-<?php print strftime("%Y", time()); ?></copyright> 
     <lastBuildDate><?=strftime("%a, %d %b %Y %H:%M:%S ", $row['fecha']) ?></lastBuildDate> 
     <atom:link href="http://www.tusecreto.com.ar/rss.php" rel="self" type="application/rss+xml" /> 
     <docs>http://www.tusecreto.com.ar/rss.php</docs> 
     <generator>TuSecreto RSS Generator v1.0</generator> 
     <ttl>10</ttl> 
     <? while ($row = $db->getRow(MYSQL_ASSOC)) { ?> 
     <item> 
      <title><?=($row['sexo'] == MUJER)?'Mujer':'Hombre' ?> | <?=$row['edad'] ?> <?="A\xC3\xB1os" ?></title> 
      <description><![CDATA[<?=htmlspecialchars(utf8_substr($row['texto'], 0, 100), ENT_QUOTES, 'utf-8') ?>...]]></description> 
      <link>http://www.tusecreto.com.ar/<?=$row['id'] ?></link> 
      <guid isPermaLink="true">http://www.tusecreto.com.ar/<?=$row['id'] ?></guid> 
      <pubDate><?=strftime("%a, %d %b %Y %H:%M:%S ", $row['fecha']) ?></pubDate> 
     </item> 
     <?php } ?> 
    </channel> 
</rss> 

Este es uno de los resultados que devuelve una cadena vacía:

Una Vez En El colectivo (sentada en el asiento individuo) Me Dormí Y Cuando doblo me caí en el pasillo re mal! se mataron de la risa todos !! hasta el colectivero! Pasalo y comento con mi Facebook. E.P.

+0

Da un ejemplo de algunos que están dando como resultado la devolución de una cadena vacía. –

+2

¿Cómo se define 'utf8_substr'? – Gumbo

+0

He actualizado la publicación con todo el código y un resultado ... ¿Tal vez es porque los caracteres acentuados? "dormí". Es español ... – Santiago

Respuesta

12

Su código usa htmlspecialchars($string, ENT_QUOTES, 'utf-8'). Citando del manpage

Si la cadena de entrada contiene una secuencia de unidad de código no válido dentro de la dado que codifica una cadena vacía será devuelto, a menos que se fijan banderas ya sea la ENT_IGNORE o ENT_SUBSTITUTE.

Usar p. Ej. htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'utf-8') como una solución rápida.

Si la entrada no válida es de hecho su problema, por supuesto, debe averiguar por qué utf8_substr($row['texto'], 0, 100) no devuelve una cadena UTF-8 válida en primer lugar.

+0

(1) El valor predeterminado no es 'ENT_QUOTES' sino' ENT_COMPAT'. (2) Lo que dice el documento sobre 'ENT_IGNORE':" Descartar silenciosamente las secuencias de unidad de código no válidas en lugar de devolver una cadena vacía. Se desaconseja usar esta marca, ya que "puede tener implicaciones de seguridad". (3) 'ENT_SUBSTITURE' solo está disponible a partir de PHP 5.4.0 – JeromeJ

+0

Definitivamente no ignore este error con' ENT_IGNORE' ya que esto tiene implicaciones de seguridad, según los documentos. –