Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Walidacja jquery + php + mysql
Forum PHP.pl > Forum > XML, AJAX
tomzoll
Witam serdecznie.

Piszę skrypt, za pomocą którego będę dodawał do bazy danych nazwy użytkowników. Ponadto skrypt sprawdza w bazie danych, czy przypadkiem istnieje już taki użytkownik w bazie danych. Skrypt działa super w PHP, aczkolwiek docelowo chcę, żeby skrypt domyślnie był walidowany poprzez jquery. I tutaj problem bo nie wiem jak to ugryźć. Poniżej treść skryptów.

Plik signup.php oczywiście bez zbędnego kodu html

Kod
<?php
session_start();
  // Wstawianie nagłówka strony.
  $page_title = 'Rejestracja';
  require_once('header.php'); //Nagłówek strony wraz z deklaracją css oraz niezbędnymi skryptami - w nszym przypadku jquery + script.js
  require_once('appvars.php'); //pozostałe deklaracje
  require_once('connectvars.php'); //deklaracja stałych do połączenia z bazą
  $redirectURL = 'zarejestrowano.php';//przekierowanie do strony w sytuacji poprawnej rejestracji użytkownika
  $errors = array();//deklaracja tabicy do przechowywania błędów

//zmienna do połączenia z bazą
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die('Error connecting to MySQL server.');

//w sytuacji, gdy kliknięto przycisk wyślij na formularzu pobieramy dane z formularza do zmiennych
  if (isset($_POST['submit'])) {
    // Pobieranie danych z tablicy POST.
    $login = mysqli_real_escape_string($dbc, trim($_POST['login']));
    $output_form = 'no';

//jeśli po kliknięciu wyślij jest pusty login
      if (empty($login))
      {
      // We know at least one of the input fields is blank
    $errors['login']='Proszę wpisać prawidłowy login.';
        $output_form = 'yes';
      }      
  }
  //w każdym innym przypadku wyświetl pusty formularz
  else
  {
    $output_form = 'yes';
  }
  // jeśli nie ma błędów w formularzu to
  if (!empty($login)) {
        
      // Sprawdzanie, czy dana nazwa nie jest już zajęta.
      $query = "SELECT * FROM users WHERE login = '$login'";
      $data = mysqli_query($dbc, $query);
      if (mysqli_num_rows($data) == 0) {        
        
    //jeśli nazwa nie jest zajęta to wpisujemy dane do bazy    
    $query = "INSERT INTO users (login, email, haslo1, imie, nazwisko, rejestracja)  VALUES ('$login', 'email', ('haslo'), 'Imię', 'Nazwisko', NOW())";
    mysqli_query($dbc, $query)
      or die ('Data not inserted.');

    echo '<p><strong>Dziękujemy za rejestrację. Twój login to:</strong> ' . $login . '<br />';
    
            // Usuwanie danych z formularza.
            $login = "";

    mysqli_close($dbc);
    exit();
  }
      else {
        // Dana nazwa jest już zajęta, dlatego należy wyświetlić komunikat o błędzie.
    $errors['login']='Wpisany login jest zajęty. Wpisz inny.';
        $login = "";
        $output_form = 'yes';
      }
  }
  
  //co wtedy, gdy zmienna output_form jest ustawiona na "yes"  
  if ($output_form == 'yes') {
?>

<div id="carbonForm">
    <h1>Rejestracja</h1>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" id="signupForm">
    <div class="fieldContainer">
        <div class="formRow">
            <div class="label">
                <label for="login">Login:</label>
            </div>
            
            <div class="field">
                <input type="text" name="login" id="login" value="<?php if (!empty($login)) echo $login; ?>" />
            </div>
        </div>          
    </div> <!-- Closing fieldContainer -->
    <div class="signupButton">
        <input type="submit" name="submit" id="submit" value="Zarejestruj" />
    </div>
    </form>  
</div>
<?php
  }

//Co w przypadku gdy w przeglądarce włączony jest JS
if($_POST['fromAjax'])
{
    if(count($errors))
    {
        $errString = array();
        foreach($errors as $k=>$v)
        {
            // The name of the field that caused the error, and the
            // error text are grouped as key/value pair for the JSON response:
            $errString[]='"'.$k.'":"'.$v.'"';
        }
        
        // JSON error response:
        die    ('{"status":0,'.join(',',$errString).'}');
    }
    
    // JSON success response. Returns the redirect URL:
    echo '{"status":1,"redirectURL":"'.$redirectURL.'"}';

    exit;
}

//Działanie w przypadku wyłączonej obsługi JS
if(count($errors))
{
    echo '<h2>'.join('<br /><br />',$errors).'</h2>';
    exit;
}
?>


