10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196

Работа из приложения Android с БД MySQL на хостинге

07.05.2023, 11:06. Показов 2730. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.

В общем бьюсь уже три дня над следующей проблемой и никак не выходит камушек гранитный. Есть написанное мной веб-приложение, соответственно, чтобы к нему подключиться необходимо ввести логин и пароль, которые хранятся в БД MySQL. Появилась такая необходимость заходить в это приложение через мобильное устройство на базе ОС Android, ранее разработкой в данной ОС никогда не занимался. Казалось бы ничего сложного, но упорно не получается подключиться к БД. Перепробовал уже 4 или 5 способов, включая RestAPI, volley и ещё какие-то, в том числе этот, код которого выложил. Чтобы доступ к приложению был в интернете расположил свое веб-приложение на хостинге beget.com. Соответственно с любого браузера всё работает.
Точной причины проблемы не понимаю, но есть предположение, что виной хостинг и необходимо делать дополнительные настройки, возможно я ошибаюсь. Точно помню, что при подключении через библиотеку volley в Logcat Android Studio была ошибка 403, при подключении методом RestApi не находился файл java.io.FileNotFoundException, с этим методом вообще ошибок вроде как нет, возможно он не работает. Проверять все подключения локально или как на примерах смысла нет, есть уже готовое решение в конкретном домене, к которому необходимо получить доступ. Нужен совет или верные мысли, как решить проблему, можно совет на надежную и простую библиотеку для этих целей на текущий момент. И вообще может ли быть проблема с хостингом? Мне почему-то кажется, что никаких проблем быть не должно, что же я тогда не догоняю и делаю не так?

MainActivity.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.example.conndb;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
    private EditText usernameField,passwordField;
    private TextView status,role,method;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        usernameField = (EditText)findViewById(R.id.editText1);
        passwordField = (EditText)findViewById(R.id.editText2);
 
        status = (TextView)findViewById(R.id.textView6);
        role = (TextView)findViewById(R.id.textView7);
        method = (TextView)findViewById(R.id.textView9);
    }
 
 
 
    public void login(View view){
        String username = usernameField.getText().toString();
        String password = passwordField.getText().toString();
        method.setText("Get Method");
        new SigninActivity(this,status,role,0).execute(username,password);
 
    }
 
    public void loginPost(View view){
        String username = usernameField.getText().toString();
        String password = passwordField.getText().toString();
        method.setText("Post Method");
        new SigninActivity(this,status,role,1).execute(username,password);
    }
}
SigninActivity.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package com.example.conndb;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
 
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
 
import android.content.Context;
import android.os.AsyncTask;
import android.widget.TextView;
 
public class SigninActivity extends AsyncTask{
    private TextView statusField,roleField;
    private Context context;
    private int byGetOrPost = 0;
 
    //flag 0 means get and 1 means post.(By default it is get.)
    public SigninActivity(Context context,TextView statusField,TextView roleField,int flag) {
        this.context = context;
        this.statusField = statusField;
        this.roleField = roleField;
        byGetOrPost = flag;
    }
 
    @Override
    protected Object doInBackground(Object[] objects) {
        return null;
    }
 
    protected void onPreExecute(){
    }
 
    protected String doInBackground(String... arg0) {
        if(byGetOrPost == 0){ //means by Get Method
 
            try{
                String username = (String)arg0[0];
                String password = (String)arg0[1];
                String link = "http://namedomain.beget.tech/enter.php?username="+username+"& password="+password;
 
                URL url = new URL(link);
                HttpClient client = new DefaultHttpClient();
                HttpGet request = new HttpGet();
                request.setURI(new URI(link));
                HttpResponse response = client.execute(request);
                BufferedReader in = new BufferedReader(new
                        InputStreamReader(response.getEntity().getContent()));
 
                StringBuffer sb = new StringBuffer("");
                String line="";
 
                while ((line = in.readLine()) != null) {
                    sb.append(line);
                    break;
                }
 
                in.close();
                return sb.toString();
            } catch(Exception e){
                return new String("Exception: " + e.getMessage());
            }
        } else{
            try{
                String username = (String)arg0[0];
                String password = (String)arg0[1];
 
                String link="http://namedomain.beget.tech/enter.php";
                String data  = URLEncoder.encode("username", "UTF-8") + "=" +
                        URLEncoder.encode(username, "UTF-8");
                data += "&" + URLEncoder.encode("password", "UTF-8") + "=" +
                        URLEncoder.encode(password, "UTF-8");
 
                URL url = new URL(link);
                URLConnection conn = url.openConnection();
 
                conn.setDoOutput(true);
                OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
 
                wr.write( data );
                wr.flush();
 
                BufferedReader reader = new BufferedReader(new
                        InputStreamReader(conn.getInputStream()));
 
                StringBuilder sb = new StringBuilder();
                String line = null;
 
                // Read Server Response
                while((line = reader.readLine()) != null) {
                    sb.append(line);
                    break;
                }
 
                return sb.toString();
            } catch(Exception e){
                return new String("Exception: " + e.getMessage());
            }
        }
    }
 
