Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.03.2018, 10:48
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

Вывод сводных данных из базы в формате json
Здравствуйте, уважаемые программисты!

Делаю свои первые шаги в изучении php и в работе с базами данных.
Данные в базу отправляю так:
на странице (назовем скрипт №1):
data_surv["age"] = encodeURIComponent("Мужской");
data_surv["sex"] = encodeURIComponent("20-30 лет");

jQuery.ajax({
	type: "POST",
	url: "response.php", 
	dataType:"text",
	data:data_surv,
	success:function(response){
		$("html, body, .main").css("cursor", "default");
	},
	error:function (xhr, ajaxOptions, thrownError){
		alert(thrownError); //выводим ошибку
	}
});

в response.php (№2):
<?php
//подключаем бд
include_once("config.php");
$age = filter_var($_POST["age"],FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
$sex = filter_var($_POST["sex"],FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
if( mysql_query("INSERT INTO test_table(age, sex) VALUES('".$age."','".$sex."')") ){
	$my_id = mysql_insert_id();
	mysql_close($connecDB);
}else{
	header('HTTP/1.1 500 could not insert record!');
	exit();
}
?>


Получаю данные так:
на странице (№3):
$.ajax({
	type: "POST",
	url: "pivot_data.php",
	dataType: "json",
	success: function(data) {
		console.log(data);
	},
	error: function(error){
		console.log(JSON.stringify(error));
	}
})


в pivot_data.php (№4):
<?php
//Наша БД
include_once("config.php");

$i=0;
$data = mysql_query("SELECT * FROM test_table");
if (!$data) {
    //$result['error'] = 'Ошибка запроса: ' . mysql_error();
	//echo json_encode($result);
    exit;
}
while($row = mysql_fetch_array($data)){
	$sex[$row["sex"]]++;
	$age[$row["age"]]++;
	$i++;
}

mysql_close($connecDB);
$result['records'] = $i;
$result['chart1'] = $sex;
$result['chart2'] = $age;

echo json_encode($result);
?>


Скрипт №3 возвращает ошибку:
{  
   "readyState":4,
   "responseText":"{\"records\":4,\"chart1\":{\"%D0%96%D0%B5%D0%BD%D1%81%D0%BA%D0%B8%D0%B9\":2,\"%D0%9C%D1%83%D0%B6%D1%81%D0%BA%D0%BE%D0%B9\":2},\"chart2\":{\"25-34\":2,\"15-24\":1,\"45-54\":1},}",
   "status":200,
   "statusText":"OK"
}

Если в скрипте №3 поменять dataType на text, то все нормально возвращается.
Я думала, раз текстов выводится, то можно тогда вернуть JSON.parse(data). Но так тоже ошибка появляется:
Uncaught SyntaxError: Unexpected token  in JSON at position 0
Подскажите пожалуйста, в чем может быть ошибка?

Последний раз редактировалось Manyasha, 28.03.2018 в 10:59.
Ответить с цитированием
  #2 (permalink)  
Старый 28.03.2018, 10:59
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

Блин... 2-й день уже ищу ошибку, а проверить кодировку файла с php догадалась только сейчас
Поменяла на Utf-8 и все заработало, так что отбой паники))
Ответить с цитированием
  #3 (permalink)  
