Вывод сводных данных из базы в формате 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 Подскажите пожалуйста, в чем может быть ошибка? |
Блин... 2-й день уже ищу ошибку, а проверить кодировку файла с php догадалась только сейчас:haha:
Поменяла на Utf-8 и все заработало, так что отбой паники)) |
Цитата:
Цитата:
Ошибка потому, что до передачи json клиенту уже был вывод в браузер. |
Цитата:
|
laimas,
Спасибо за дельные замечания! Села переделывать все.:thanks: |
Все замечания отсюда.
А обязательно фильтруя ввод не стоит впадать в паранойю, база данных тоже может хранить в себе "опасные" предметы как есть также как и дамская сумочка - пилочки, ножницы, и прочие колющиеся предметы. ;) |
Кажется, я все сломала: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. |
$sex = mysqli_real_escape_string($mysqli, 'Женский'); $stores = mysqli_real_escape_string($mysqli, '2 магазина'); и это http://fi2.php.net/manual/ru/mysqli.prepare.php, а иначе грех используя драйвер, не использовать его возможности. Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
laimas,
не понимаю... $stmt = mysqli_prepare($mysqli, "INSERT INTO L007_demo(age, sex, stores, costs) VALUES (?, ?, ?, ?)"); printf(mysqli_stmt_param_count($stmt)); if ( false===$stmt ) { die('prepare() failed: ' . mysqli_error ($mysqli)); } $bp = mysqli_stmt_bind_param($stmt, 'sssd', $age, $sex, $stores, $costs); if ( false===$bp ) { die('bind_param() failed: ' . mysqli_error ($mysqli)); } $exe = mysqli_stmt_execute($stmt); if ( false===$exe ) { die('execute() failed: ' . mysqli_error ($mysqli)); } printf("%d строка вставлена.\n", mysqli_stmt_affected_rows($stmt)); mysqli_stmt_close($stmt); выводит сообщение "0 строка вставлена." UPD Все закомментила, оставила только include_once("config.php"); $age = '25-35'; $sex = 'female'; $stores = '2 stor'; $costs = 800; $tt = mysqli_query($mysqli, "INSERT INTO L007_demo(age, sex, stores, costs) VALUES('$age','$sex','$stores','$costs')"); echo mysqli_error($mysqli); ничего не вывелось. |
:-? в config.php осталась mysqli_close($mysqli);.
Убрала и все заработало вроде! laimas, спасибо Вам большое за помощь и советы, пошла дальше ковырять.:write: |
Значит есть ошибки.
-- -- Структура таблицы `L007_demo` -- CREATE TABLE `L007_demo` ( `id` int(11) NOT NULL, `age` varchar(32) NOT NULL, `sex` varchar(32) NOT NULL, `stores` varchar(32) NOT NULL, `costs` smallint(5) UNSIGNED NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- Индексы таблицы `L007_demo` -- ALTER TABLE `L007_demo` ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT для сохранённых таблиц -- -- -- AUTO_INCREMENT для таблицы `L007_demo` -- ALTER TABLE `L007_demo` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; <? $mysqli = mysqli_connect('localhost', 'root', '', 'test'); $stmt = mysqli_prepare($mysqli, "INSERT INTO L007_demo (age, sex, stores, costs) VALUES (?, ?, ?, ?)"); if($stmt) { $age = '25-35'; $sex = 'female'; $stores = '2 stor'; $costs = 800; mysqli_stmt_bind_param($stmt, 'sssd', $age, $sex, $stores, $costs); mysqli_stmt_execute($stmt); echo mysqli_stmt_affected_rows($stmt) . '<br><pre>'; $q = mysqli_query($mysqli, 'SELECT * FROM L007_demo'); print_r(mysqli_fetch_assoc($q)); } else exit('error: ' . mysqli_error ($mysqli)); ?> Результат 1 Array ( [id] => 1 [age] => 25-35 [sex] => female [stores] => 2 stor [costs] => 800 ) |
Цитата:
|
laimas, Спасибо еще раз!:thanks: Все работает, в базу записывается, пошла теперь вывод из нее переделывать.
Плюсик, к сожалению сейчас поставить не могу, говорят, мало спасибов пораздавала еще)) |
Часовой пояс GMT +3, время: 01:48. |