У меня есть 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);
?>
Любая помощь приветствуется.
@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}
Вы не избавляетесь от него, вы просто меняете его так, чтобы он передавал 3 вместо 4. Вам, вероятно, понадобится ssi или sss.
Итак, если я передаю имя пользователя, пароль и логическое значение isAdmin, это должно быть issb? для int (автоинкремент), строки, строки и логического?
Если $ stmt имеет логическое значение, это означает, что подготовка не удалась. Вам необходимо проверить ошибки mysqli после подключения, подготовки и привязки.
Нет, вы передаете только то же количество заполнителей, что и переменные. Если вы не передаете автоматическое приращение, не передавайте заполнитель.
Кстати, b предназначен для blob, а не для boolean. php.net/manual/en/mysqli-stmt.bind-param.php Вы все равно будете использовать i для логического значения, поскольку оно будет передаваться как 1 или 0.
@aynber, я изменил его на ssi и сделал то, что сказал тот парень. По-прежнему ничего.
Как я упоминал ранее, проверьте наличие ошибок mysqli. В сообщении об ошибке говорится, что подготовка не удалась, и в сообщении об ошибке указано, почему.
@aynber я помещаю оператор if "if (mysqli_connect_errno ()) {printf (" Ошибка подключения:% s \ n ", mysqli_connect_error ()); exit ();}" после проверки соединения. Я до сих пор ниоткуда ничего не получаю. Что вы порекомендуете для ловушки ошибок и где? Где мне вообще искать ошибку? logcat? Извините, я вообще не работаю с базами данных
Связь вроде в порядке, это была подготовка, которая давала сбой. Попробуйте if (!$statement) { printf("Prepare failed: %s\n", mysqli_error($con)); } после линии подготовки
@aynber, я поместил ту строку, которую вы мне дали, сразу после строки "mysqli_exe" и запустил ее. это подошло: «Подготовка не удалась: таблица 'test.user' не существует {" success ": true}». У меня есть база данных под названием test, а таблица внутри нее называется cresidentials. Итак, что мне поместить, где указать php на скрипт?
Поскольку он повторяется / печатается, вам нужно будет проверить ответ, который получает приложение для Android. В противном случае вы можете его зарегистрировать. Использование журнал ошибок может вместо этого отправлять сообщение в журналы ошибок сервера.
@aynber, спасибо, но я только что обновил расположение страницы в браузере (например, localhost / etc ....), и в конце он показал мне ошибку. Я бы хотел переместить это в чат, но недостаточно репутации. Итак, посмотрите предыдущий комментарий, пожалуйста
Ну вот и проблема. Вы пытаетесь получить доступ к несуществующей таблице. Измените «INSERT INTO user» на «INSERT INTO cresidentials» или другое имя таблицы.
Спасибо, чувак, но все равно не сработало. Ошибка ничего не выводит на веб-страницу документа. ничего не отображается в таблице после обновления. И я не вижу ошибок в logcat. но, по крайней мере, в веб-документе написано "{" success ": true}"
Это потому, что вы передаете этот 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 я пробовал. Я не вижу ничего, что появляется в android logcat (если только я не ищу ошибок).




Я вижу как минимум две ошибки в этом коде:
private static final String REGISTER_REQUEST_URL = "http://localhost/phptesting/Register.php";
Android не любит localhost, можете прочитать здесь.
Лучший вариант - сделать ifconfig и получить свой ip address, а вместо localhost поставить свой ip address как
Также у вашего локального хоста должен быть порт, верно? Поэтому убедитесь, что вы добавили его на всякий случай в свой BASE_URL, чтобы он выглядел так
Тогда звонок должен работать.
Затем я вижу еще одну проблему с
mysqli_stmt_bind_param($statement, "siss",$username,$password,$isAdmin);
Вы передаете 4 значения вставке, для которой требуется 3.
Я рекомендую вам идти шаг за шагом, сначала убедитесь, что ваш вызов api что-то регистрирует (вы можете использовать PostMan или ARC для этого), а затем перейдите на сторону Android.
Я сделал все это и изменил siss на ssi, но по-прежнему ничего не происходит. Я даже перешел на эмулятор. Ничего такого
я заменил код 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); Просто чтобы изменить имена пользователей и пароли и тому подобное, чтобы они не были нулевыми. ничего такого
под API вы имеете в виду Apache, php и phpmyadmin? тогда да. они работают. Но я задал еще один вопрос, который следует из этого. [ссылка] (stackoverflow.com/questions/53132404/…) в нем есть фактический код ошибки. Вы здесь помогли, так что я дам вам ответ по отладке.
Я собираюсь взглянуть на него, если это помогло проголосовать и пометить этот вопрос как правильный, спасибо
3 столбца, 3 значения, 4 заполнителя внутри mysqli_stmt_bind_param