Есть страница chat.html на которой есть поле ввода сообщения, кнопка отправки и поле вывода(таблица).До перехода на эту страницу пользователь авторизуется на другой(имя сохраняется сессией) и на chat.html после введения пользователем сообщения и нажатия кнопки отправки в этой таблице должно выводиться время, имя и само сообщение.
Вот AJAX
на отправку самого сообщения в php
и если все прошло успешно то идет вывод на экран.
$(document).ready(function() {
$('#easyForm').submit(function() {
var text = $('#text').val();
$.ajax({
type: 'POST',
url: 'php/chat_script.php',
data: {
message: text
},
success: function(arr) {
$('#time').html(arr.time);
$('#name').html(arr.user);
$('#message').html(arr.message);
}
});
return false;
});
});
table#messages {
width: 490px;
height: 260px;
background: #fffecd;
border: none;
}
td#time,
td#name {
width: 100px;
}
td#name {
font-weight: bold;
}
div#inputs {
width: 495px;
}
form#text_submit {
display: inline-flex;
align-items: flex-start;
}
input#text {
width: 370px;
height: 30px;
margin-top: 20px;
background: #fffecd;
font-family: 'Montserrat';
font-size: 16px;
border: none;
align-self: flex-start;
}
input#submit {
padding: 0;
margin-left: 21px;
margin-top: 21px;
height: 30px;
width: 100px;
background: #635960;
border: none;
color: white;
font-family: 'Montserrat';
font-size: 16px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="inputs">
<table id="messages">
<tr>
<td id="time"></td>
<td id="name"></td>
<td id="message"></td>
</tr>
</table>
<form method="POST" id="easyForm">
<input type="text" name="text" id="text">
<input type="submit" value="Send" id="submit">
</form>
</div>
Вот php
, в AJAX
данные возвращаются в виде json строки. Подскажите, что я не так делаю?
<?php
session_start();
$user = $_SESSION['user'];
$message = $_POST['message'];
$time = date('H:i:s');
$file = "../data/messages.json";
$json_content = json_decode(file_get_contents($file), true);
$content = array();
if(is_array($json_content)) {
$content = $json_content;
}
if (!empty($message)) {
$content[] = array("time" => $time, "user" => $user, "message" => $message);
file_put_contents($file, json_encode($content, JSON_PRETTY_PRINT),FILE_APPEND);
}
echo json_encode($content);
?>
Ошибка
VM45:1 Uncaught SyntaxError: Unexpected token u in JSON at position 18
at Function.parse [as parseJSON] (<anonymous>)
at Object.success (message.js:14)
at i (jquery.min.js:2)
at Object.fireWith [as resolveWith] (jquery.min.js:2)
at A (jquery.min.js:4)
at XMLHttpRequest.<anonymous> (jquery.min.js:4)
Ошибка при JSON.parse
Uncaught SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
at Object.success (message.js:18)
at i (jquery.min.js:2)
at Object.fireWith [as resolveWith] (jquery.min.js:2)
at A (jquery.min.js:4)
at XMLHttpRequest.<anonymous> (jquery.min.js:4)
success @ message.js:18
i @ jquery.min.js:2
fireWith @ jquery.min.js:2
A @ jquery.min.js:4
(anonymous) @ jquery.min.js:4
Cодержание $content - {"time":"13:23:09","user":"qwe","message":"qwe"}
У вас ответ строка json
а вы пытаетесь обработать его как object
.
До обработки надо сделать парсинг:
Пример кода:
var json = '{"result":true,"count":1}';
obj = JSON.parse(json);
console.log(obj.count);
А это парсинг с помощью jQuery
։
var json = '{"result":true,"count":8567}';
obj = $.parseJSON(json);
console.log(obj.count);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Парсинг вашего полученного ответа:
var json = '{"time":"13:23:09","user":"qwe","message":"qwe"}';
obj = JSON.parse(json);
console.log(obj.user);
С вашим кодом будет так:
$(document).ready(function() {
$('#easyForm').submit(function() {
var text = $('#text').val();
$.ajax({
type: 'POST',
url: 'php/chat_script.php',
data: {
message: text
},
success: function(arr) {
arr = JSON.parse(arr);
$('#time').html(arr.time);
$('#name').html(arr.user);
$('#message').html(arr.message);
}
});
return false;
});
});
Измените кусок вашего html
таким образом:
<div id="inputs">
<table id="messages">
<tr class="mess_hide">
<td class="time"></td>
<td class="name"></td>
<td class="message"></td>
</tr>
</table>
<form method="POST" id="easyForm">
<input type="text" name="text" id="text">
<input type="submit" value="Send" id="submit">
</form>
</div>
Для класса mess_hide
добавьте css
՝․mess_hide{display: none;}՝.
А success
в ajax
запросе измените вот так:
$('#messages').append($('.mess_hide').clone().addClass('mess_tmp').removeClass('mess_hide'));
$('.mess_tmp>.time').html(arr.time);
$('.mess_tmp>.name').html(arr.user);
$('.mess_tmp>.message').html(arr.message);
$('.mess_tmp').removeClass('mess_tmp');
Пример:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
var json = '{"time":"13:23:09","user":"qwe","message":"qwe"}';
arr = JSON.parse(json);
$(document).ready(function(){
$('.test').click(function(){
$('#messages').append($('.mess_hide').clone().addClass('mess_tmp').removeClass('mess_hide'));
$('.mess_tmp>.time').html(arr.time);
$('.mess_tmp>.name').html(arr.user);
$('.mess_tmp>.message').html(arr.message);
$('.mess_tmp').removeClass('mess_tmp');
});
});
</script>
<div id="inputs">
<table id="messages">
<tr class="mess_hide">
<td class="time"></td>
<td class="name"></td>
<td class="message"></td>
</tr>
</table>
<button class="test">test</button>
</div>
Ваш скрипт не знает что он будет получать если вы возвращаете json, то вам необходмо в ajax({}) добавить dataType: "json"
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>
$.ajax({
type: 'POST',
url: 'php/chat_script.php',
data: {
message: text
},
dataType:"json",
success: function(arr) {
$('#time').html(arr.time);
$('#name').html(arr.user);
$('#message').html(arr.message);
}
});
Виртуальный выделенный сервер (VDS) становится отличным выбором
Kуда вставить default, что бы если не передаётся фото по умолчанию, создавалось одно фото с kind: 'thumbnail' и определённым url ?
Как подключить react к серверу php ,сейчас при build(npm run build) и подключении к php indexhtml ,видна только html страница,а скрипт не запускается ,а запускается...