Студия Android не связывается с моим скриптом php

У меня есть 2 сценария Java, которые должны перейти в файл php, расположенный на http: //localhost/phptesting/Register.php. URL моего скрипта связывает его, но когда я отправляю запрос на регистрацию, ничего не происходит. В логах даже ничего не происходит.

вот мой запрос на регистрацию:

    public class RegisterRequest extends StringRequest {

    private static final String REGISTER_REQUEST_URL = "http://localhost/phptesting/Register.php";
    private Map<String, String> params;
    public RegisterRequest(String username, String password,String isAdmin, Response.Listener<String> listener){
        super(Method.POST, REGISTER_REQUEST_URL,listener,null);
        params = new HashMap<>();
        params.put("username",username);
        params.put("password",password);
        params.put("isAdmin",isAdmin+"");
    }

    public Map<String, String> getparams() {
        return params;
    }
}

и вот мой скрипт активности регистрации:

createuser.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final String username = username1.getText().toString();
                final String password = password1.getText().toString();
                final String isadmin = isAdmin.getText().toString();
                Response.Listener<String> responseListener = new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONObject jsonResponse = new JSONObject(response);
                            boolean success = jsonResponse.getBoolean("success");
                            if (success){
                                Intent intent = new Intent(CreateUser.this, MainActivity.class);
                                CreateUser.this.startActivity(intent);
                            }else{
                                AlertDialog.Builder builder = new AlertDialog.Builder(CreateUser.this);
                                builder.setMessage("Register Failed")
                                        .setNegativeButton("Retry",null)
                                        .create()
                                        .show();


                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                };
                RegisterRequest registerRequest = new RegisterRequest(username,password,isadmin,responseListener);
                RequestQueue queue = Volley.newRequestQueue(CreateUser.this);
                queue.add(registerRequest);
            }
        });

мой скрипт php таков;

<?php
    $db_host = 'localhost:3306';
    $db_user = 'root';
    $db_pass = '';
    $db_name = 'test';

    $con = mysqli_connect($db_host,'user',$db_pass,$db_name);
    if ($con){
        echo "connection successful";
    }else{
        echo "connection failed";
    }

    $age = $_POST["isAdmin"];
    $username = $_POST["username"];
    $password = $_POST["password"];
    $statement = mysqli_prepare($con, "INSERT INTO user (username,password,isAdmin) VALUES (?, ?, ?)");
    mysqli_stmt_bind_param($statement, "siss",$username,$password,$isAdmin);
    mysqli_stmt_execute($statement);

    $response = array();
    $response["success"] = true;  

    echo json_encode($response);
?>

Любая помощь приветствуется.

3 столбца, 3 значения, 4 заполнителя внутри mysqli_stmt_bind_param

aynber 02.11.2018 14:15

@aynber, тогда мне избавиться от "siss"? или мне как-то нужно добавить туда основной автоинкремент? Кроме того, isAdmin - это логическое значение, и когда я запускаю код без какого-либо входного кода, он дает мне следующее; Предупреждение: mysqli_stmt_bind_param () ожидает, что параметр 1 будет mysqli_stmt, логическим значением, заданным в C: \ xampp \ htdocs \ phptesting \ Register.php в строке 18 Предупреждение: mysqli_stmt_execute () ожидает, что параметр 1 будет mysqli_stmt, логическим значением, заданным в C: \ xpp. htdocs \ phptesting \ Register.php в строке 19 {"success": true}

Alec Harvey 02.11.2018 14:18

Вы не избавляетесь от него, вы просто меняете его так, чтобы он передавал 3 вместо 4. Вам, вероятно, понадобится ssi или sss.

aynber 02.11.2018 14:20

Итак, если я передаю имя пользователя, пароль и логическое значение isAdmin, это должно быть issb? для int (автоинкремент), строки, строки и логического?

Alec Harvey 02.11.2018 14:22

Если $ stmt имеет логическое значение, это означает, что подготовка не удалась. Вам необходимо проверить ошибки mysqli после подключения, подготовки и привязки.

aynber 02.11.2018 14:25

Нет, вы передаете только то же количество заполнителей, что и переменные. Если вы не передаете автоматическое приращение, не передавайте заполнитель.

aynber 02.11.2018 14:26

Кстати, b предназначен для blob, а не для boolean. php.net/manual/en/mysqli-stmt.bind-param.php Вы все равно будете использовать i для логического значения, поскольку оно будет передаваться как 1 или 0.

aynber 02.11.2018 14:28

@aynber, я изменил его на ssi и сделал то, что сказал тот парень. По-прежнему ничего.

Alec Harvey 02.11.2018 14:33

Как я упоминал ранее, проверьте наличие ошибок mysqli. В сообщении об ошибке говорится, что подготовка не удалась, и в сообщении об ошибке указано, почему.

aynber 02.11.2018 15:01

@aynber я помещаю оператор if "if (mysqli_connect_errno ()) {printf (" Ошибка подключения:% s \ n ", mysqli_connect_error ()); exit ();}" после проверки соединения. Я до сих пор ниоткуда ничего не получаю. Что вы порекомендуете для ловушки ошибок и где? Где мне вообще искать ошибку? logcat? Извините, я вообще не работаю с базами данных

