2012-06-18 11 views
10

मैं एक .php आरएसएस जनरेटर कर रहा हूँ और मैं इस लाइन में मेरी डेटाबेस से डेटा प्राप्त करने की कोशिश एक समस्या है:htmlspecialchars utf-8 रिटर्न रिक्त स्ट्रिंग

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

कुछ प्रविष्टियों ठीक दिखाने के लिए, और दूसरों किसी भी पाठ को वापस न करें ... क्या गलत हो सकता है पर कोई विचार?

यह सब कोड है:

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

यह एक नतीजा यह है कि एक खाली स्ट्रिंग रिटर्न है:

Una Vez एन एल colectivo (sentada एन एल asiento व्यक्ति) मेरे Dormi y कुआंदो DOBLO मुझे caí en el pasillo re mal! से मातरॉन डे ला रिसा टोडोस !! hasta el colectivero! Pasalo y comento con mi फेसबुक। E.P.

+0

कुछ का उदाहरण दें जिसके परिणामस्वरूप रिक्त स्ट्रिंग की वापसी हो रही है। –

+2

'utf8_substr' कैसे परिभाषित किया गया है? – Gumbo

+0

मैंने पोस्ट को सभी कोड और एक परिणाम के साथ अपडेट किया है ... शायद ऐसा इसलिए है क्योंकि उच्चारण वर्ण? "Dormi"। स्पेनिश है ... – Santiago

उत्तर

12

आपका कोड htmlspecialchars($string, ENT_QUOTES, 'utf-8') का उपयोग करता है। manpage

से हवाला देते हुए इनपुट स्ट्रिंग कोई रिक्त स्ट्रिंग एन्कोडिंग दिया भीतर एक अमान्य कोड इकाई अनुक्रम शामिल है, तो वापस कर दी जाएगी जब तक कि या तो ENT_IGNORE या ENT_SUBSTITUTE झंडे सेट कर रहे हैं।

उदाहरण के लिए उपयोग करें एक त्वरित कामकाज के रूप में htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'utf-8')

यदि अमान्य इनपुट वास्तव में आपकी समस्या है, तो आपको यह पता लगाना चाहिए कि utf8_substr($row['texto'], 0, 100) पहले स्थान पर वैध यूटीएफ -8 स्ट्रिंग क्यों नहीं लौटाता है।

+0

(1) डिफ़ॉल्ट 'ENT_QUOTES' नहीं बल्कि 'ENT_COMPAT' है। (2) दस्तावेज़ 'ENT_IGNORE' के बारे में क्या कहता है: "एक खाली स्ट्रिंग को वापस करने के बजाय चुपचाप अमान्य कोड इकाई अनुक्रमों को छोड़ दें। इस ध्वज का उपयोग करना निराश है क्योंकि इसमें सुरक्षा प्रभाव हो सकते हैं।" (3) 'ENT_SUBSTITURE' केवल PHP 5.4.0 – JeromeJ

+0

से उपलब्ध है, निश्चित रूप से इस त्रुटि को 'ENT_IGNORE' के साथ अनदेखा न करें क्योंकि इसमें दस्तावेज़ों के प्रति सुरक्षा प्रभाव हैं। –

संबंधित मुद्दे