【问题标题】:Only variables can be passed by reference - array_walk只有变量可以通过引用传递 - array_walk
【发布时间】:2014-05-13 09:41:17
【问题描述】:

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

【问题讨论】:

  • array_walk 返回布尔值

标签: php json utf-8


【解决方案1】:

如果您修复您的 PDO 连接字符串,您已经直接从数据库接收 UTF-8 编码数据:

$db = new PDO('mysql:host=MY_HOST;dbname=MY_DB;charset=utf8', ...
                                                       ^^^^

该字符集在 MySQL 中称为“utf8”,而不是 UTF-8。正确设置此 charset 参数后,$stmt-&gt;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 时,不要这样做,它只会弄乱您的数据。

【讨论】:

  • 奇怪的是没有人注意。很好的解释 deceze。
  • 第一种方法不起作用。字符串在第一个非 ASCII 字母上被剥离,即使在将字符集更改为 utf8 之后也是如此。我稍后会检查第二种方法。谢谢。
猜你喜欢
  • 2011-02-27
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 2011-05-27
  • 2021-07-11
相关资源
最近更新 更多