Перейти к содержанию
Fire Monkey от А до Я
  • 0

Подключение из приложения под Андроид к удаленной БД сайта MySQL в С++ Builder XE


b_vlad25

Вопрос

Вообще до этого писал только стандартные приложения на С++ Builder. Сейчас пробую написать приложение под Android. Есть на нашем сайте база клиентов которая постоянно обновляется.В приложении клиент введя свой лицевой счет входит в БД и получает свои данные по задолженности. В обычном приложении с этим нету проблем коннектится через ADO ODBC, а вот под Андроид как лучше и правильнее сделать не знаю. Информацию и компоненты все дают разную. Может есть какие то примеры для образца или литература Заранее спасибо...

Изменено пользователем b_vlad25
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

все всё отправляли и все работает. иначе бы не было никаких программ.

вы заголовок запроса хоть один заполнили? а там передается, что вы хотите получить, в какой кодировке, примете ли сжатие, иногда логин пароль и еще куча всего

раздел Sending a Request with Custom Headers

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_an_HTTP_Client

 

все что тут написано про TNetHttpClient ,  принципиально доступно и в THttpClient, на базе которого компонент TNetHttpClient и сделан

получаемый response тоже обладает набором заголовков, где написано, что пришло, в какой кодировке и т.д.

Ссылка на комментарий
  • 0
В 01.06.2017 в 14:43, b_vlad25 сказал:

Теперь получилась проблема с отправкой в скрипт запроса с текстом на кирилице.

Из Google Chrome отправляет нормально и ответ нормально приходит, а вот из программы никак не получается.

Все просто. Надо посмотреть на календарь и обнаружить что на дворе 2017 год. Поэтому всякие:

Цитата

mysql_set_charset('cp1251',$link);// твоя кодировка, чтобы сервер тебя  правильно понял

выжечь каленым железом.

Только UTF8 нам друг. И еще больший друг он нам если в php скрипте на это указать в начале файла:

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

Вот тогда и браузер и ваше приложение будет знать с чем имеет дело и в какой кодировке работает ваше API.

Вот накидал в блокноте код php серверной части:

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

$DBHost = "176.126.167.134";
$DBUser = "mmmmmmmmmm";
$DBPassword = "000000000000";
$DBase = "domofonkg";
$DBTable = "internetshop_users";

if (isset($_GET['id'])) {
	$zapros = $_GET['id'];
} esle {
	exit('{ "status" : "нет параметра запроса"}');
}

$DBLink = mysqli_connect($DBHost, $DBUser, $DBPassword, $DBase);
if (!$DBLink) {
  return("<html><script language='JavaScript'>alert('Ошибка соединения с базой! Пожалуйста попробуйте позже.'),history.go(-1)</script></html>");
}
$zapros = mysqli_real_escape_string($DBLink, $zapros);

$query = "SELECT mail_index, address_of_delivery, fax, country_id, url, phone, company, icq FROM $DBTable WHERE mail_index = $zapros";

