json_encode NULL लौट रहा है?


119

किसी कारण के लिए आइटम "विवरण" NULLनिम्नलिखित कोड के साथ देता है :

<?php
include('db.php');

$result = mysql_query('SELECT * FROM `staff` ORDER BY `id` DESC LIMIT 2') or die(mysql_error());
$rows = array();
while($row = mysql_fetch_assoc($result)){
    $rows[] = $row;
}

echo json_encode($rows);
?>

यहाँ मेरे डेटाबेस के लिए स्कीमा है:

CREATE TABLE `staff` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` longtext COLLATE utf8_unicode_ci,
  `description` longtext COLLATE utf8_unicode_ci,
  `icon` longtext COLLATE utf8_unicode_ci,
  `date` longtext COLLATE utf8_unicode_ci,
  `company` longtext COLLATE utf8_unicode_ci,
  `companyurl` longtext COLLATE utf8_unicode_ci,
  `appurl` longtext COLLATE utf8_unicode_ci,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

यहाँ पृष्ठ पर क्या प्रतिध्वनित है:

[{"id":"4","name":"Noter 2","description":null,"icon":"http:\/\/images.apple.com\/webapps\/productivity\/images\/noter2_20091223182720-thumb.jpg","date":"1262032317","company":"dBelement, LLC","companyurl":"http:\/\/dbelement.com\/","appurl":"http:\/\/noter2.dbelement.com"},{"id":"3","name":"Noter 2","description":null,"icon":"http:\/\/images.apple.com\/webapps\/productivity\/images\/noter2_20091223182720-thumb.jpg","date":"1262032317","company":"dBelement, LLC","companyurl":"http:\/\/dbelement.com\/","appurl":"http:\/\/noter2.dbelement.com"}]

कोई विचार?


सरणी कुंजियों को उद्धरणों में रखें, सबसे पहले।
जोस डेस

क्या आप अपने "स्टाफ" टेबल के स्कीमा की जानकारी दे सकते हैं। क्या विवरण नामक एक स्तंभ है?
मोपोक

इन सभी क्षेत्रों के बाहर गूंज होगा अगर मैं बस $r['description']के लिए बाहर की एक प्रतिध्वनि () बयान?
tarnfeld

या शायद $ r ['विवरण'] से कुछ उदाहरण सामग्री से मदद मिलेगी। क्या डेटाटाइप है?
मोपोक

आप डेटाबेस शमा का स्क्रीनशॉट बना सकते हैं? ;-)
सड़क पर उतरना

जवाबों:


256

मुझे यकीन है कि आप गैर- utf8 एन्कोडिंग में डेटा प्राप्त कर रहे हैं: mysql_query('SET CHARACTER SET utf8')अपनी SELECTक्वेरी से पहले डालने का प्रयास करें ।


5
नमस्ते, इस जवाब ने मेरी जान बचाई, धन्यवाद। मुझे यहाँ वही समस्या हो रही थी। मेरे पास "Validação de Formulários" जैसे गैर-utf8 वर्णों के साथ मूल्य थे। मुझे पता है कि यह सवाल अब थोड़ा पुराना है, लेकिन यह इंटरनेट की अजीबता है !!
फेबियो

7
PHP 5.2 के बाद से mysql_set_charset सुरक्षा कारणों से बेहतर है। विवरण के लिए php.net/manual/en/function.mysql-set-charset.php देखें ।
मासकिलेस्टिक

3
क्योंकि UTF8 वेब पर लिंगुआ फ्रेंका है। अतिरिक्त मापदंडों और ओवरहेड के साथ एपीआई को अव्यवस्थित करने के बजाय, PHP (कठोरता से) सबसे आम एन्कोडिंग का उपयोग करता है, यदि आप एक असामान्य (या लगभग मृत के रूप में, आपके मामले में) एन्कोडिंग का उपयोग करते हुए रूपांतरण का बोझ छोड़ते हैं।
ntd

1
ऐसा करने का अनुशंसित तरीका अब बदल गया है। मैंने एक लिंक शामिल करने के लिए इस उत्तर को संपादित करने की कोशिश की, लेकिन अस्वीकार कर दिया गया। सही तरीका नीचे मेरे उत्तर में है।
बेज

1
@VeeK यह UTF-8 में संग्रहीत आपके फ़ील्ड के लिए पर्याप्त नहीं है: आपको UTF-8 में ग्राहकों को जवाब देने के लिए अपने सर्वर को कॉन्फ़िगर करना होगा । AFAIK स्टॉक mysql और mariadb लैटिन 1 का उपयोग करते हैं।
एनडीटी

118

यदि आपके पास कम से कम PHP 5.5 है, तो आप json_last_error_msg () का उपयोग कर सकते हैं , जो समस्या का वर्णन करते हुए एक स्ट्रिंग लौटाएगा।

यदि आपके पास 5.5 नहीं है, लेकिन 5.3 से ऊपर / ऊपर हैं, तो आप json_last_error () का उपयोग करके देख सकते हैं कि समस्या क्या है।

यह एक पूर्णांक लौटाएगा, जिसका उपयोग आप फ़ंक्शन के दस्तावेज़ में समस्या की पहचान करने के लिए कर सकते हैं । वर्तमान में (2012.01.19), पहचानकर्ता हैं:

0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8

ये भविष्य के संस्करणों में बदल सकते हैं, इसलिए मैनुअल से परामर्श करना बेहतर है।

यदि आप 5.3 से नीचे हैं, तो आप भाग्य से बाहर हैं, यह पूछने का कोई तरीका नहीं है कि त्रुटि क्या थी।


18

ntd's anwser ने मेरी समस्या का समाधान नहीं किया। उसी स्थिति में उन लोगों के लिए, यहां बताया गया है कि आखिरकार मैंने इस त्रुटि को कैसे संभाला: बस आपके परिणामों में से प्रत्येक को utf8_encode।

while($row = mysql_fetch_assoc($result)){
    $rows[] = array_map('utf8_encode', $row);
}

आशा करता हूँ की ये काम करेगा!


मुझे एन्कोडिंग की समस्या भी थी। w / मिश्रित एन्कोडिंग। समाधान मैंने पाया: stackoverflow.com/a/3521396/776345
पाश्चलिस

9

कुछ दिन पहले मुझे 1 टेबल के साथ एसएएमई समस्या है।

सबसे पहले प्रयास करें:

echo json_encode($rows);
echo json_last_error();  // returns 5 ?

यदि अंतिम पंक्ति 5 लौटती है, तो समस्या आपके डेटा के साथ है । मुझे पता है, आपके टेबल UTF-8 में हैं, लेकिन डेटा दर्ज नहीं किया गया है । उदाहरण के लिए इनपुट txt फ़ाइल में था, लेकिन बेवकूफ एन्कोडिंग के साथ Win मशीन पर बनाया गया था (मेरे मामले में Win-1250 = CP1250) और यह डेटा DB में दर्ज किया गया है।

उपाय? नए डेटा के लिए देखें (एक्सेल, वेब पेज), PSPad (या जो कुछ भी) के माध्यम से स्रोत txt फ़ाइल को संपादित करें , एन्कोडिंग को UTF-8 में बदलें , सभी पंक्तियों को हटा दें और अब मूल से डेटा डालें। सहेजें। DB में दर्ज करें

आप केवल एन्कोडिंग को utf-8 में भी बदल सकते हैं और फिर सभी पंक्तियों को मैन्युअल रूप से बदल सकते हैं (विशेष वर्णों के साथ कोल्स दें - desc, ...)। गुलामों के लिए अच्छा ...


या समस्या को देखने के लिए JSON_PARTIAL_OUTPUT_ON_ERRORविकल्प का उपयोग करें (उदाहरण के लिए, UTF8 के साथ फ़ील्ड शून्य होगा)।
पीटर क्रस

6

आपको json_encode में utf8 एन्कोडेड स्ट्रिंग पास करनी चाहिए। आप नीचे की तरह काम कर सकते हैं utf8_encodeऔर array_map()काम कर सकते हैं :

<?php
    $encoded_rows = array_map('utf8_encode', $rows);
    echo json_encode($encoded_rows);
?>

4

आह !!! यह बहुत गलत लग रहा है यह मेरे सिर को चोट पहुँचाता है। ऐसे में कुछ और आजमाएं ...

<?php
include('db.php');

$result = mysql_query('SELECT `id`, `name`, `description`, `icon` FROM `staff` ORDER BY `id` DESC LIMIT 20') or die(mysql_error());
$rows = array();
while($row = mysql_fetch_assoc($result)){
    $rows[] = $row;
}

echo json_encode($rows);
?>
  • जब mysql_num_rowsआप पर चलने का उपयोग <नहीं करना चाहिए <=। आपको प्रत्येक लूप को फिर से गिनने के बजाय इस मान को कैश करना चाहिए (इसे किसी वैरिएबल में सेव करना)। कौन जानता है कि यह हुड के तहत क्या कर रहा है ... (कुशल हो सकता है, मुझे वास्तव में यकीन नहीं है)
  • आपको प्रत्येक मूल्य को इस तरह स्पष्ट रूप से कॉपी करने की आवश्यकता नहीं है ... आप बस अपने आप को यह कठिन बना रहे हैं। यदि क्वेरी आपके द्वारा सूचीबद्ध किए जाने से अधिक मान लौटा रही है, तो केवल उन लोगों को सूचीबद्ध करें जिन्हें आप अपने SQL में चाहते हैं।
  • mysql_fetch_arrayमूल्यों को दोनों के द्वारा keyऔर वापस लौटाता है int। आप सूचकांकों का उपयोग नहीं कर रहे हैं, इसलिए उन्हें नहीं लाएं।

यदि यह वास्तव में एक समस्या है json_encode, तो क्या मैं लूप के शरीर को कुछ इस तरह से बदलने का सुझाव दे सकता हूं

$rows[] = array_map('htmlentities',$row);

Perhpas वहाँ कुछ विशेष आकर्षण है कि वहाँ बातें कर रहे हैं ...


[{"आईडी": "४", "नाम": "नोटर २", "विवरण": अशक्त, "आइकन": "http: \ / \ / images.apple.com \ / webapps \ / उत्पादकता \ / छवियां" \ / नोटेर 2_20091223182720-thumb.jpg "," तिथि ":" 1262032317 "," कंपनी ":" डीबेलमेंट, एलएलसी "," कंपनीर्ल ":" http: \ / / dbelement.com \ "," appurl ":" http: \ / \ / noter2.dbelement.com "}, {" id ":" 3 "," नाम ":" Noter 2 "," description ": null," icon ":" http: \ / \ / images .apple.com \ / webapps \ / उत्पादकता \ / छवियों \ / नोटरी 2_20091223182720-thumb.jpg "," तिथि ":" 1262032317 "," कंपनी ":" डीबेलमेंट, एलएलसी "," कंपनीर्ल ":" http: \ / \ \ " /dbelement.com\/","appurl":"http:\/\/noter2.dbelement.com "
टेरनफेल्ड

@ टर्नफ़ील्ड: ठीक है, यह है कि आप क्या चाहते हैं या नहीं? ओह..आपको वहां कुछ अतिरिक्त जानकारी मिली है ... यहाँ ... मुझे आपके लिए ठीक करने दीजिए।
मप्र २

हाँ "विवरण" रिटर्नnull
tarnfeld

यदि विवरण वापस आ रहा है nullतो संभवतः है nullecho $row['description'].'<br/>';उस लूप में कोशिश करें और देखें कि यह क्या कहता है।
मप्र २

1
नमस्ते, इस जवाब ने मेरी जान बचाई, धन्यवाद। मुझे यहाँ वही समस्या हो रही थी। मेरे पास "Validação de Formulários" जैसे गैर-utf8 वर्णों के साथ मूल्य थे। मुझे पता है कि यह सवाल अब थोड़ा पुराना है, लेकिन यह इंटरनेट की अजीबता है !!
फेबियो


3

पीडीओ का उपयोग करने वाले किसी भी व्यक्ति के लिए, समाधान एनडीटी के जवाब के समान है ।

से पीएचपी पीडीओ :: __ निर्माण पेज , उपयोगकर्ता से एक टिप्पणी के रूप में लाइव डॉट कॉम पर Kiipa :

UTF-8 चारसेट प्राप्त करने के लिए आप डीएसएन में निर्दिष्ट कर सकते हैं।

$ लिंक = नया पीडीओ ("mysql: host = localhost; dbname = DB; चारसेट = UTF8 ");


0

मेरे लिए, एक ऐसा मुद्दा जहाँ json_encode एक इकाई के रिक्त एन्कोडिंग को लौटाएगा क्योंकि मेरे jsonSerialize कार्यान्वयन ने संबंधित संस्थाओं के लिए संपूर्ण ऑब्जेक्ट प्राप्त किए थे; मैंने यह सुनिश्चित करके इस मुद्दे को हल किया कि मैंने संबंधित / संबंधित इकाई की आईडी प्राप्त की है और कहा -> toArray () जब ऑब्जेक्ट के साथ जुड़े एक से अधिक निकाय हों जो कि json serialized हो। ध्यान दें, मैं उन मामलों के बारे में बोल रहा हूं जहां एक implements JsonSerializableसंस्थाओं पर।


-4

मेरे पास एक ही समस्या थी और समाधान के बजाय अपने स्वयं के फ़ंक्शन का उपयोग करना था json_encode()

echo '["' . implode('","', $row) . '"]';
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.