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']() স্টেটমেন্টের বাইরের একটি প্রতিধ্বনি করি ?
টর্নফিল্ড

অথবা সম্ভবত example r ['বর্ণনা'] এর কিছু উদাহরণ সামগ্রী সহায়তা করবে। এটা কি ডেটাটাইপ?
মোপোককে

আপনি কি ডাটাবেস শেমার স্ক্রিনশট তৈরি করতে পারবেন? ;-)
রাস্তারপাড়া 23

উত্তর:


256

আমি বাজি ধরছি আপনি নন-ইউটিএফ 8 এনকোডিংয়ে ডেটা পুনরুদ্ধার করছেন: mysql_query('SET CHARACTER SET utf8')আপনার SELECTপ্রশ্নের আগে রাখার চেষ্টা করুন ।


5
হাই, এই উত্তর আমার জীবন বাঁচিয়েছে, আপনাকে ধন্যবাদ। আমার এখানেও একই সমস্যা ছিল। "ভ্যালিডাও দে ফর্মুলারিওস" এর মতো নন-ইউটিএফ 8 অক্ষরের সাথে আমার মান ছিল। আমি জানি এই প্রশ্নটি এখন কিছুটা পুরানো, তবে এটি ইন্টারনেটের দুর্দান্ততা !!
ফবিও

7
সুরক্ষা কারণে পিএইচপি 5.2.3 থেকে mysql_set_charset ভাল। বিশদ জানতে php.net/manual/en/function.mysql-set-charset.php দেখুন ।
মাসাকিয়েলাস্টিক

3
কারণ ইউটিএফ 8 ওয়েবে লিঙ্গুয়া ফ্র্যাঙ্কা। অতিরিক্ত প্যারামিটার এবং ওভারহেড সহ এপিআইকে গোলমাল করার পরিবর্তে, পিএইচপি (দৃth়ভাবে) সর্বাধিক সাধারণ এনকোডিং ব্যবহার করে, যদি আপনি কোনও অসাধারণ (অথবা আপনার ক্ষেত্রে যেমন একটি মৃত) আপনার এনকোডিং ব্যবহার করেন তবে আপনাকে রূপান্তর বোঝা ছেড়ে দেয়।
এনটিডি

1
এটি করার প্রস্তাবিত পদ্ধতিটি এখন পরিবর্তিত হয়েছে। আমি একটি লিঙ্ক অন্তর্ভুক্ত করার জন্য এই উত্তরটি সম্পাদনা করার চেষ্টা করেছি তবে তা প্রত্যাখ্যান করা হয়েছিল। সঠিক উপায় নীচে আমার উত্তর হয়।
বেজেস

1
@ দেখুন দেখুন আপনার ক্ষেত্রগুলি ইউটিএফ -8 এ সংরক্ষণ করা যথেষ্ট নয়: আপনাকে ইউটিএফ -8 এর ক্লায়েন্টদের জবাব দেওয়ার জন্য আপনার সার্ভারটি কনফিগার করতে হবে । আফাইক স্টক মাইএসকিএল এবং মারিয়্যাডবি ল্যাটিন 1 ব্যবহার করে।
এনটিডি

118

আপনার যদি কমপক্ষে পিএইচপি 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

এনটিডি'র আনসার আমার সমস্যার সমাধান করেনি। একই পরিস্থিতিতে যারা আছেন তাদের জন্য, আমি শেষ পর্যন্ত কীভাবে এই ত্রুটিটি পরিচালনা করেছি: আপনার প্রতিটি ফলাফলকে utf8_encode করুন।

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

আশা করি এটা সাহায্য করবে!


আমারও এনকোডিংয়ের সমস্যা ছিল। ডাব্লু / মিশ্র এনকোডিং। সমাধান আমি খুঁজে পেয়েছি: stackoverflow.com/a/3521396/776345
পাসচলিস

9

কিছু দিন আগে আমার 1 টেবিলের সাথে একই সমস্যা আছে।

প্রথমে চেষ্টা করুন:

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

যদি শেষ লাইনটি 5 ফেরত দেয় তবে সমস্যাটি আপনার ডেটা নিয়ে । আমি জানি, আপনার টেবিলগুলি ইউটিএফ -8 এ রয়েছে তবে ডেটা প্রবেশ করা হয়নি । উদাহরণস্বরূপ ইনপুটটি টেক্সট ফাইলে ছিল তবে উইন মেশিনে মূup় এনকোডিং দিয়ে তৈরি করা হয়েছে (আমার ক্ষেত্রে উইন -1250 = সিপি 1250) এবং এই ডেটা ডিবিতে প্রবেশ করা হয়েছে।

সমাধান? নতুন ডেটা (এক্সেল, ওয়েব পৃষ্ঠা) সন্ধান করুন, পিএসপিডের মাধ্যমে সোর্স টেক্সট ফাইল সম্পাদনা করুন (বা অন্য যাই হোক না কেন) ইউটিএফ -8 এ এনকোডিং পরিবর্তন করুন , সমস্ত সারি মুছুন এবং এখন মূল থেকে ডেটা রাখুন। সংরক্ষণ. ডিবিতে প্রবেশ করুন

আপনি কেবল এনকোডিংটি utf-8 এ পরিবর্তন করতে পারেন এবং তারপরে সমস্ত সারিটি ম্যানুয়ালি পরিবর্তন করতে পারেন (বিশেষ অক্ষরের সাথে কলস দিন - ডেস্ক, ...)। দাসদের জন্য ভাল ...


বা সমস্যাটি দেখতে JSON_PARTIAL_OUTPUT_ON_ERRORবিকল্পটি ব্যবহার করুন (যেমন, ইউটিএফ 8 সহ ক্ষেত্রটি শূন্য হবে)।
পিটার ক্রাউস

