只有变量可以通过引用传递 - array_walk

时间:2014-05-13 09:41:18

标签: php json utf-8

我正在尝试从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)
?>

1 个答案:

答案 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时,执行此操作,它只会使您的数据混乱。