    protected void onPostExecute(String result){
        this.statusField.setText("Login Successful");
        this.roleField.setText(result);
    }
}
AndroidManifest.xml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
 
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher_background"
        android:label="@string/app_name"
        android:theme="@style/Theme.ConnDB" >
 
        <activity
            android:name="com.example.conndb.MainActivity"
            android:label="@string/app_name"
            android:exported="true">
 
 
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
 
        </activity>
 
    </application>
</manifest>
ActivityMain.xml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
 
    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/editText1"
        android:layout_below="@+id/editText1"
        android:layout_marginTop="25dp"
        android:ems="10"
        android:inputType="textPassword" >
    </EditText>
 
    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="44dp"
        android:ems="10" >
 
        <requestFocus android:layout_width="wrap_content" />
 
    </EditText>
 
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/editText1"
        android:layout_alignParentLeft="true"
        android:text="@string/Username" />
 
    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="@string/App"
        android:textAppearance="?android:attr/textAppearanceLarge" />
 
    <TextView
        android:id="@+id/textView7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/textView5"
        android:layout_alignLeft="@+id/textView6"
        android:text="@string/Role"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textSize="10sp" />
 
    <TextView
        android:id="@+id/textView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView6"
        android:layout_marginTop="27dp"
        android:layout_toLeftOf="@+id/editText1"
        android:text="@string/LoginRole" />
    <TextView
        android:id="@+id/textView8"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textView6"
        android:layout_alignLeft="@+id/textView5"
        android:layout_marginBottom="27dp"
        android:text="@string/method" />
 
    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView8"
        android:layout_below="@+id/button1"
        android:layout_marginTop="86dp"
        android:text="@string/LoginStatus" />
 
 
    <TextView
        android:id="@+id/textView6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/textView4"
        android:layout_centerHorizontal="true"
        android:text="@string/Status"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textSize="10sp" />
 
    <TextView
        android:id="@+id/textView9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/textView8"
        android:layout_alignLeft="@+id/textView6"
        android:text="@string/Choose"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textSize="10sp" />
 
    <Button
        android:id="@+id/button2"
        android:layout_width="147dp"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/textView6"
        android:onClick="loginPost"
        android:text="@string/LoginPost" />
 
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button2"
        android:layout_alignBottom="@+id/button2"
        android:layout_alignLeft="@+id/textView2"
        android:onClick="login"
        android:text="@string/LoginGet" />
 
    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/editText2"
        android:layout_alignBottom="@+id/editText2"
        android:layout_alignParentLeft="true"
        android:text="@string/Password" />
 
</RelativeLayout>
build.gradle

plugins {
id 'com.android.application'
}