6

আপনার জেএসন_কোডে 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আপনার ব্যবহার করা উচিত <নয় <=। প্রতিটি লুপটিকে পুনরায় গণনা না করে আপনার এই মানটি (পরিবর্তনশীলে এটি সংরক্ষণ করুন) ক্যাশে করা উচিত। হুডের নীচে এটি কী করছে কে জানে ... (দক্ষ হতে পারে, আমি সত্যই নিশ্চিত নই)
  • আপনার প্রতিটি মানটি এর মতো স্পষ্টভাবে অনুলিপি করার দরকার নেই ... আপনি নিজের উপর এটিকে আরও শক্ত করে তুলছেন। কোয়েরিটি যদি আপনি সেখানে তালিকাভুক্তের চেয়ে বেশি মান ফিরিয়ে দিচ্ছেন তবে কেবলমাত্র আপনার এসকিউএল-এ আপনার পছন্দের তালিকাবদ্ধ করুন।
  • mysql_fetch_arrayপাশাপাশি keyএবং উভয়ই মানগুলি প্রদান করে int। আপনি সূচকগুলি ব্যবহার করছেন না, তাই তাদের এনে দেবেন না।

যদি সত্যিই এটির সাথে সমস্যা হয় json_encodeতবে আমি লুপের বডিটি এরকম কিছু দিয়ে প্রতিস্থাপনের পরামর্শ দিতে পারি

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

পারহপাসে সেখানে কিছু বিশেষ চর রয়েছে যা উপহাস করছে ...


[{"আইডি": "4", "নাম": "নোটার 2", "বিবরণ": নাল, "আইকন": "HTTP: \ / \ / images.apple.com \ / ওয়েব অ্যাপস produc / উত্পাদনশীলতা \ / চিত্রসমূহ \ /noter2_20091223182720-thumb.jpg "," তারিখ ":" 1262032317 "," সংস্থা ":" ডিবিলেট, এলএলসি "," কোম্পানিরল ":" http: \ / \ / dbelement.com \ / "," অ্যাপুর্ল ":" http: \ / \ / noter2.dbelement.com "}, {" আইডি ":" 3 "," নাম ":" নোটার 2 "," বিবরণ ": নাল," আইকন ":" http: \ / \ / চিত্রসমূহ .apple.com \ / ওয়েব অ্যাপস \ / উত্পাদনশীলতা \ / চিত্রসমূহ not / নোটার 2_20091223182720-thumb.jpg "," তারিখ ":" 1262032317 "," সংস্থা ":" ডিবিলেট, এলএলসি "," কোম্পানুরল ":" http: \ / \ /dbelement.com\/","appurl":"http:\/\/noter2.dbelement.com "
টার্নফিল্ড

@ টার্নফিল্ড: আচ্ছা, আপনি যা চান তা কি না? ওহ..আপনি সেখানে কিছু অতিরিক্ত তথ্য পেয়েছেন ... এখানে ... আমাকে আপনার জন্য এটি ঠিক করতে দিন।
এমপিএন

হ্যাঁ "বিবরণ" ফিরিয়ে দেয়null
টার্নফিল্ড

যদি বিবরণটি ফিরে আসে nullতবে সম্ভবত এটি null । এই লুপটিতে চেষ্টা করুন echo $row['description'].'<br/>';এবং দেখুন এটি কী বলে।
এমপিএন

1
হাই, এই উত্তর আমার জীবন বাঁচিয়েছে, আপনাকে ধন্যবাদ। আমার এখানেও একই সমস্যা ছিল। "ভ্যালিডাও দে ফর্মুলারিওস" এর মতো নন-ইউটিএফ 8 অক্ষরের সাথে আমার মান ছিল। আমি জানি এই প্রশ্নটি এখন কিছুটা পুরানো, তবে এটি ইন্টারনেটের দুর্দান্ততা !!
ফবিও


3

যে কেউ PDO ব্যবহার করে, সমাধানটি এনটিডি-র উত্তরের মতো

থেকে পিএইচপি PDO :: __ কনস্ট্রাক্ট পৃষ্ঠা , ব্যবহারকারীর কাছ থেকে একটি মন্তব্য হিসাবে লাইভ ডট কম এ Kiipa :

ইউটিএফ -8 চারসেট পেতে আপনি এটি ডিএসএন-তে নির্দিষ্ট করতে পারেন।

$ লিঙ্ক = নতুন পিডিও ("মাইএসকিএল: হোস্ট = লোকালহোস্ট; ডিবিনেম = ডিবি; চরসেট = ইউটিএফ 8 ");


0

আমার জন্য, একটি বিষয় যেখানে জসন_নকোড কোনও সত্তার নাল এনকোডিংটি ফিরিয়ে দেবে কারণ আমার জসনসিরাইজাল বাস্তবায়ন সম্পর্কিত সত্ত্বার জন্য পুরো অবজেক্টগুলি এনেছিল; আমি বিষয়টি নিশ্চিত করেছি যে আমি সম্পর্কিত / সম্পর্কিত সত্তার আইডি এনেছি এবং -> টু অ্যারে () এ ফোন করেছি যখন যখন জেসসন সিরিয়ালকরণের জন্য যখন বস্তুর সাথে একাধিক সত্তা যুক্ত ছিল। দ্রষ্টব্য, আমি এমন মামলাগুলির বিষয়ে কথা বলছি যেখানে implements JsonSerializableসত্ত্বার একটি one


-4

আমার একই সমস্যা ছিল এবং সমাধানটি ছিল তার পরিবর্তে আমার নিজের ফাংশনটি ব্যবহার করা json_encode()

echo '["' . implode('","', $row) . '"]';
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.