2015-05-19 2 views
0

У меня есть небольшой вопрос.Сценарий не вставляет данные [MySQL/PHP]

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

Код:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 

<?php 
$usernameErr = $emailErr = $passwordErr = $password_valErr = ""; 
$username = $email = $password = $password_val = ""; 

if($_SERVER['REQUEST_METHOD'] == 'POST') { 
    if(empty($_POST['username'])) { 
     $usernameErr = "Name is required"; 
    } else { 
     $username = validate_input($_POST['username']); 
     if(strlen($username) <= 3) { 
      $usernameErr = "Username must be 4 characters or longer."; 
     } 
     if(strlen($username) > 26) { 
      $usernameErr = "Username can't be longer as 26 characters."; 
     } 
     if(!preg_match("/^[a-zA-Z ]*$/", $username)) { 
      $usernameErr = "Only letters and white space allowed."; 
     }  
    } 

    if(empty($_POST['email'])) { 
     $emailErr = "Email is required"; 
    } else { 
     $email = validate_input($_POST['email']); 
     if(!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
      $emailErr = "Invalid email format."; 
     }   
    } 

    if(empty($_POST['password'])) { 
     $passwordErr = "Password is required"; 
    } else { 
     $password = validate_input($_POST['password']); 
     if(strlen($password) <= 5) { 
      $passwordErr = "Password must be 6 characters or longer."; 
     } 
     if(strlen($password) > 26) { 
      $passwordErr = "Password can't be longer as 26 characters."; 
     } 
     if(!preg_match("#[0-9]+#", $password)) { 
      $passwordErr = "Password must contain atleast 1 number."; 
     } 
    } 

    if(empty($_POST['password_val'])) { 
     $password_valErr = "Password_val is required"; 
    } else { 
     $password_val = validate_input($_POST['password_val']); 
     if($password_val != $password) { 
      $password_valErr = "Password_val must be equal to password."; 
     }  
    } 

    if($usernameErr == '' && $emailErr == '' && $passwordErr == '' && $password_valErr == '') { 

     $check_user = mysqli_query($conn, "SELECT * FROM users WHERE username='".trim($username)."'"); 
     $check_mail = mysqli_query($conn, "SELECT * FROM users WHERE email='".trim($email)."'"); 

     if(mysqli_num_rows($check_user) > 0) { 
      echo 'This username allready exists'; 
     } elseif(mysqli_num_rows($check_mail) > 0) { 
      echo 'This email address is already registered.'; 
     } else { 
      $username = mysql_real_escape_string(trim($username)); 
      $email  = mysql_real_escape_string(trim($email)); 
      $password = mysql_real_escape_string(trim($password)); 
      $rand_salt = randString(); 

      /*$final_pass = password_hash($password_val, PASSWORD_DEFAULT)."\n";*/ 
      $final_pass = sha1($password.PASSWORD_SALT.$rand_salt); 
      $privileges = 0; 

      $sql = "INSERT INTO users (username,password,salt,email) 
        VALUES ('".$username."','".$final_pass."','".$rand_salt."','".$email."')"; 

      if($conn->query($sql) === TRUE) { 
       echo "User registered."; 

      } else { 
       echo 'Error: ' . $sql . '<br>' . $conn->error; 
      } 
     } 
    } 
} 
?> 

<table border="1"> 
    <tr> 
     <td><label>Username</label><?=' <b>' . $usernameErr . '</b>';?></td> 
     <td><input type="text" name="username" value="<?=$username;?>" placeholder="Enter your desired username..." /></td> 
    </tr> 
    <tr> 
     <td><label>E-mail</label><?=' <b>' . $emailErr . '</b>';?></td> 
     <td><input type="text" name="email" value="<?=$email;?>" placeholder="Enter your email address..." /></td> 
    </tr> 
    <tr> 
     <td><label>Password<?=' <b>' . $passwordErr . '</b>';?></label></td> 
     <td><input type="password" name="password" placeholder="Enter your desired password..." /></td> 
    </tr> 
    <tr> 
     <td><label>Repeat Password<?=' <b>' . $password_valErr . '</b>';?></label></td> 
     <td><input type="password" name="password_val" placeholder="Repeat your chosen password.." /></td> 
    </tr> 
    <tr> 
     <td><input type="submit" name="register" value="Register" /></td> 
    </tr> 
