我正在尝试从DB表构建JSON,我需要在json_encode()之前使用utf8_encode()。我去了这个错误。 这是一个代码。我做错了什么?
<?php
$db = new PDO('mysql:host=MY_HOST;dbname=MY_DB;charset=UTF-8',
'MY_LOGIN', 'MY_PASS', array(
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
)
);
$stmt = $db->prepare(
"SELECT id,title,`fulltext`,catid,publish_state FROM items WHERE id>:id"
);
$stmt->bindValue(':id', 2000, PDO::PARAM_STR);
$stmt->execute();
$output_arr = $stmt->fetchAll(PDO::FETCH_ASSOC);
//FOR TEST ONLY
echo 'Output:<br />';
print_r ($output_arr); //prints OK if I remove line 21 (below)
//BEFORE ENCODING TO JSON I NEED TO ENCODE TO UTF-8...
$output_encoded = array_walk(utf8_encode, $output_arr);
//AND NOW I GOT ERROR:
//Only variables can be passed by reference in line 21
//MY NEXT STEP WOULD BE:
echo json_encode($output_encoded)
?>
答案 0 :(得分:1)
如果您修复了PDO连接字符串,则您已经直接从数据库接收UTF-8编码数据:
$db = new PDO('mysql:host=MY_HOST;dbname=MY_DB;charset=utf8', ...
^^^^
charset被称为&#34; utf8
&#34;在MySQL中,而不是UTF-8。正确设置此charset
参数后,$stmt->fetchAll(PDO::FETCH_ASSOC)
将返回UTF-8编码数据,并且根本不需要使用utf8_encode
。
至于你的特定问题,你的语法错误,应该是:
array_walk($output_arr, 'utf8_encode')
即使这样也没有帮助,因为array_walk
的回调需要通过引用来修改参数,utf8_encode
不会这样做。你可能打算这样做:
$output_encoded = array_map('utf8_encode', $output_arr);
但即使这样也不正确,因为$output_arr
是一个多维数组,在这里不能正确处理。而且,通过修复PDO连接无论如何都是不必要的。实际上,当您的数据库已经返回正确的UTF-8时,不执行此操作,它只会使您的数据混乱。