android {
namespace 'com.example.conndb'
compileSdk 33
useLibrary 'org.apache.http.legacy'

packagingOptions {
pickFirst 'META-INF/*'
}
defaultConfig {
applicationId "com.example.conndb"
minSdk 22
targetSdk 33
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner "
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

dependencies {

implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1. 9.0'
implementation 'androidx.constraintlayout:constraintlay out:2.1.4'
implementation 'org.apache.httpcomponents:httpcore:4.4. 15'
implementation 'org.apache.httpcomponents:httpclient:4. 5'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}

Ну и небольшой лог, касаемый работы данного способа из LogCat:

2023-05-07 16:28:28.686 12947-12973 EGL_emulation com.example.conndb D app_time_stats: avg=500.30ms min=499.77ms max=500.82ms count=2
2023-05-07 16:28:30.186 12947-12973 EGL_emulation com.example.conndb D app_time_stats: avg=27.08ms min=12.70ms max=499.67ms count=55
2023-05-07 16:28:31.686 12947-12973 EGL_emulation com.example.conndb D app_time_stats: avg=499.89ms min=499.04ms max=500.32ms count=3
2023-05-07 16:28:32.702 12947-12973 EGL_emulation com.example.conndb D app_time_stats: avg=507.81ms min=502.68ms max=512.95ms count=2
2023-05-07 16:28:33.703 12947-12973 EGL_emulation com.example.conndb D app_time_stats: avg=500.20ms min=498.07ms max=502.33ms count=2
2023-05-07 16:28:34.771 12947-12947 OnBackInvokedCallback com.example.conndb W OnBackInvokedCallback is not enabled for the application.
Set 'android:enableOnBackInvokedCallback="tr ue"' in the application manifest.
2023-05-07 16:28:34.774 12947-12973 EGL_emulation com.example.conndb D app_time_stats: avg=356.85ms min=71.74ms max=500.11ms count=3
2023-05-07 16:28:34.784 12947-12947 InsetsController com.example.conndb D show(ime(), fromIme=true)
2023-05-07 16:28:35.787 12947-12973 EGL_emulation com.example.conndb D app_time_stats: avg=45.76ms min=14.77ms max=499.37ms count=22
2023-05-07 16:28:37.286 12947-12973 EGL_emulation com.example.conndb D app_time_stats: avg=43.92ms min=14.61ms max=499.74ms count=34
2023-05-07 16:28:38.291 12947-12973 EGL_emulation com.example.conndb D app_time_stats: avg=502.35ms min=498.15ms max=506.55ms count=2
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.05.2023, 11:06
Ответы с готовыми решениями:

Mysql для android приложения на unity3d
Здравствуйте , хочу спросить совет у более опытных юнити разработчиков Передо мной стоит задача создать такую систему , где корзиной с...

Подключение к MySql из консольного приложения (Android приложение C# Shell из Play Market)
Я пока что практикуюсь в базах MySql, и хотел написать консольное приложение, цель которого - просто подключиться к базе и выполнить...

Работа приложения на C# с MySQL
Есть база MySQL на хостинге infobox. Не большое приложение на Андроид работает с базой через PHP скрипты. Настало время писать приложение...

14
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
07.05.2023, 14:12
Я не спец в андроид, сам запарился с этими активностями и потоками, но посмотрите что происходит на сервере в момент попытки подключения с клиента андроид.
Эта попытка вообще происходит? Сделайте вывод каких-то переменных в скрипте enter.php через эхо, print_r ну и включеите опцию отображения всех ошибок в php.ini

The java.io.FileNotFoundException is a checked exception that occurs when a file or resource specified by a given path is not found. In the provided code snippet, the exception can occur in the following line:

HttpResponse response = client.execute(request);

This exception indicates that the server returned a response with a status code indicating that the requested resource (in this case, a file) was not found. It could be due to various reasons, such as an incorrect URL or the server not hosting the file at the specified location.

To troubleshoot this issue, you can perform the following steps:

Verify the URL: Double-check the URL http://namedomain.beget.tech/enter.php?username="+username+"& password="+password to ensure it is correct. Make sure it points to the correct file or resource on the server.

Test the URL in a web browser: Manually try accessing the URL in a web browser to see if it returns the expected content. If it doesn't and shows a 404 error or a similar message, it confirms that the file or resource is not available at the specified location.

Check server configuration: If you have control over the server hosting the file, ensure that the file is present at the correct path and that the server is correctly configured to serve the file.

Debug the server-side code: If you have access to the server-side code (e.g., enter.php), check for any issues that might cause the file not to be found. Verify that the file exists in the expected location and that the server-side code is correctly handling the request.

By troubleshooting these areas, you should be able to identify and resolve the FileNotFoundException issue.


android:enableOnBackInvokedCallback="tru e">
в манифест, чтобы это убрать:
OnBackInvokedCallback com.example.conndb W OnBackInvokedCallback is not enabled for the application.
Set 'android:enableOnBackInvokedCallback="tr ue"' in the application manifest.
0
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
07.05.2023, 15:05  [ТС]
Я вроде бы подбираюсь к истине, но точно пока сказать не могу. Нашёл ещё один метод, который кстати с первой попытки импорта в новый проект не выдал ни одной ошибки и запустился с первого раза без танцев с бубном. Кстати опубликованный относительно недавно в 2021 году, хотя и содержит в себе уже устаревшие методы.

Так вот, Logcat на этот раз выдал следующее:

java.io.IOException: Cleartext HTTP traffic to namedomain.beget.tech not permitted

я так понимаю, что до хостинга приложение достукивается, но ответ в открытом виде хостинг не возвращает. А, если так, то каким образом я должен понимать, произошла ли допустим авторизация? В общем сижу пока изучаю это дело.

По поводу БД, я пока даже к ней не подключаюсь, сделал обычный php-макет с возвратом от него результата, т. е. в поле логин и пароль отправляю на сервер данные и жду ответа. Но как вы поняли даже с этим пока беда.

Добавлено через 19 минут
Вот что выдаёт Logcat:
2023-05-07 20:38:24.062 23231-23257 EGL_emulation com.example.conndb_2 D app_time_stats: avg=500.87ms min=500.77ms max=500.98ms count=2
2023-05-07 20:38:24.208 23231-23275 System.err com.example.conndb_2 W java.io.IOException: Cleartext HTTP traffic to namedomain.beget.tech not permitted
2023-05-07 20:38:24.208 23231-23275 System.err com.example.conndb_2 W at com.android.okhttp.HttpHandler$Cleartext URLFilter.checkURLPermitted(HttpHandler. java:127)
2023-05-07 20:38:24.208 23231-23275 System.err com.example.conndb_2 W at com.android.okhttp.internal.huc.HttpURLC onnectionImpl.execute(HttpURLConnectionI mpl.java:462)
2023-05-07 20:38:24.209 23231-23275 System.err com.example.conndb_2 W at com.android.okhttp.internal.huc.HttpURLC onnectionImpl.connect(HttpURLConnectionI mpl.java:131)
2023-05-07 20:38:24.209 23231-23275 System.err com.example.conndb_2 W at com.android.okhttp.internal.huc.HttpURLC onnectionImpl.getOutputStream(HttpURLCon nectionImpl.java:262)
2023-05-07 20:38:24.210 23231-23275 System.err com.example.conndb_2 W at com.example.conndb_2.BackgroundWorker.do InBackground(BackgroundWorker.java:40)
2023-05-07 20:38:24.210 23231-23275 System.err com.example.conndb_2 W at com.example.conndb_2.BackgroundWorker.do InBackground(BackgroundWorker.java:20)
2023-05-07 20:38:24.211 23231-23275 System.err com.example.conndb_2 W at android.os.AsyncTask$3.call(AsyncTask.ja va:394)
2023-05-07 20:38:24.211 23231-23275 System.err com.example.conndb_2 W at java.util.concurrent.FutureTask.run(Futu reTask.java:264)
2023-05-07 20:38:24.211 23231-23275 System.err com.example.conndb_2 W at android.os.AsyncTask$SerialExecutor$1.ru n(AsyncTask.java:305)
2023-05-07 20:38:24.211 23231-23275 System.err com.example.conndb_2 W at java.util.concurrent.ThreadPoolExecutor. runWorker(ThreadPoolExecutor.java:1137)
2023-05-07 20:38:24.211 23231-23275 System.err com.example.conndb_2 W at java.util.concurrent.ThreadPoolExecutor$ Worker.run(ThreadPoolExecutor.java:637)
2023-05-07 20:38:24.211 23231-23275 System.err com.example.conndb_2 W at java.lang.Thread.run(Thread.java:1012)
2023-05-07 20:38:24.398 23231-23257 Parcel com.example.conndb_2 W Expecting binder but got null!

Добавлено через 25 минут
В конфиг файл сетевой безопасности прописал пару настроек и теперь он стал выдавать следующее:

2023-05-07 21:03:13.973 25157-25212 TrafficStats com.example.conndb_2 D tagSocket(66) with statsTag=0xffffffff, statsUid=-1
2023-05-07 21:03:14.198 25157-25212 System.err com.example.conndb_2 W java.io.FileNotFoundException: http://namedomain.beget.tech/validateData.php
2023-05-07 21:03:14.198 25157-25212 System.err com.example.conndb_2 W at com.android.okhttp.internal.huc.HttpURLC onnectionImpl.getInputStream(HttpURLConn ectionImpl.java:255)
2023-05-07 21:03:14.198 25157-25212 System.err com.example.conndb_2 W at com.example.conndb_2.BackgroundWorker.do InBackground(BackgroundWorker.java:58)
2023-05-07 21:03:14.198 25157-25212 System.err com.example.conndb_2 W at com.example.conndb_2.BackgroundWorker.do InBackground(BackgroundWorker.java:20)
2023-05-07 21:03:14.199 25157-25212 System.err com.example.conndb_2 W at android.os.AsyncTask$3.call(AsyncTask.ja va:394)
2023-05-07 21:03:14.199 25157-25212 System.err com.example.conndb_2 W at java.util.concurrent.FutureTask.run(Futu reTask.java:264)
2023-05-07 21:03:14.200 25157-25212 System.err com.example.conndb_2 W at android.os.AsyncTask$SerialExecutor$1.ru n(AsyncTask.java:305)
2023-05-07 21:03:14.200 25157-25212 System.err com.example.conndb_2 W at java.util.concurrent.ThreadPoolExecutor. runWorker(ThreadPoolExecutor.java:1137)
2023-05-07 21:03:14.200 25157-25212 System.err com.example.conndb_2 W at java.util.concurrent.ThreadPoolExecutor$ Worker.run(ThreadPoolExecutor.java:637)
2023-05-07 21:03:14.201 25157-25212 System.err com.example.conndb_2 W at java.lang.Thread.run(Thread.java:1012)
2023-05-07 21:03:14.239 25157-25183 Parcel com.example.conndb_2 W Expecting binder but got null!
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
08.05.2023, 22:17
Да с андроидом все оказалось не так просто. Там переброска данных между потоками, активностями, вобщем, чёрт ногу сломит.

Можете, кстати, для отладки вставлять строку System.out.printf("your message %format \n", variable); Формат это s - для строки (string), d для десятичного числа, все зависит что в переменной variable, которую выводите. Иногда очень помогает.

Сам под него никогда не писал, и вот тоже возникла необходимость. Уже намучился конкретно.
Еще предстоит авторизация, но у меня Си и база postgre, ещё толком не знаю как построить структуру алгоритма.

Я использую сокеты у вас http запросы на сколько я понял, через скрипты php, потому подсказать могу не всё и то только гуглением, когда есть возможность.

Как по мне, то на сокетах даже немного проще. На php тоже вроде есть возможность сокет соединение завести, если я не ошибаюсь.

По ошибкам, проверьте следующее:

В манифесте естественно есть <uses-permission android:name="android.permission.INTERNE T" />?

Ошибка "java.io.IOException: Cleartext HTTP traffic to namedomain.beget.tech not permitted" указывает на то, что ваше приложение пытается установить незащищенное (незашифрованное) соединение HTTP с сервером namedomain.beget.tech, но это не разрешено по умолчанию.

В новых версиях Android (начиная с Android 9), по умолчанию запрещен незащищенный сетевой трафик HTTP (cleartext) для повышения безопасности. Таким образом, если ваше приложение пытается установить незашифрованное соединение HTTP, оно будет блокировано, и вы получите указанную ошибку.

Есть несколько способов решить эту проблему:

Рекомендуется использовать защищенное соединение HTTPS вместо HTTP, если это возможно. Запросы к серверу должны использовать URL-адреса, начинающиеся с https:// вместо http://.

Если вам необходимо использовать незащищенное соединение HTTP, вы можете разрешить незащищенный трафик в вашем приложении. Для этого вам нужно добавить следующую строку в файл манифеста вашего приложения, внутри секции <application>:

xml

<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
0
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
09.05.2023, 07:09  [ТС]
Друзья, спасибо всем, кто помогает.

Строка <uses-permission android:name="android.permission.INTERNE T" /> есть, без неё никуда.

На счет http:// и https:// я понял на предыдущем этапе, поэтому строку android:usesCleartextTraffic="true" в манифест добавил, но результат абсолютно не изменился и в LogCat как выдавал:
java.io.IOException: Cleartext HTTP traffic to namedomain.beget.tech not permitted, так и выдаёт.

С годами правила ужесточились это и понятно, отсюда на видео примерах 6-7 летней давности работы android с доменами люди обращались к php по незащищенным протоколам http:// и у них всё работало, теперь судя по всему нет.
Вот и возник вопрос, а как же быть сегодня или теперь всё нацелено только на профессиональных разработчиков, т. е. компании по созданию ПО, которые оплачивают https://, а все остальные идите лесом или наслаждайтесь локальной работой внутри собственной сети?

Добавлено через 2 часа 15 минут
Ну вот, до php я достучался, только теперь не пойму, как передаются туда данные. Метод указан, как POST, но при попытке считывания массива и возврата ответа, например user_name я получаю ошибку Notice: undefined index.

Кстати весь код пришлось пересточить, кое что добавить в манифест и сетевые настройки.

MainActivity.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.example.conndb_2;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
 
public class MainActivity extends AppCompatActivity {
 
    EditText nameRegister;
    EditText usernameRegister;
    EditText passwordRegister;
    Button register;
 
    EditText usernameLogin;
    EditText passwordLogin;
    Button login;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        nameRegister = findViewById(R.id.editText1);
        usernameRegister = findViewById(R.id.editText2);
        passwordRegister = findViewById(R.id.editText3);
        register = findViewById(R.id.button1);
 
        usernameLogin = findViewById(R.id.editText4);
        passwordLogin = findViewById(R.id.editText5);
        login = findViewById(R.id.button2);
 
 
        register.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = nameRegister.getText().toString();
                String username = usernameRegister.getText().toString();
                String password = passwordRegister.getText().toString();
                String url = "http://namedomain/index.php";
                String type = "register";
                BackgroundWorker backgroundWorker = new BackgroundWorker(MainActivity.this);
                backgroundWorker.execute(url,type,name,username,password);
            }
        });
 
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = nameRegister.getText().toString();
                String username = usernameLogin.getText().toString();
                String password = passwordLogin.getText().toString();
                String url = "http://namedomain/api.php";
                String type = "login";
                BackgroundWorker backgroundWorker = new BackgroundWorker(MainActivity.this);
                backgroundWorker.execute(url, name, type, username, password);
            }
        });
 
    }
}
BackgroundWorker.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package com.example.conndb_2;
 
