2017-02-01 4 views
-1

Я хочу создать простую форму регистрации, используя PHP/MYSQL. Однако, когда я отправляю форму, она не добавляет пользователя в базу данных. Был бы рад, если кто-то найдет решение. Вот мой HTML:PHP Форма регистрации не работает

<form action="signup.php" method="POST"> 

<label>Pick a username: </label><input type="text" name="username" /> <br> 
    <label>Pick a password: </label><input type="password" name="password" /> <br> 
    <label>Verify password: </label><input type="password" name="verify_password" /> <br> 
    <label>Email address: </label><input type="text" name="email" /> <br> 
    <button type="submit">Sign Up</button> 

</form> 

И signup.php:

<?php 
include 'db.php'; 

$username = $_POST['username']; 
$password = $_POST['password']; 
$verify_password = $_POST['verify_password']; 
$email = $_POST['email']; 

if ($verify_password !== $password) { 
    echo "You didn't type your password correctly!"; 

} else { 
    $sql = "INSERT INTO users (username, password, verify_password, email) 
    VALUES ('$username', '$password', '$verify_password', '$email')"; 

    $rezultat = mysqli_query($link, $sql); 

    header("Location: index.php"); 
} 
?> 

EDIT: Вот это db.php:

<?php 
define ("MYSQL_HOST", "localhost"); 
define ("MYSQL_USER", "root"); 
define ("MYSQL_PASS", ""); 
define ("MYSQL_DBNAME", "registrationTest"); 

function connect() { 
    global $link; 

    $link = mysqli_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DBNAME) or die ("Connection error: " . mysqli_connect_error); 
} 
?> 
+0

Где объявляется переменная $ link? – MCMXCII

+0

Есть ли у вас ошибки? Можете ли вы подтвердить, что данные в db.php верны? –

+0

Вы действительно не хотите делать встроенные скрипты sql таким образом. С вопросами по безопасности вы можете столкнуться. – rtrigoso

ответ

1

Проводы вы добавили файл соединения в a) Редактирование:

Ваш файл подключения содержит настраиваемую функцию connect(), но вы ее никогда не называли.

function connect() { 
    global $link; 

    $link = mysqli_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DBNAME) or die ("Connection error: " . mysqli_connect_error); 
} 

Либо удалить:

function connect() { 
    global $link; 

} 

Или вызовите функцию внутри скрипта, где вы хотели бы, чтобы это произошло.

т.е .:

<?php 
include 'db.php'; 

echo connect(); 

// ... rest of your code 
  • Примечание: Я не буду повторять то, что было сказано в отношении безопасности вашего кода.

Редактировать: я также не сделаю полную перезапись для подготовленного заявления и используя безопасную функцию хэширования пароля; это не моя работа.

  • Я ответил «на вопрос», период.

Я, однако, включают в себя ссылки на них узнать и сделать это сами:


Изменить следующее, чтобы проверить, результат был успешным. Если нет, то возвращает ошибку, если есть один:

else { 
    $sql = "INSERT INTO users (username, password, verify_password, email) 
    VALUES ('$username', '$password', '$verify_password', '$email')"; 

    $rezultat = mysqli_query($link, $sql); 

    header("Location: index.php"); 
} 

к:

else { 
    $sql = "INSERT INTO users (username, password, verify_password, email) 
    VALUES ('$username', '$password', '$verify_password', '$email')"; 

    $rezultat = mysqli_query($link, $sql); 
} 

if($rezultat){ 

    header("Location: index.php"); 
    exit; 

}else{ 
    echo "Error: " . mysqli_error($link); 
} 
+0

Тот, кто ниспровергал это, был вне линии. Я не буду переписывать весь их код с помощью подготовленных операторов и password_hash; мы имеем дело с деньгами, которые вы знаете. –

+0

См. Мой ответ на @Mohammed Akhtar Zuberi. Помощь кому-то с небезопасным кодом, который ставит клиентов под угрозу, неприемлем. – zaph

+1

@zaph Да, я это видел. Еще раз; вставьте свой собственный ответ. Кажется, мы не делаем всю работу, которую вы, похоже, не хотите делать. –

-2

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

Ниже приведено описание вашего db.php file

<?php 
    function db_connect() { 
     $link = @mysqli_connect ('localhost', 'username', 'password', 'table_name'); 

     if (mysqli_connect_errno()) 
      die ('Failed to connect to server.'); 
     return $link; 
    } 
?> 

Этот файл теперь можно просто вызвать в любом формате .php. В вашем случае это скрипт регистрации. До этого ниже должен быть ваш HTML.

<form action="signup.php" method="POST"> 

<label>Pick a username: </label><input type="text" name="username" /> <br> 

//Note that I have added "ID" to Password and Verify Password. This will be used to match the passwords before even submit. 
<label>Pick a password: </label><input type="password" id="password" name="password" /> <br> 
    <label>Verify password: </label><input type="password" id="verify_password" name="verify_password" /> <br> 
    <label>Email address: </label><input type="text" name="email" /> <br> 