Старый 28.03.2018, 11:57
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Manyasha
$age = filter_var($_POST["age"],FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
$sex = filter_var($_POST["sex"],FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
if( mysql_query("INSERT INTO test_table(age, sex) VALUES('".$age."','".$sex."')") ){
Здесь не фильтры нужны, а экранирование, которое выполняется функцией mysql_real_escape_string. Но если только начинаем, то оригинальное расширение MySQL сразу в топку, а использовать либо mysqli, либо PDO.

Сообщение от Manyasha
while($row = mysql_fetch_array($data)){
Никогда не используйте данную функцию без второго параметра уточняющего чего требуется. Данная функция по умолчанию возвращает два набора идентичных параметров, есть ведь mysql_fetch_assoc, коли вам нужен ассоциативный набор.

Ошибка потому, что до передачи json клиенту уже был вывод в браузер.
Ответить с цитированием
  #4 (permalink)  
Старый 28.03.2018, 12:00
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Manyasha
Поменяла на Utf-8 и все заработало, так что отбой паники
А строковые данные отличные от латиницы переданные в json_encode ни в UTF вообще вернуться клиенту как null, ибо json работает только с UTF.
Ответить с цитированием
  #5 (permalink)  
Старый 29.03.2018, 10:22
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

laimas,
Спасибо за дельные замечания! Села переделывать все.
Ответить с цитированием
  #6 (permalink)  
Старый 29.03.2018, 11:44
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Все замечания отсюда.

А обязательно фильтруя ввод не стоит впадать в паранойю, база данных тоже может хранить в себе "опасные" предметы как есть также как и дамская сумочка - пилочки, ножницы, и прочие колющиеся предметы.
Ответить с цитированием
  #7 (permalink)  
Старый 29.03.2018, 11:56
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

Кажется, я все сломала
Помогите, пожалуйста, найти ошибку.
config.php (подключение к бд):
<?php
$hostname = "tra-ta-ta";
$username = "tru-tu-tu";
$password = "purum-purum"; 
$dbName = "param-param"; 

$mysqli = mysqli_connect($hostname, $username, $password, $dbName);

if (mysqli_connect_errno()) {
    printf("Не удалось подключиться: %s\n", mysqli_connect_error());
    exit();
}

mysqli_set_charset($mysqli, "utf8");
echo 'Соединение установлено... ' . mysqli_get_host_info($mysqli);

mysqli_close($mysqli);
?>


send_data.php (отправка данных):
<?php
include_once("config.php");
/*
$age = $_POST["age"];
$sex = $_POST["sex"];
$stores = $_POST["stores"];
$costs = $_POST["costs"];
*/
$age = mysqli_real_escape_string($mysqli, '25-35');
$sex = mysqli_real_escape_string($mysqli, 'Женский');
$stores = mysqli_real_escape_string($mysqli, '2 магазина');
$costs = '800';

if( mysqli_query($mysqli, "INSERT INTO L007_demo(age, sex, stores, costs) VALUES('$age','$sex','$stores','$costs')") ){
	echo 'OK';
	mysqli_close($mysqli);
}else{

	echo 'Error';
	exit();
}
?>

Файлики лежат в одной папке. Подключение проходит успешно, ошибка в отправке данных.
Если убрать mysqli_real_escape_string, все равно не работает.
Версия php, если это важно - 5.2.17.
Ответить с цитированием
  #8 (permalink)  
Старый 29.03.2018, 12:03
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

$age = mysqli_real_escape_string($mysqli, '25-35');
$sex = mysqli_real_escape_string($mysqli, 'Женский');
$stores = mysqli_real_escape_string($mysqli, '2 магазина');


и это http://fi2.php.net/manual/ru/mysqli.prepare.php, а иначе грех используя драйвер, не использовать его возможности.

Сообщение от Manyasha
Подключение проходит успешно, ошибка в отправке данных
О какой отправке речь - echo 'OK'?
Ответить с цитированием
  #9 (permalink)  
Старый 29.03.2018, 12:08
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

Сообщение от laimas Посмотреть сообщение
это
спасибо, ушла читать.
Сообщение от laimas Посмотреть сообщение
О какой отправке речь - echo 'OK'?
да, хочу добавить данные в бд.
Ответить с цитированием
  #10 (permalink)  
Старый 29.03.2018, 12:28
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Manyasha
да, хочу добавить данные в бд
Ну так ошибка вывода в чем?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывод данных из массива JSON Vincent Vega jQuery 19 04.03.2016 13:44
Способы получения данных в формате json со стороннего ресурса dmitry111 Общие вопросы Javascript 11 30.01.2013 20:58
Вывод данных из базы в цикле со ссылкой на всплывающее окно alexvb Events/DOM/Window 14 10.02.2012 16:16
обновление и вывод из базы данных sarkis AJAX и COMET 1 02.12.2011 04:37
передача формой данных в JSON формате DarkN Элементы интерфейса 3 20.01.2011 18:45