import android.app.AlertDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
 
public class BackgroundWorker extends AsyncTask<String,Void,String> {
    Context context;
    AlertDialog alertDialog;
    BackgroundWorker(Context ctx){
        context = ctx;
    }
    @Override
    protected String doInBackground(String... params) {
 
        String login_url = params[0];
        String type = params[1];
        String name = params[2];
        String username = params[3];
        String password = params[4];
 
        try {
 
            URL url = new URL(login_url);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            OutputStream outputStream = httpURLConnection.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
 
            String post_data = "";
            if(type.equals("register")) {
                post_data = URLEncoder.encode("name", "UTF-8") + "=" + URLEncoder.encode(name, "UTF-8") + "&"
                        + URLEncoder.encode("user_name", "UTF-8") + "=" + URLEncoder.encode(username, "UTF-8")+ "&"
                        + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(password, "UTF-8");
            }
            else if(type.equals("login")){
                post_data = URLEncoder.encode("user_name", "UTF-8") + "=" + URLEncoder.encode(username, "UTF-8") + "&"
                        + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(password, "UTF-8");
            }
 
            bufferedWriter.write(post_data);
            bufferedWriter.flush();
            bufferedWriter.close();
            outputStream.close();
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
            String result = "";
            String line = "";
            while ((line = bufferedReader.readLine()) != null) {
                result += line;
            }
            bufferedReader.close();
            inputStream.close();
            httpURLConnection.disconnect();
            return result;
 
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        return null;
    }
 
    @Override
    protected void onPreExecute() {
        alertDialog = new AlertDialog.Builder(context).create();
        alertDialog.setTitle("Login Status");
    }
 
    @Override
    protected void onPostExecute(String result) {
 
        alertDialog.setMessage(result);
        alertDialog.show();
 
    }
    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }
}
Добавлено через 6 минут
Если кто увидит косяк в коде, пожалуйста ткните меня в него. Я пока не понимаю в чем проблема, почему данные в скрипте php не могу получить через array() или $_POST['user_name'], всё пусто. Пока искал решение, как по http:// достучаться до скриптов, совсем перестал соображать .
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,577
Записей в блоге: 14
09.05.2023, 07:39
Цитата Сообщение от VKont Посмотреть сообщение
Вот и возник вопрос, а как же быть сегодня или теперь всё нацелено только на профессиональных разработчиков, т. е. компании по созданию ПО, которые оплачивают https://, а все остальные идите лесом или наслаждайтесь локальной работой внутри собственной сети?
Базы данных не открывают наружу голой жо***.
Пишут WebAPI , REST API и т.п., за которыми скрывают работу с БД.
А это API доступно по https.