Alec Harvey 02.11.2018 15:16

Связь вроде в порядке, это была подготовка, которая давала сбой. Попробуйте if (!$statement) { printf("Prepare failed: %s\n", mysqli_error($con)); } после линии подготовки

aynber 02.11.2018 15:44

@aynber, я поместил ту строку, которую вы мне дали, сразу после строки "mysqli_exe" и запустил ее. это подошло: «Подготовка не удалась: таблица 'test.user' не существует {" success ": true}». У меня есть база данных под названием test, а таблица внутри нее называется cresidentials. Итак, что мне поместить, где указать php на скрипт?

Alec Harvey 02.11.2018 15:46

Поскольку он повторяется / печатается, вам нужно будет проверить ответ, который получает приложение для Android. В противном случае вы можете его зарегистрировать. Использование журнал ошибок может вместо этого отправлять сообщение в журналы ошибок сервера.

aynber 02.11.2018 15:48

@aynber, спасибо, но я только что обновил расположение страницы в браузере (например, localhost / etc ....), и в конце он показал мне ошибку. Я бы хотел переместить это в чат, но недостаточно репутации. Итак, посмотрите предыдущий комментарий, пожалуйста

Alec Harvey 02.11.2018 15:50

Ну вот и проблема. Вы пытаетесь получить доступ к несуществующей таблице. Измените «INSERT INTO user» на «INSERT INTO cresidentials» или другое имя таблицы.

aynber 02.11.2018 15:52

Спасибо, чувак, но все равно не сработало. Ошибка ничего не выводит на веб-страницу документа. ничего не отображается в таблице после обновления. И я не вижу ошибок в logcat. но, по крайней мере, в веб-документе написано "{" success ": true}"

Alec Harvey 02.11.2018 15:55

Это потому, что вы передаете этот json независимо от того, не работает он или нет. Вы можете использовать проверки ошибок, чтобы возвращать ложное значение с сообщением всякий раз, когда он терпит неудачу. if (!$statement) { return json_encode(['status'=>'failed','message'=>mysqli_error($con‌​)]); } после подготовки и if (mysqli_error($statement)) { return json_encode(['status'=>'failed','message'=>mysqli_error($con‌​)]); } после подготовки и выполнения.

aynber 02.11.2018 15:58

@aynber я пробовал. Я не вижу ничего, что появляется в android logcat (если только я не ищу ошибок).

Alec Harvey 03.11.2018 00:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
18
448
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я вижу как минимум две ошибки в этом коде:

private static final String REGISTER_REQUEST_URL = "http://localhost/phptesting/Register.php";

Android не любит localhost, можете прочитать здесь.

Лучший вариант - сделать ifconfig и получить свой ip address, а вместо localhost поставить свой ip address как

http://192.168.1.158/phptesting/Register.php

Также у вашего локального хоста должен быть порт, верно? Поэтому убедитесь, что вы добавили его на всякий случай в свой BASE_URL, чтобы он выглядел так

http://192.168.1.158:8080/phptestig/Register.php

Тогда звонок должен работать.

Затем я вижу еще одну проблему с

mysqli_stmt_bind_param($statement, "siss",$username,$password,$isAdmin);

Вы передаете 4 значения вставке, для которой требуется 3.

Я рекомендую вам идти шаг за шагом, сначала убедитесь, что ваш вызов api что-то регистрирует (вы можете использовать PostMan или ARC для этого), а затем перейдите на сторону Android.

Я сделал все это и изменил siss на ssi, но по-прежнему ничего не происходит. Я даже перешел на эмулятор. Ничего такого

Alec Harvey 02.11.2018 14:52

я заменил код php на $ isAdmin = $ _POST ["isAdmin"]; $ username = $ _POST ["имя пользователя"]; $ password = $ _POST ["пароль"]; если ($ isAdmin = null) {$ isAdmin = 0; } если ($ username = null) {$ username = "fakename"; } если ($ password = null) {$ password = "fakepassword"; } $ statement = mysqli_prepare ($ con, "ВСТАВИТЬ пользователя (имя пользователя, пароль, isAdmin) ЗНАЧЕНИЯ (?,?,?)"); mysqli_stmt_bind_param ($ statement, 'ssi', $ username, $ password, ‌ $ isAdmin); mysqli_stmt_execute ($ statement); Просто чтобы изменить имена пользователей и пароли и тому подобное, чтобы они не были нулевыми. ничего такого

Alec Harvey 02.11.2018 15:22

под API вы имеете в виду Apache, php и phpmyadmin? тогда да. они работают. Но я задал еще один вопрос, который следует из этого. [ссылка] (stackoverflow.com/questions/53132404/…) в нем есть фактический код ошибки. Вы здесь помогли, так что я дам вам ответ по отладке.

Alec Harvey 03.11.2018 15:52

Я собираюсь взглянуть на него, если это помогло проголосовать и пометить этот вопрос как правильный, спасибо

Skizo-ozᴉʞS 03.11.2018 17:00

Другие вопросы по теме