0

Я HTML знаю ооочень смутно, PHP первый раз вижу, но мне понадобилось написать такой проект. Помогите пожалуйста. В общем, кое-как написал простенький сайтик с формой для заполнения. введите сюда описание изображения

Мне лишь необходимо собирать информацию с пользователей, поэтому никаких проверок регистрации или авторизаций. Все максимально просто - зашел, написал свой любимый трек, отправил информацию в базу данных, потом я ее считаю. Так вот, возникла проблема, через локальный сервер на MAMP все прекрасно работает введите сюда описание изображения введите сюда описание изображения

Вот код на HTML

<!DOCTYPE html>
<html lang="ru" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Форма регистрации</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
    <link rel="stylesheet" href="css/style.css">
  </head>
  <body>
    <div class="container mt-4">
        <h1>Форма регистрации</h1>
        <form action="check.php" method="post">
          <input type="text" class="form-control" name="name" id="name" placeholder="Введите имя"><br>
          <input type="text" class="form-control" name="art" id="art" placeholder="Введите исполнителя"><br>
          <input type="text" class="form-control" name="music" id="music" placeholder="Введите трек"><br>
          <button class="btn btn-success" type="submit">Зарегистрировать</button>
        </form>
    </div>
  </body>
</html>

Вот код на PHP

<?php
$name = $_POST['name'];
$art = $_POST['art'];
$music = $_POST['music'];

if(mb_strlen($name) < 2) {
  echo "Недопустимая длина имени (от 2 до 100 символов)";
  exit();
}
else if(mb_strlen($art) < 2) {
  echo "Недопустимая длина имени исполнителя (от 2 до 100 символов)";
  exit();
}
else if(mb_strlen($music) < 2) {
  echo "Недопустимая длина названия трека (от 2 до 100 символов)";
  exit();
}

$mysql = new mysqli('localhost','root','root','register-bd');
$mysql->query("INSERT INTO `users` (`name`,`art`,`music`) VALUES('$name','$art','$music')");

header('Location: /');
$mysql->close();
 ?>

А вот как только я перенес на хостинг. Сайт работает формы обнуляются после нажатия кнопки, будто информация отправляется. Но в БД ничего не появляется. Соответственно вот код с уже исправленным подключением для хостинга вместо локального сервера

<?php
$name = $_POST['name'];
$art = $_POST['art'];
$music = $_POST['music'];

if(mb_strlen($name) < 2) {
  echo "Недопустимая длина имени (от 2 до 100 символов)";
  exit();
}
else if(mb_strlen($art) < 2) {
  echo "Недопустимая длина имени исполнителя (от 2 до 100 символов)";
  exit();
}
else if(mb_strlen($music) < 2) {
  echo "Недопустимая длина названия трека (от 2 до 100 символов)";
  exit();
}

$mysql = new mysqli('hostde21.fornex.host','d61449_dbuser','ПАРОЛЬ','d61449_db');
$mysql->query("INSERT INTO `users` (`name`,`art`,`music`) VALUES('$name','$art','$music')");

header('Location: /');
$mysql->close();
 ?>

введите сюда описание изображения

GTmix
  • 37
  • Начните с исправления опасной уязвимости под названием sql-инъекция. – andreymal Mar 02 '20 at 16:40
  • Мне бы разобраться с работоспособностью сайта. Мне не принципиально сейчас разработать безопасный сайт. Это сайт для 2-3 дней теста – GTmix Mar 02 '20 at 17:28

2 Answers2

1

Чтобы разобраться в чём конкретно причина - Вам необходимо для начала вывести ошибки mysqli. Скорее всего Ваша проблема в подключении.
Чтобы её конкретизировать воспользуйтесь:

$mysql = new mysqli('hostde21.fornex.host','d61449_dbuser','ПАРОЛЬ','d61449_db');
if(!$mysql){
echo' Ошибка подключения к БД: '.mysqli_connect_error().' Код ошибки:'.mysqli_connect_errno();
exit;
}