Цитата Сообщение от VKont Посмотреть сообщение
т. е. компании по созданию ПО, которые оплачивают https://
Сертификаты есть и бесплатные - http://letsencrypt.org , выдаваемые на короткий (3 месяца) срок.
Можно на хостинге настроить автоматическое получение этих сертификатов и пользоваться бесплатно https.
1
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
09.05.2023, 09:00  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Сертификаты есть и бесплатные - http://letsencrypt.org , выдаваемые на короткий (3 месяца) срок.
Можно на хостинге настроить автоматическое получение этих сертификатов и пользоваться бесплатно https.
Спасибо за информацию. На счёт безопасности я понимаю, вопросов нет, просто хотелось бы с чего же начать. Одно дело, к примеру есть мануал, в котором объясняется, что вот так-то так-то вы можете работать с БД, но учтите, работа по незащищенному протоколу влечет потерю информации. А другое, как сейчас, старые примеры с видео есть, где всё работает без лишних настроек по http://, а как это реализовывается на сегодняшний момент никакой информации нет, всё собираешь по кусочкам и додумываешь, а возможно ли сегодня так работать, есть ли эти способы или их вообще нет.
Я могу, конечно профессионалов понять, не хотят они все свои секреты раскрывать по понятным причинам, но и не нужно этого делать, вы делитесь с сообществом деталями, а кто способен детали собрать в целый механизм, значит будет достойным конкурентом, кто не способен, тот сам отсеется.