</table> 
</form> 

Этот код должен работать, но первая проблема заключается в:

action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" 

Этот код должен был бы отправить меня на ту же страницу, register.php в этом случае , но как-то он отправляет меня на страницу index.php. Таким образом, если удалить этот код и оставить действие пустым или просто ввести register.php там, данные Вставляется для пользователя и Email которые оба VARCHARS кроме ..

Я надеюсь, что кто-то может мне помочь,

спасибо!

+0

Вы смешиваете API/функции MySQL. не может этого сделать. –

+0

вы также можете просто «действовать =» «так же, как« я ». –

+0

Вы уязвимы для [SQL-инъекций] (http://bobby-tables.com). –

ответ

1

Вы используете функцию mysql_ вместе с подключением к API mysqli_.

Вы не можете смешивать эти функции. Вы должны использовать тот же API MySQL из соединения с запросом.

  • Вы должны изменить все экземпляры mysql_real_escape_string к mysqli_real_escape_string($conn, $_POST['variable'])

  • variable быть ваши POST массивы.

Plus, убедитесь, что вы действительно соединяясь с mysqli_ и не mysql_ или PDO по этому вопросу.

  • Неизвестно, с каким интерфейсом вы используете API MySQL, даже если ваш код содержит несколько функций mysqli_.

Добавить сообщение об ошибках в верхней части файла (ов) сразу после открытия PHP тега.

Например <?php error_reporting(E_ALL); ini_set('display_errors', 1); затем остальной части кода, чтобы увидеть, если он дает что-нибудь, , а также or die(mysqli_error($conn)) к mysqli_query().


Sidenote:sha1() не считается самым безопасным методом для хранения хэшей.

Выведено из ответа ircmaxell https://stackoverflow.com/a/29778421/ и с использованием PDO с подготовленными операциями и password_hash().

Просто используйте библиотеку. Шутки в сторону. Они существуют по какой-то причине.

  • PHP 5.5+: использовать password_hash()
  • PHP 5.3.7+: использовать password-compat (пакет обеспечения совместимости для указанных выше
  • Всех других: использовать phpass

Не делайте это самим Если вы создаете свои собственные. соль, ВЫ ДЕЛАЕТЕ ЭТО нЕПРАВИЛЬНО Вы должны использовать библиотеку, которая обрабатывает, что для вас

$dbh = new PDO(...); 

$username = $_POST["username"]; 
$email = $_POST["email"]; 
$password = $_POST["password"]; 
$hash = password_hash($password, PASSWORD_DEFAULT); 

$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?"); 
$stmt->execute([$username, $email, $hash]); 

И на входе:..

$sql = "SELECT * FROM users WHERE username = ?"; 
$stmt = $dbh->prepare($sql); 
$result = $stmt->execute([$_POST['username']]); 
$users = $result->fetchAll(); 
if (isset($users[0]) { 
    if (password_verify($_POST['password'], $users[0]->password) { 
     // valid login 
    } else { 
     // invalid password 
    } 
} else { 
    // invalid username 
} 
+0

Разве я не буду делать переменные? Так как я уже объявил тех и дал им $ _POST? – Peurr

+0

@ Возможно, вы могли бы, но тогда вы оставите себя открытым для SQL-инъекции. –

+0

Но что произойдет? Поскольку я уже объявлял переменные? Например: $ email = [email protected], и если после этого я буду делать mysqli_real_escape_string .. это сработает? – Peurr

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