как получилось, что тип данных MySQL бит php печатает юникод?
Когда мой тип данных MySQL бит(1), но при печати с помощью php json_encode
будет писать в юникоде? Службы IIS работают нормально,
но на моем выделенном сервере хостинг Apache станет юникодом. почему?
Вы можете увидеть Locating
, Locating
на Mysql тип данных битный, но напечатанный \u0001? почему?
Это мой метод получения кода get-googlemarker.php
для получения этого результата
<?php
mysql_connect("localhost", "root", "123456") or die("Could not connect");
mysql_select_db("db_gps") or die("Could not select database");
$parent_id = $_GET['mainid'];
$query = "SELECT *
FROM tbl_locate AS a
INNER JOIN
(
SELECT MainID, Max(DateTime) AS DateTime
FROM tbl_locate
GROUP BY MainID
) AS b
ON a.MainID = b.MainID
AND a.DateTime = b.DateTime
LEFT JOIN
(
SELECT b.PicData
, b.PicUploadedDateTime
, b.MainID
FROM (SELECT MainID,Max(PicUploadedDateTime) as PicUploadedDateTime
FROM tbl_picture
group by MainID
) l
JOIN tbl_picture b
ON b.MainID = l.MainID AND b.PicUploadedDateTime = l.PicUploadedDateTime
) AS c
ON a.MainID = c.MainID";
$rs = mysql_query($query);
$arr = array();
while($obj = mysql_fetch_object($rs)) {
$arr[] = $obj;
}
echo json_encode($arr);
?>
ОБНОВЛЕНО
Данные представления верны, но проблема в том, что я использую ниже javascript я не могу прочитать значение определения местоположения,
я пробовал alert
запись, но она пуста. я пробовал определять местоположение с помощью type:string
, type:bit
, type:bytes
, type:int
,
но не работает. не могу ничего показать в alert
Ext.define('GoogleMarkerModel', {
extend: 'Ext.data.Model',
fields: [
{name: 'ID', type: 'int'},
{name: 'Locating', type: 'int'},
{name: 'MainPower', type: 'int'},
{name: 'Acc', type: 'int'},
{name: 'PowerOff', type: 'int'},
{name: 'Alarm', type: 'int'},
{name: 'Speed', type: 'int'},
{name: 'Direction', type: 'int'},
{name: 'Latitude', type: 'float'},
{name: 'Longitude', type: 'float'},
{name: 'DateTime', type: 'datetime'},
{name: 'MainID', type: 'int'},
{name: 'IOState', type: 'int'},
{name: 'OilState', type: 'int'},
{name: 'PicUploadedDateTime', type: 'datetime'},
{name: 'PicData', type: 'str'}
]
});
2 answers
Представление переменной по-прежнему правильно.
Начиная с PHP 5.4, вы можете использовать опцию JSON_UNESCAPED_UNICODE
с json_encode()
.
См. http://php.net/manual/en/function.json-encode.php
Я предполагаю, что ваш IIS по умолчанию возвращает неэкранированное значение.
В Javascript вы обычно используете parseInt(\u0001)
или что-то в этом роде.
Поскольку это extjs, я не знаю для этого.
План Б:
A) Измените столбец базы данных с битового на целое число.
Б) бросить значение базы данных в php
while($obj = mysql_fetch_object($rs)) {
$obj->Locating = (int)$obj-Locating;
// or try with (string) if (int) fails
$arr[] = $obj;
}
C) просто str_replace
в выводе json:
$json = json_encode($arr);
$json = str_replace('"\u0001"', '"1"', $json);
$json = str_replace('"\u0000"', '"0"', $json);
Используйте mysqlnd (собственный драйвер) для php. Если вы используете ubuntu:
sudo apt-get install php5-mysqlnd
sudo service apache2 restart
Собственный драйвер возвращает целочисленные типы соответствующим образом.
Этот метод будет работать только для PDO (не mysqli).