//Note that I have added "Name" to the Button. This will be used in the sign-up script for validation. The script is called by onclick where Javascript fucntion is called. 
<button name="singup-details" type="submit" onclick="registerFunction()">Sign Up</button> 

</form> 

Рекомендуется использовать пароли через Javascript, а не в скрипте регистрации PHP. Это не позволяет пользователю отправить форму в случае, если пароли не совпадают.

Ниже приведен код Javascript, который вы можете пропустить непосредственно перед тегом </body>.

<script type="text/javascript"> 
    //This will set passwordmatch variable on password and verify_password change. 
    $('#password, #verify_password').on('keyup', function() { 
    if ($('#password').val() == $('#verify_password').val()) { 
     $('#message').html('').css('color', 'green'); 

     passwordmatch = 'yes'; 
    } else { 
     $('#message').html(' Enter the Password again. Both the fields must match.').css('color', 'red'); 

     passwordmatch = 'no'; 
    } 
}); 

//If password matches, it will prompt to ensure that if the entries are correct. Or else, will set the focus to Password field. 
    function registerFunction() { 
     if (passwordmatch == 'yes') { 
      if (confirm('You are about to change your password.\nPress OK to proceed.')) return false; 

      $("#userpassword").focus(); 
      $("#userpassword").select(); 

      event.preventDefault(); 
     } else { 
      alert('Password do not match. Please check and try again.'); 

      $("#userpassword").focus(); 
      $("#userpassword").select(); 

      event.preventDefault(); 
     } 
    } 
</script> 

Теперь, наконец, ваш signup.php, который необходимо изменить.

<?php 
    session_start(); 
    ob_start(); 

    //You can set timezone in order if you plan to store the registration time as well. 
    date_default_timezone_set('Asia/Dubai'); 

    include 'db.php'; 


    $username = $_POST['useremail']; 

    $password = $_POST['password']; 

    $email = $_POST['email']; 

    //Saving the password directly is not safe. It is better to encrypt it using, at least, SHA1. Below is the way to encrypt the password. 
    $password = sha1($_POST['userpassword']); 

    //By checking isset $_POST of the singup button of HTML using its name value, we ensure that the user can browse this page only by filling in the Singup form or else will be sent back to the Signup form. 
    if (isset($_POST['singup-details'])) { 
     //This is the way you can check that if the user exists or not. 
     $sql = "SELECT * FROM your_table WHERE email = '" . $email . "'"; 
     $result = mysqli_query(db_connect(), $sql); 

     $num_row = mysqli_num_rows($result); 

     if($num_row >= 1) { 
      //If username exists, it will take back to the singup form. 
      ?> 
       <script language="javascript" type="text/javascript"> 
        alert('<?php echo $username; ?> already exists in our records.\nTry Again.'); 
        window.location = 'your_signup_form.php'; 
       </script> 
      <?php 
     } 
     else { 
      //If username doesn't exist it will save it into the database. Also note that you do not have to save the Verify Password. It is not required at all. 
      $sql1 = "INSERT INTO table_name (username, email, password) 
      VALUES ('$username', '$email', '$password')"; 

      $result1 = mysqli_query (db_connect(), $sql1); 

      ?> 
       <script language="javascript" type="text/javascript"> 
        alert('Thank you <?php echo $username; ?> for registering.'); 
        window.location = 'any_page_you_want.php'; 
       </script> 
      <?php 
     } 
    } 
    else { 
     //In case someone tries to access this page directly, this will take him to the singup page instead. 
     ?> 
     <script language="javascript" type="text/javascript"> 
      window.location = 'your_signup_form.php'; 
     </script> 
     <?php 
    } 
?> 

Надеюсь, что это поможет. Счастливое кодирование ...

+0

SHA1, действительно все криптографические хеш-функции, не шифруют. Далее, просто используя хэш даже с солью, или HMAC небезопасен, для PHP нужно использовать 'password_hash' и' password_verify', они перебирают около 100 мс для добавления безопасности. См. Комментарий к вопросу о безопасности паролей. – zaph

+0

@zaph и что? Вы хотите, чтобы мы делали полные перезаписи для каждого вопроса, который приходит в Stack? Если это ваш нисходящий пример здесь и в моем; это невостребовано и вносит свой собственный ответ, полностью переписывая. Мы делаем это БЕСПЛАТНО, и у нас действительно есть рабочие места поверх этого «хобби». –

+0

Предлагаете ли вы ступенчатую лестницу по запросу, чтобы помочь кому-то спрыгнуть с моста? Безопасность клиентов OP заслуживает лучших практик. По крайней мере, укажите в ответе, что это не безопасное решение, и укажите, почему и безопасный вариант. Эти ответы будут рассмотрены многими разработчиками, которые ищут безопасное решение, подумайте об этом. – zaph

Смежные вопросы