Добавлено через 1 час 6 минут
Фух, всё разобрался. 5 дней работы по простейшей функции авторизации на сайте через php-скрипт из приложения Android, однако
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
09.05.2023, 09:09
Rius,
У него не голой жо, а за php. Авот на пхп нужен и сертификат. Проблема что андроид не хотел работать по http.

VKont, вы аж заинтриговали. Проблема, думаю была на стороне пхп?
0
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
09.05.2023, 09:25  [ТС]
В общем целая инструкция для следующего поколения разработчиков

Помимо правильного кода и метода по подключению к реальному домену, нужно выполнить ещё ряд функций, о которых я прямого указания нигде в интернете не нашёл. Поэтому внимательно выполняем следующее:

1. AndroidMinfest.xml

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
 
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 
    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.ConnDB_2"
        android:networkSecurityConfig="@xml/network_security_config" 
        android:usesCleartextTraffic="true"
        android:enableOnBackInvokedCallback="true"
        tools:targetApi="tiramisu">
 
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>
В манифесте необходимо помимо подключения Интернета указать вот такую строку
XML
1
android:networkSecurityConfig="@xml/network_security_config"
Соответственно в ресурсах в ветке xml заводим соответствующий файл, его можно назвать как вам удобно, у меня это network_security_config.xml.

