Php 只有变量可以通过引用传递-array\u walk
我正在尝试从DB表构建JSON,我需要在JSON_encode()之前使用utf8_encode()。我不同意这个错误。 这是一个代码。我做错了什么Php 只有变量可以通过引用传递-array\u walk,php,json,utf-8,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
<?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)
?>
如果要修复PDO连接字符串,您已经直接从数据库接收到UTF-8编码数据:
$db = new PDO('mysql:host=MY_HOST;dbname=MY_DB;charset=utf8', ...
^^^^
该字符集在MySQL中称为“utf8
”,而不是UTF-8。正确设置此字符集
参数后,$stmt->fetchAll(PDO::FETCH_ASSOC)
将返回UTF-8编码数据,根本不需要使用utf8_编码
至于您的特定问题,您的语法错误,应该是:
array_walk($output_arr, 'utf8_encode')
即使这样也不会有帮助,因为array\u walk
的回调需要通过引用修改参数,而utf8\u encode
不需要这样做。您可能打算这样做:
$output_encoded = array_map('utf8_encode', $output_arr);
但即使这样也不正确,因为
$output\u arr
是一个多维数组,在这里无法正确处理。同样,通过修复PDO连接,这是不必要的。事实上,当您的数据库已经返回正确的UTF-8时,不要这样做,它只会篡改您的数据。array\u walk
return boolean没有人注意到。很好的解释deceze。第一种方法不起作用。字符串在第一个非ASCII字母上被剥离,即使在将字符集更改为utf8之后也是如此。稍后我将检查第二种方法。谢谢