Plik script.js - jquery
Kod
$(document).ready(function(){
    // $(document).ready() is executed after the page DOM id loaded
    
    
    // Binding an listener to the submit event on the form:
    $('#signupForm').submit(function(e){

        // If a previous submit is in progress:
        if($('#submit').hasClass('active')) return false;
        
        // Adding the active class to the button. Will show the preloader gif:
        $('#submit').addClass('active');
        
        // Removing the current error tooltips
        $('.errorTip').remove();
        
        // Issuing a POST ajax request to submit.php (the action attribute of the form):
        $.post($('#signupForm').attr('action'),$('#signupForm').serialize()+'&fromAjax=1',function(response){
            
            if(!response.status)
            {
                // Some kind of input error occured
                
                // Looping through all the input text boxes,
                // and checking whether they produced an error
                $('input[type!=submit]').each(function(){
                    var elem = $(this);
                    var id = elem.attr('id');
                    
                    if(response[id])
                        showTooltip(elem,response[id]);
                });
            }
            else location.replace(response.redirectURL);
            
            $('#submit').removeClass('active');
        },'json');
        
        e.preventDefault();
    });
    
    $(window).resize();
});

// Centering the form vertically on every window resize:
$(window).resize(function(){
    var cf = $('#carbonForm');
    
    $('#carbonForm').css('margin-top',($(window).height()-cf.outerHeight())/2)
});

// Helper function that creates an error tooltip:
function showTooltip(elem,txt)
{
    // elem is the text box, txt is the error text
    $('<div class="errorTip">').html(txt).appendTo(elem.closest('.formRow'));
}


Z góry dziękuję za pomoc przy poprawie pliku JS.

Pozdrawiam
lukesh
Cześć! Robiłem ostatnio własnie taki skrypt. Poniżej zamieszczę moje szkice. Jak chcesz - zerknij, jak ja to wszystko rozwiązalem. Najpierw podajesz dane w formularzu, potem skrypt przesyła dane do serwera za pomocą jQuery/AJAX i odbiera dane ze skrptu PHP w formie JSON, analizuje je i zmienia, jeśli coś trzeba zmienić, a jeśli wszystko jest OK, odsyła użytkownika na inną stronę.

Formularz:

  1. <div class="msgbox">Konto zostało utworzone!<br />Na Twój adres e-mail został wysłany list z linkiem aktywującym.</div>
  2. <div><label>Użytkownik:</label><input type="text" id="name" name="name" /></div>
  3. <div class="errorbox" id="nameerrorbox"></div>
  4. <div><label>Mail-Addresse:</label><input type="text" id="email" name="email" /></div>
  5. <div class="errorbox" id="emailerrorbox"></div>
  6. <div><label>Passwort:</label><input type="password" id="password" name="password" /></div>
  7. <div class="errorbox" id="passworderrorbox"></div>
  8. <div><img src="img/loader.gif" id="loader" style="display:block;margin: 0 auto;visibility:hidden;" alt="loader" /></div>
  9. <div><input type="submit" value="Account erstellen" /></div>
  10. </form>


