Emoji из Angularjs $ http в PHP json_decode и хранить в mySQL - PullRequest
0 голосов
/ 24 мая 2018

Итак, я пытаюсь сохранить смайлики в своей базе данных и вернуть их в свое приложение.Я собрал небольшой мессенджер с ionic v1 и все работает отлично.Я только хочу правильно хранить смайлики и показывать их в приложении.Вся моя база данных, таблицы и столбцы настроены на utf8mb4, так что я знаю, что это хорошо.Когда я отправляю его с $http на мой php, он также выглядит хорошо: {"from_account_id":"xxxx","for_account_id":"xxxx","message":"?"}: Но когда я печатаю его в php, это выглядит так: {"from_account_id":"106191","for_account_id":"989014","message":"đ˝"} и в моем mysql везде я помещаю смайлик, который он показывает?.Что еще я могу сделать?Я также установил заголовок в моем php UTF_8.Я знаю, что было много вопросов об этом, но я следовал за большинством из них, и это все еще не решило мою проблему.

Мой php, где я храню сообщение:

<?php
header('Content-Type: text/html; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
include_once 'config.php';

$data = file_get_contents("php://input");
$data = json_decode($data, true);

try {
    $stmt = $dbh->prepare("INSERT INTO `messages` (`message_id`, `from_account_id`, `for_account_id`, `date_read`, `message`)
      VALUES (NULL, :from_account_id, :for_account_id, NULL, :message)");
    $stmt->bindValue(':from_account_id', $data['from_account_id']);
    $stmt->bindValue(':for_account_id', $data['for_account_id']);
    $stmt->bindValue(':message', $data['message']);
    $stmt->execute();
  } catch (PDOException $e) {
          throw $e;
  }
  echo 'Success';

?>

Моя AngularJS функция, куда я отправляю сообщение:

  $scope.sendMessage = function(for_account_id, message){
    if(for_account_id != null && message != null){
    $http({
      method: 'post',
      url: 'myurl',
      data: {
      from_account_id: $rootScope.unique_id,
      for_account_id: for_account_id,
      message: message,
      },
      headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    }).then(function successCallback(data){
      $scope.thisMessage = null;
      $scope.getMessages();
      $rootScope.webSocket.send($stateParams.chatId + "|" + $rootScope.unique_id  + "|" + 'newMessage');
      $scope.markAsRead();
    })
  }
  }

И это мое соединение с базой данных:

<?php
$hostname='myhost';
$username='myuser';
$password='mypassword';

$options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES utf8'); 

try {
    $dbh = new PDO("mysql:host=$hostname;dbname=mydbname;charset=utf8mb4",$username,$password, $options);
    $dbh->query ('SET NAMES utf8');
    $dbh->query ('SET CHARACTER_SET utf8_unicode_ci');
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
      echo $e->getMessage();
    }
?>

Любые советы или идеи, что я скучаю?

1 Ответ

0 голосов
/ 25 мая 2018

Хорошо, я исправил проблему.То, как я это сделал, возможно, не самое лучшее, но оно работает.Таким образом, хранение юникодов в базе данных было таким простым:

  1. Я изменил header в файле, куда я вставляю данные:

    header('Content-Type: application/json; charset=utf-8');

  2. Я снова кодирую сообщение в json, вставляя его так:

    $stmt->bindValue(':message', json_encode($data['message']));

  3. Перед тем, как датьВ ответ на мое приложение снова установите заголовок:

    header('Content-Type: application/json; charset=utf-8');

Мой код теперь выглядит так:

<?php
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
include_once 'config.php';

$data = file_get_contents("php://input");
$data = json_decode($data, true);

try {
    $stmt = $dbh->prepare("INSERT INTO `messages` (`message_id`, `from_account_id`, `for_account_id`, `date_read`, `message`)
      VALUES (NULL, :from_account_id, :for_account_id, NULL, :message)");
    $stmt->bindValue(':from_account_id', $data['from_account_id']);
    $stmt->bindValue(':for_account_id', $data['for_account_id']);
    $stmt->bindValue(':message', json_encode($data['message']));
    $stmt->execute();
  } catch (PDOException $e) {
    header('Content-Type: text/html; charset=utf-8');
          throw $e;
  }
  header('Content-Type: text/html; charset=utf-8');
  echo 'Success';

?>

Итак, эта проблемабыл исправлен, и Unicodes были сохранены в моей БД.

Затем я снова оказался в неловкой ситуации, поскольку при получении данных из mysql и кодировании их в json при отправке в мое приложение мое приложение не могло возвращать юникоды специальным символам, даже если ясвязывал его с ng-bind-html и использовал $sce.trustAsHtml().Обычно я просто отправлял свой результат запроса как encoded json, но он не работал, как я сказал.Так что я сделал что-то вроде этого:

<?php
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *'); 
header('Access-Control-Allow-Methods: POST, GET');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
include_once 'config.php';

$data = file_get_contents("php://input");
$data = json_decode($data, true);

try {
  $stmt = $dbh->prepare("SELECT * from messages WHERE (from_account_id = :unique_id AND for_account_id = :user_2) OR (from_account_id = :user_2 AND for_account_id = :unique_id)");
  $stmt->bindValue(':unique_id', $data['user_1']);
  $stmt->bindValue(':user_2', $data['user_2']);
  $stmt->execute();
  } catch (PDOException $e) {
          throw $e;
      }

  $rows = $stmt->rowCount();
  $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

  if ($rows > 0){
    $i = 0;
    echo "[";
    foreach ($result as $key => $value){
      $i++;
      echo "{";
      echo '"message_id"' . ":" . '"' .$value['message_id']. '"' .", ";
      echo '"from_account_id"' . ":" . '"' .$value['from_account_id']. '"' .", ";
      echo '"for_account_id"' . ":". '"' .$value['for_account_id']. '"' .", ";
      echo '"date_sent"' . ":" . '"' .$value['date_sent']. '"' .", ";
      echo '"date_read"' . ":" . '"' .$value['date_read']. '"' .", ";
      echo '"message"' . ":" . '"' .str_replace("\n", "</br>", json_decode($value['message'])). '"' ;
      echo "}";
      if($i != $rows){
        echo ",";
      }
      if($i == $rows){
        echo "]";
      }
      echo "\n";
    }
    exit;
  }
  else {
    echo 'Something went wrong';
    exit;
  }

?>

Отправка декодированной json в строке, которую мой angularjs получает, поскольку реальный json, созданный мной, был решением.

Я добавилОтвет на этот вопрос, как, возможно, кто-то окажется в той же беде, и это будет полезно.

...