$b = $mysql->query("INSERT INTO `users` (`name`,`art`,`music`) VALUES('$name','$art','$music')");
if(!$b){
echo'Ошибка запроса: '.mysqli_error($b);
exit;
}
Denis640Kb
  • 14,089
  • Да, я пробовал некоторые проверки запроса и подключения, но тогда тупо сайт check.php не загружается "Страница недоступна Сайт d61449.hostde21.fornex.host пока не может обработать этот запрос. HTTP ERROR 500" – GTmix Mar 02 '20 at 17:09
  • @GTmix Вы отдельно скопируйте данный ответ и попробуйте его запустить у себя. Если нет ошибок пунктуации, то должна выйти ошибка mysqli. – Denis640Kb Mar 02 '20 at 17:11
  • да , я ваш ответ и пробовал, эта ошибка получается с вашим кодом уже – GTmix Mar 02 '20 at 17:13
  • @GTmix одна ковычка была записана не корректно. Исправил. Ввиду Вашего комментария ниже, убедитесь, что у Вас файл с кодировкой utf-8 – Denis640Kb Mar 02 '20 at 17:13
  • Да, это я тоже заметил, исправил сразу. У меня почему-то при проверке не грузит сайт – GTmix Mar 02 '20 at 17:15
  • https://ibb.co/Drs86y0 у меня вроде все правильно стоит, но все равно не работает что ваша версия, что ниже – GTmix Mar 02 '20 at 17:20
  • Перезаписал файлы сайта.Он стал грузить check.php с "Ошибка запроса:" В чем ошибка запроса, этого я уже не знаю, оформление вроде правильно, в БД таблица присутствует. И я слишком слабо разбираюсь, чтобы найти неточность – GTmix Mar 02 '20 at 17:22
1

Проблема в том, что у вас вообще отсутствует проверка ошибок.

Код должен выглядеть как-то так

$mysql = new mysqli('hostde21.fornex.host','d61449_dbuser','ПАРОЛЬ','d61449_db');
if (!$mysql)
  die('Unexpected error');
$error = mysqli_connect_error();
if ($error)
  die($error);
$res = $mysql->query("INSERT INTO `users` (`name`,`art`,`music`) VALUES('$name','$art','$music')");
if (!$res)
  die($mysql->error);
$mysql->close();
header('Location: /');

Ну и неплохо было бы использовать параметрический запрос

  • 1
    Это пример того, как код выглядеть не должен. – Ипатьев Mar 02 '20 at 16:46
  • @Ипатьев Обоснуете? – Anton Shchyrov Mar 02 '20 at 17:02
  • @AntonShchyrov, в вашем случае сайт check.php загружается, только выводит вместо ошибки это "����������� �� �����������, �.�. �������� ��������� ������ ������ �� �����������." – GTmix Mar 02 '20 at 17:12
  • Сайт, который при ошибке вываливает кишки всем на обозрение - это уже лет 20, как пример того, как код выглядеть не должен. – Ипатьев Mar 02 '20 at 17:21
  • @Ипатьев Вас не смущает, что это только для выявления ошибки сделано? Впрочем Ваш ответ, который Вы отметили, как дубликат, ничем не лучше. – Denis640Kb Mar 02 '20 at 17:23
  • @Denis640Kb ошибки должны быть скрыты от конечного пользователя, иначе они можут дать взломщику дополнительную информацию, упрощающую взлом сайта. Мой персональный сайт, на котором не скрыты тексты ошибок, именно с помощью текстов ошибок и взломали когда-то. – andreymal Mar 02 '20 at 17:29
  • @andreymal Читайте сообщение выше, пожалуйста. – Denis640Kb Mar 02 '20 at 17:31
  • @Denis640Kb читайте сообщение выше, пожалуйста. Выявление ошибок нужно делать не так. – andreymal Mar 02 '20 at 17:32
  • @andreymal А Вы читали сообщение дубликата? И его название. Ошибка автора не заключается в mysql_fetch_array() expects parameter 1 to be resource (or mysqli_result), boolean given А так же, если бы Вы хотя бы попробовали читать внимательно мои сообщения, то увидели бы, что я писал об этом. – Denis640Kb Mar 02 '20 at 19:08
  • 2
    @Denis640Kb а вы читали внимательно суть вопроса и ответа? Основная ошибка автора вопроса (помимо sql-инъекции) — в отстутствии обработки ошибок, из-за которой он не может увидеть проблему. – andreymal Mar 02 '20 at 19:09