Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Вывод сводных данных из базы в формате json (https://javascript.ru/forum/server/73192-vyvod-svodnykh-dannykh-iz-bazy-v-formate-json.html)

Manyasha 28.03.2018 10:48

Вывод сводных данных из базы в формате 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-й день уже ищу ошибку, а проверить кодировку файла с php догадалась только сейчас:haha:
Поменяла на Utf-8 и все заработало, так что отбой паники))

laimas 28.03.2018 11:57

Цитата:

Сообщение от 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 клиенту уже был вывод в браузер.

laimas 28.03.2018 12:00

Цитата:

Сообщение от Manyasha
Поменяла на Utf-8 и все заработало, так что отбой паники

А строковые данные отличные от латиницы переданные в json_encode ни в UTF вообще вернуться клиенту как null, ибо json работает только с UTF.

Manyasha 29.03.2018 10:22

laimas,
Спасибо за дельные замечания! Села переделывать все.:thanks:

laimas 29.03.2018 11:44

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

А обязательно фильтруя ввод не стоит впадать в паранойю, база данных тоже может хранить в себе "опасные" предметы как есть также как и дамская сумочка - пилочки, ножницы, и прочие колющиеся предметы. ;)

Manyasha 29.03.2018 11:56

Кажется, я все сломала:haha:
Помогите, пожалуйста, найти ошибку.
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, все равно не работает.:cray:
Версия php, если это важно - 5.2.17.

laimas 29.03.2018 12:03

$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'?

Manyasha 29.03.2018 12:08

Цитата:

Сообщение от laimas (Сообщение 481772)
это

спасибо, ушла читать.
Цитата:

Сообщение от laimas (Сообщение 481772)
О какой отправке речь - echo 'OK'?

да, хочу добавить данные в бд.

laimas 29.03.2018 12:28

Цитата:

Сообщение от Manyasha
да, хочу добавить данные в бд

Ну так ошибка вывода в чем?


Часовой пояс GMT +3, время: 11:33.