2. Network_security_config.xml

XML
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">name_domain</domain>
    </domain-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>
В файле в строке вместо name_domain необходимо указать реальное имя вашего домена!

3. activity_main.xml

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
<EditText
    android:id="@+id/editText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="200dp"
    android:ems="10"
    android:hint="name"
    android:inputType="textPersonName"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
 
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="Login"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText2" />
 
    <EditText
    android:id="@+id/editText2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:ems="10"
    android:hint="password"
    android:inputType="textPassword"
    app:layout_constraintStart_toStartOf="@+id/editText1"
    app:layout_constraintTop_toBottomOf="@+id/editText1" />
 
</androidx.constraintlayout.widget.ConstraintLayout>
4. MainActivity.java

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.example.conndb_2;
 
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
 
import androidx.appcompat.app.AppCompatActivity;
 
public class MainActivity extends AppCompatActivity {
 
    EditText usernameLogin;
    EditText passwordLogin;
    Button login;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        usernameLogin = findViewById(R.id.editText1);
        passwordLogin = findViewById(R.id.editText2);
        login = findViewById(R.id.button2);
 
        login.setOnClickListener(v -> {
            String username = usernameLogin.getText().toString();
            String password = passwordLogin.getText().toString();
            String url = "http://name_domain/script.php";
            BackgroundWorker backgroundWorker = new BackgroundWorker(MainActivity.this);
            backgroundWorker.execute(url, username, password);
        });
 
    }
}
5. BackgroundWorker.java

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package com.example.conndb_2;
 
import android.app.AlertDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
 