if ($DBResult = mysqli_query($DBLink, $query)) {
	$ResultArray = array();
	$Index = 0;
	while($row = mysqli_fetch_array($DBResult, MYSQLI_ASSOC);) {
		$ResultArray[$Index] = $row;
		$Index++;	
	}
	$ResultJSON = json_encode($ResultArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
	echo $ResultJSON;
	mysqli_free_result($DBResult);
}
mysqli_close($DBLink);

И да, код выдает результат в JSON, дабы ваше приложение могло его по человечески обработать.

Ссылка на комментарий
  • 0
15 часов назад, b_vlad25 сказал:

Спасибо! Что то ругается Parse error: syntax error, unexpected '{' здесь


 esle {

О, это сложная и трудноуловимая ошибка ;-) Вы на Дельфи как условия пишете? Наверное вот так: if then else? А тут тоже язык программирования, и все конструкции одинаковы. Измените esle на else, и все заработает. Говорил же  что в блокноте быстро накидал, опечатка...

Ссылка на комментарий
  • 0

Спасибо, я то то  даже не смотрел на оператор что буквы не так стоят.

А если запрос делать из браузера http://domofonkg.com/3.php?id=г. Бишкек, ул. Токтогула, д. 191, кв. 5, под. 1, то в JSON  отобразится результат в браузере? . До этого выдавало ошибку json_encode() expects parameter 2 to be long, string given in, заменил JSON_PRETTY_PRINT на 128. теперь выдает [ ] и все

Изменено пользователем b_vlad25
Ссылка на комментарий
  • 0
33 минуты назад, b_vlad25 сказал:

Спасибо, я то то  даже не смотрел на оператор что буквы не так стоят.

А если запрос делать из браузера http://domofonkg.com/3.php?id=г. Бишкек, ул. Токтогула, д. 191, кв. 5, под. 1, то в JSON  отобразится результат в браузере? . До этого выдавало ошибку json_encode() expects parameter 2 to be long, string given in, заменил JSON_PRETTY_PRINT на 128. теперь выдает [ ] и все

Какая версия php у вас на сервере?

И судя по вашему SQL запросу (WHERE mail_index = $zapros), вы ищете данные по почтовому индексу, откуда тогда "id=г. Бишкек, ул. Токтогула, д. 191, кв. 5, под. 1". Волшебство может и случается, но не в программировании. SQL серверу вы должны дать четкие критерии поиска. Вы точно понимаете что хранится в таблице internetshop_users и как оттуда получить данные?

Ссылка на комментарий
  • 0
  • Сервер: 176.126.167.134 via TCP/IP
  • Тип сервера: MariaDB
  • Версия сервера: 5.5.32-MariaDB-1~wheezy - mariadb.org binary distribution
  • Версия протокола: 10
  • Кодировка сервера: UTF-8 Unicode (utf8)

Это у меня первый по mail_index, а второй $query = "SELECT mail_index, address_of_delivery, fax, country_id, url, phone, company, icq FROM $DBTable WHERE address_of_delivery = '$zapros'";

Изменено пользователем b_vlad25
Ссылка на комментарий
  • 0

PHP один из самых простых в освоении языков. Обычный интерпретатор, т.е. в большинстве случаев, выполняет код строчка за строчкой. Нет привычной отладки (хотя может и есть в каких то средах, но я программирую на php в редакторе FAR Manager), но вы всегда можете вывести значение переменной функциями echo($Переменная) , print_r($Массив) и он высыпет все вам на экран (или в консоль).

Запускать скрипт php можно двумя способами

  1. Запуск в контексте веб-сервера: Вы обращаетесь к веб серверу по адресу http://www.мойсайт.ru/мой_скрипт.php - веб сервер запускает исполняемый файл php и скармливает ему ваш скрипт и параметы переданные в запросе (Get, post). Эти параметры можно получить из специальных массивов $_GET и $_POST.
  2. Запуск ручками: для отладки и всякого другого, вы можете запустить ваш скрипт в консоли (коммандной строке) под любой платформой (линукс, винда...):  " php /home/test001.php". 

Просто попытайтесь освоить язык, он простой, нужно два часа чтоб освоить язык до уровня написания вышеприведенного мной скрипта.

По теме - если у вас выводит [], то значит узнать что у вас не так:

Выясните сколько строк возвращает запрос к sql серверу echo "Кол-во строк=".mysqli_num_rows($DBResult);

Выводите построчно массивы c строками из запроса print_r($row); echo "<br/>\n"; 

"<br/>\n" - это печатам для перевода на новую строку в браузере или консоли, чтоб не было каши.

Ну и так далее... Любая непонятная функция, становится понятной вот так: в браузере, в адресной строке печатаем php mysqli_real_escape_string, и увидите хорошее описание с примерами на родном для вас языке

Ссылка на комментарий
  • 0
[{"mail_index":"000001","address_of_delivery":"?. ??????, ??. ?????????, ?. 191, ??. 5, ???. 1","fax":"????????+","country_id":"35","url":"0","phone":"0","company":"?????????","icq":"2014-10-14"}]

Можно ли отображать только данные без заголовков? Кириллица кстати из таблицы не отображается.

И как быть с запросом на кириллице. В таблице есть текст на кириллице и нужно искать по нему.

Изменено пользователем b_vlad25
Ссылка на комментарий
  • 0
В 12.05.2017 в 10:53, krapotkin сказал:

в очередной раз. прямое подключение к БД на мобильных системах - неправильно

нужно иметь "где-то там" промежуточный сервер. на php или еще какой, может Datasnap

на нем будет подключение к БД, а запросы и ответы к нему и обратно будут ходить по HTTP

Подскажите, пожалуйста, где получить дополнительную информацию о том, что "прямое подключение к БД на мобильных системах - неправильно" . Или тезисно - чем отличается подключение к удаленному серверу в интернете мобильного устройства от стационарного?

Ссылка на комментарий
  • 0

Рекомендую ознакомится с идеологией REST, ее целями и задачами.
В целом прямое подключение к БД неправильно не только для мобильных приложений, а для десктопных тоже. Давая прямой доступ к БД для выполнения sql-запросов, вы даете злоумышленникам большие возможности по произвольному доступу к данным.
А используя промежуточный слой в виде бэка, вы как минимум скрываете тип используемой БД, структуру таблиц.

Ссылка на комментарий
  • 0

Тезисно. Прямое подключение разрушается, когда соединение разрывается. А в мобильной сети оно постоянно может отключаться и включаться, переключаться между WiFi и 4G. Установление подключения к БД тогда требуется каждый раз, как происходит такой разрыв. У HTTP запрос проходит разово. Запросили - ответил, или нет. Соединение не требуется. Не прошел запрос, ничего, повторим.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...