Skrypt JS (na tej samej stronie, co formularz):

  1. $(document).ready(function(){
  2. $('form').submit(function(e){
  3. e.preventDefault();
  4. $('#loader').css('visibility', 'visible');
  5. $.post('app.php?do=signup', $('form').serialize(), function(data){
  6. try{
  7. var obj = jQuery.parseJSON(data);
  8. process(obj);
  9. }catch(e){
  10. alert(data);
  11. $('#loader').css('visibility', 'hidden');
  12. }
  13. function process(obj){
  14. if(obj.error){
  15. if(typeof obj.email != 'undefined'){
  16. $('#emailerrorbox').html(obj.email);
  17. $('#email').addClass('error');
  18. }else{
  19. $('#email').addClass('ok');
  20. $('#emailerrorbox').empty();
  21. }
  22. if(typeof obj.password != 'undefined'){
  23. $('#passworderrorbox').html(obj.password);
  24. $('#password').addClass('error');
  25. }else{
  26. $('#password').addClass('ok');
  27. $('#passworderrorbox').empty();
  28. }
  29. if(typeof obj.name != 'undefined'){
  30. $('#nameerrorbox').html(obj.name);
  31. $('#name').addClass('error');
  32. }else{
  33. $('#name').addClass('ok');
  34. $('#nameerrorbox').empty();
  35. }
  36. $('#loader').css('visibility', 'hidden');
  37. }else{
  38. if(obj.db == 'success'){
  39. $('form :input').attr('disabled', true);
  40. $('form input').addClass('ok');
  41. $('.errorbox').empty();
  42. $('#loader').css('visibility', 'hidden');
  43.  
  44. $('.msgbox').slideDown();
  45. }else{
  46. alert(obj.db);
  47. $('#loader').css('visibility', 'hidden');
  48. }
  49. }
  50. }
  51. });
  52. });
  53. });


  1. <?php
  2. // ARE ALL VALUES SET?
  3. if (!isset($_POST['email']) && !isset($_POST['password']) && !isset($_POST['name'])){die();}
  4. // ================================================================================
    ====================
  5. // error STATUS
  6. $data['error'] = false;
  7. // E-MAIL VALIDATION
  8. if ($_POST['email']){
  9. if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
  10. $data['error'] = true;
  11. $data['email'] = 'Podaj prawidłowy adres email!';
  12. }else{
  13. // $email VARIABLE
  14. $email = $_POST['email'];
  15. connect();
  16. $sql = mysql_query("SELECT COUNT(*) FROM users WHERE email='$email' LIMIT 1");
  17. if (mysql_result($sql, 0) > 0){
  18. $data['error'] = true;
  19. $data['email'] = 'Ten adres e-mail jest już w bazie!';
  20. }
  21. }
  22. }else{
  23. $data['error'] = true;
  24. $data['email'] = 'Podaj adres e-mail!';
  25. }
  26. // PASSWORD VALIDATION
  27. if ($_POST['password']){
  28. if(strlen($_POST['password']) < 3){
  29. $data['error'] = true;
  30. $data['password'] = 'Hasło powinno składać się z przynajmniej 3 znaków!';
  31. }else{
  32. // $password VARIABLE
  33. $password = md5($_POST['password']);
  34. }
  35. }else{
  36. $data['error'] = true;
  37. $data['password'] = 'Podaj hasło!';
  38. }
  39. // NAME VALIDATION
  40. if ($_POST['name']){
  41. if(!preg_match('~^[a-ząęćłńśźżA-ZĄĘĆŁŃŚŹŻ0-9_-\s]{3,32}$~u', $_POST['name'])){
  42. $data['error'] = true;
  43. $data['name'] = 'Niepoprawna nazwa użytkownika!';
  44. }else{
  45. // $name VARIABLE
  46. $name = filter_var($_POST['name'], FILTER_SANITIZE_STRING);
  47. connect();
  48. $sql = mysql_query("SELECT COUNT(*) FROM users WHERE name='$name' LIMIT 1");
  49. if (mysql_result($sql, 0) > 0){
  50. $data['error'] = true;
  51. $data['name'] = 'Wybrana nazwa użytkownika jest już zajęta!';
  52. }
  53. }
  54. }else{
  55. $data['error'] = true;
  56. $data['name'] = 'Podaj swoje imię lub pseudonim!';
  57. }
  58. // ================================================================================
    ====================
  59. // VALIDATION
  60. if ($data['error']){
  61. echo json_encode($data);
  62. }else{
  63. connect();
  64. // $confirmcode VERIABLE
  65. $regdate = date("Y-m-d");
  66. $confirmcode = md5(uniqid(rand(), true));
  67. $sql = mysql_query("INSERT INTO users (email, password, name, regdate, status, confcode) VALUES ('$email', '$password', '$name', '$regdate', 0, '$confirmcode')");
  68. if ($sql){
  69. $subject = 'Witaj w serwisie imemo.pl!';
  70. $message = 'Dziękujemy za rejestrację w serwisie http://...............pl!'
  71. ."\r\n\r\n".'Kliknij w poniższy link, aby potwierdzić swój adres e-mail:'
  72. ."\r\n\r\n".'http://................pl/?go=signin&confirm='."$confirmcode";
  73. $headers = "Content-type: text/plain; charset=utf-8\r\n";
  74. $headers .= 'From: kontakt@................pl' . "\r\n" .
  75. 'Reply-To: kontakt@................pl' . "\r\n" .
  76. 'X-Mailer: PHP/' . phpversion();
  77. mail($email, $subject, $message, $headers);
  78. $data['db'] = 'success';
  79. echo json_encode($data);
  80. }else{
  81. $data['db'] = 'Wystąpił błąd bazy danych. Spróbuj ponownie!';
  82. echo json_encode($data);
  83. }
  84. }
  85. ?>


Powyższy skrypt tworzy tablicę, w której jest wartość error. Dodatkowo są dodawane informacje o konkretnych błedach. W JS, jeśli error=true, skrypt sprawdza, czy np. istnieje wartość password i jeśli tak, to znaczy, że hasło nie przeszło walidacji, dlatego zmienia się styl dla tego pola (dodaję czerwoną kropkę, a jak jest ok - zielony znaczek) i wyświetla się odpowiednia iformacja pod polem hasła.

Nie mogę zagwarantować, że nie ma tu żadnych błędów, ale u mnie działało dobrze.

Taki skrypt daje fajnie wyglądający efekt, tylko pytanie - po co? Moim zdaniem, to trochę za dużo grzebania się w kodzie, który do strony nie wnosi zbyt wiele. Teraz myśle to zmienić na normalny formularz ze zmienną POST. Ajax można zostawić, ale np. do sprawdzania, czy dana nazwa użytkownika/email są już zajęte. Wydaje mi się to bardziej praktycznie.

Poza tym, zauważyłem, że jeśli serwer zwalnia z jakiegoś powodu albo połęczenie internetowe niedomaga, użytkownik może się zastanawiać, czy coś się dzieje, czy nie... W przypadku przekierowania do innego pliku, każdy widzi, że coś się dzieje. Niby czasami takie skrypty oparte o AJAXa działają szybciej, ale ogólne wrażenie może pozostać, że wszystko dzieje się wolniej. Własnie przez to, że nie widać, żeby coś się zmieniało; nie widać, żeby ładowała się jakaś strona.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.