public class BackgroundWorker extends AsyncTask<String,Void,String> {
    Context context;
    AlertDialog alertDialog;
    BackgroundWorker(Context ctx){
        context = ctx;
    }
    @Override
    protected String doInBackground(String... params) {
 
        String login_url = params[0];
        String username = params[1];
        String password = params[2];
 
        try {
 
            URL url = new URL(login_url);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            OutputStream outputStream = httpURLConnection.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
 
            String post_data = "";
            post_data = URLEncoder.encode("login", "UTF-8") + "=" + URLEncoder.encode(username, "UTF-8") + "&"
                        + URLEncoder.encode("pass", "UTF-8") + "=" + URLEncoder.encode(password, "UTF-8");
 
            bufferedWriter.write(post_data);
            //bufferedWriter.newLine();
            bufferedWriter.flush();
            bufferedWriter.close();
            outputStream.close();
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));//iso-8859-1
            String result = "";
            String line = "";
            while ((line = bufferedReader.readLine()) != null) {
                result += line;
            }
            bufferedReader.close();
            inputStream.close();
            httpURLConnection.disconnect();
            return result;
 
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        return null;
    }
 
    @Override
    protected void onPreExecute() {
        alertDialog = new AlertDialog.Builder(context).create();
        alertDialog.setTitle("Login Status");
    }
 
    @Override
    protected void onPostExecute(String result) {
 
        alertDialog.setMessage(result);
        alertDialog.show();
 
    }
    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }
}
Код исключительно для примера, его нужно доводить до ума. Методов подключения много, поэтому выбор за вами, я бы всё-таки возможно предпочёл библиотеку volley, хотя возможно и она устаревшая. Но суть не только в коде, а в настройках манифеста и дополнительных настройках сетевой конфигурации, о которой не знаючи, не так-то просто наладить связь android и сервера.
Вполне возможны другие более простые решения, но сколько я их искал, в сети попадались только старые способы, которые в настоящее время у меня не работали.
Предстоит дальше разбираться с поддержанием сеанса из android или как там оно осуществляется для работы с БД. В общем всем спасибо, если что, пока разбираюсь окончательно с полным взаимодействием приложений android и сервера пишите здесь, делитесь своими наработками, я в свою очередь буду делиться своими.
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
09.05.2023, 10:15
Вот рабочий пример клиента и сервера на андроид и джава соответственно. На сокетах.

http://https://java-online.ru/android-socket.xhtml

Клиент проверял лично. Сервер этот когда-то давно ковырял на джаве. Не помню что там у него с работоспособностью.

Мне бы было интересно как у вас устроен механизм авторизации в бд, т.е. Например, есть поля с именем и паролем в базе, скрипт пхп ищет по полю клиент, сравнивает хеш пароля с хешем который лежит в базе и соответствует этому клиенту? Если совпадает, авторизация успешна, приложение продолжает работу?
0
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
09.05.2023, 10:19  [ТС]
Цитата Сообщение от simonC Посмотреть сообщение
Если совпадает, авторизация успешна, приложение продолжает работу?
Да, всё верно, механизм такой, простейший.
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
18.05.2023, 16:23
Цитата Сообщение от VKont Посмотреть сообщение
Предстоит дальше разбираться с поддержанием сеанса из android или как там оно осуществляется для работы с БД
Что имеете в виду? Чтобы не проходилось подключаться после "простоя" к серверу перед отправкой данных?
Так а разве php такое умеет? Он ведь скрипт отработал и всё, потом снова подключайся. Это разве что перед каждой отправкой проверять соединение, и если отпало поднимать снова.
0
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
19.05.2023, 00:48  [ТС]
Доброго дня. У меня пока не возникло проблем с работой приложения android с БД через php. Да, действительно всё работает также, как обычно, подлючаешься к php-скрипту, устанавливаешь подключение, производишь манипуляции с БД, закрываешь соединение.
0
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 483
19.05.2023, 11:37
Цитата Сообщение от simonC Посмотреть сообщение
Вот рабочий пример клиента и сервера на андроид и джава соответственно. На сокетах.
http://https://java-online.ru/android-socket.xhtml
Клиент проверял лично.
Зачем там Therad и Executors перепутаны?
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
19.05.2023, 16:35
Да кто ж его знает.
Я проверил, работает, но под переделку не подошло, запутался, пришлось писать с нуля.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2023, 16:35
Помогаю со студенческими работами здесь

Работа программистом приложения на Android (г. Одинцово)
Чем нужно будет заниматься: Разработка мобильного приложения для ОС Android Выявление и исправление ошибок в работе текущего...

Работа unity приложения при сворачивании и отключении экрана Android
Пишу приложение на unity под Android для учета времени(TimeTrack). В приложении запускается таймер для установленных пользователем целей....

MySQL БД на хостинге
Всем, доброго времени суток. Такой вопрос: есть mySQL БД на хостинге. Можно ли к ней подключатся с помощью Delphi. Что бы...

Delphi+MySQL на хостинге
Возможна ли такая связка? Простой phpmyadmin. Можно ли к нему подключаться через delphi?

На хостинге не работает MySQL
Помогите ,пожалуйста. Мне срочно нужно разместить сайт на хостинг. Вроде бы все правильно делаю,но выходит ошибка &quot;Database Error:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru