Я делаю первые эксперименты с Phonegap. Я хотел бы создать приложение, которое извлекает данные с сервера MySql, но кажется, что проблема в том, что я не могу подключиться к моему дБ.
Когда я создаю веб-сайты, это легко. Я использую PHP и следующий код:
$conn = new mysqli($servername, $username, $password);
где $servername
– localhost
Но с PhoneGap localhost
не будет работать, конечно, поэтому мне нужно использовать hostname
или IP address
.
И вот проблема. У меня есть VPS с IP, а имя хоста, предположим, vps.my-domain.com . Оба не дадут мне доступ к MySql db, и я не понимаю, почему.
Следующие строки сообщают:
'SQLSTATE [HY000] [2005] Неизвестный сервер MySQL-сервера' vps.my-domain.com:3306 '(20)'
$conn = new mysqli("xxx.yy.kkk.qqq", $username, $password); $conn = new mysqli("vps.my-domain.com", $username, $password);
Мой код (HTML + Jquery + Ajax + PHP) отлично работает, когда я запускаю его на своем VPS, и я использую localhost
но он терпит неудачу, когда я использую IP address
или hostname
.
Я также пытался с mySQLjs :
MySql.Execute( "http://xxx.yy.kkk.qqq", "username", "password", "phonegap", "select * from test", function (data) { console.log(data) });
но все равно безуспешно.
Демонстрационный код, который я нашел в mySQLjs, отлично работает, поэтому я уверен, что у меня что-то отсутствует в моем соединении.
Как получить доступ к моей базе данных MySql, используя IP address
или hostname
а не использовать localhost
? Есть ли конфигурация, которая должна быть установлена на моем VPS?
РЕШИТЬ
После многих искушений я справился.
По умолчанию удаленный доступ к серверу базы данных MySQL отключен по соображениям безопасности.
1- Вам нужно отредактировать конфигурационный файл MySQL и разрешить доступ от источника, отличного от localhost.
nano /etc/mysql/my.cnf
2- измените адрес bind-address
строк на:
bind-address = your_ip_number ie bind-address = xxx.yy.qqq.tt
3- перезапуск MySQL:
/etc/init.d/mysql restart
4- с PHPMyAdmin создать пользователя, который является вашим IP-адресом, чтобы он выглядел так:
phonegap@your_ip_number
Ниже приведен код (HTML + PHP + CONFIG.XML)
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Fetch MySQL data into Phonegap app</title> <script src="jquery.min.js"></script> <script src="phonegap.js"></script> <!-- When you build the app with build.phonegap.com remove the phonegap.js file from the package you are going to upload but keep its reference --> </head> <body> HELLO WORLD! <div id="output"></div> <script> $(document).ready(function($){ var output = $('#output'); $.ajax({ url: 'http://your_domain.com/get.php', // FULL PATH! dataType: 'jsonp', jsonp: 'jsoncallback', timeout: 3000, success: function(data, status){ $.each(data, function(i,item){ var landmark = '<h1>'+item.title+'</h1>' + '<p>'+item.description+'<br>' + item.url+'</p>'; output.append(landmark); }); }, error: function(){ output.text('There was an error loading the data.'); } }); }); </script> </body>
PHP
<?php header("Access-Control-Allow-Origin: *"); $db_username = 'the_user_you_created'; $db_password = 'the_password'; $db_name = 'the_db_name'; $db_host = 'your_ip_number'; $mysqli = new mysqli($db_host, $db_username, $db_password, $db_name); if ($mysqli->connect_error) { die('Error : ('. $mysqli->connect_errno .') '. $mysqli->connect_error); } // Run the query and fetch the data. $html contains the result // Convert it to JSON and remember to add the 'jsoncallback' string echo $_GET['jsoncallback'] . '(' . json_encode($html) . ');'; ?>
CONFIG.XML Это конфигурационный файл для Phonegap
<?xml version="1.0" encoding="UTF-8" ?> <widget xmlns = "http://www.w3.org/ns/widgets" xmlns:gap = "http://phonegap.com/ns/1.0" id = "com.phonegap.example" versionCode = "10" version = "1.0.0" > <!-- versionCode is optional and Android only --> <name>Your app</name> <description> My first MySql connection with Phonegap </description> <author href="http://www.my_domain.com"> Its me </author> <!-- The two following lines make the difference! Important --> <gap:plugin name="cordova-plugin-whitelist" source="npm"/> <!-- In my esperience only * worked. Using the IP address (http://xxx.yy.qqq.tt or simply xxx.yy.qqq.tt) did not work --> <access origin="*" subdomains="true" /> </widget>
ZIP-файл HTML, XML-файл и JQuery.min.js и загрузите пакет на build.phonegap.com, используя свою учетную запись.
Надеюсь, я помог кому-то!