2016-07-30 4 views
5

Проблема в том, что код не может проверить, было ли уже выполнено имя пользователя, есть ли в базе данных какой-либо код, который может проверить имя пользователя?PHP и MySQL - Проверьте, не найдено ли имя пользователя

Я экспериментирую с некоторыми из моих кодов, а затем, вероятно, искал его и в Stack Overflow об этой проблеме. Я пробовал это solution, но, видимо, это дает мне ошибки. Когда я попробовал это, предупреждение:

mysql_query() expects parameter 2 to be resource, object given in C:... on line ...

и проблема

mysql_num_rows() expects parameter 1 to be resource, null given in C:... on line ...

Я на самом деле ищу решение для этой проблемы или учебник, как решить эту проблему.

Мой код:

<?php 
    require_once("functions.php"); 
    require_once("db-const.php"); 
    session_start(); 
    if (logged_in() == true) { 
     redirect_to("profile.php"); 
    } 
?> 
<?php 
?> 
<html> 
<head> 
    <title>Prospekt Member Area</title> 
</head> 
<body> 
<h1> Register Here </h1> 
<h2>&copy; Kirk Niverba</h2> 
<hr /> 
<!-- The HTML registration form --> 
<form action="<?=$_SERVER['PHP_SELF']?>" method="post"> 
    Username: <input type="text" name="username" /><br /> 
    Password: <input type="password" name="password" /><br /> 
    First name: <input type="text" name="first_name" /><br /> 
    Last name: <input type="text" name="last_name" /><br /> 
    Email: <input type="type" name="email" /><br /> 

    <input type="submit" name="submit" value="Register" /> 
    <a href="login.php">Already have an account?</a> 
</form> 
<?php 
if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
    if (empty($_POST['username']) || empty($_POST['password']) || empty($_POST['first_name']) || empty($_POST['last_name']) || empty($_POST['email'])) { 
     echo "Please fill all the fields!"; 
    } 
elseif (isset($_POST['submit'])) { 
## connect mysql server 
    $mysqli = new mysqli(localhost, root, "", loginsecure); 
    # check connection 
    if ($mysqli->connect_errno) { 
     echo "<p>MySQL error no {$mysqli->connect_errno} : {$mysqli->connect_error}</p>"; 
     exit(); 
    } 
## query database 
    # prepare data for insertion 
    $username = $_POST['username']; 
    $mainpass = $_POST['password']; 
    $password = hash('sha256', $mainpass); 
    $first_name = $_POST['first_name']; 
    $last_name = $_POST['last_name']; 
    $email  = $_POST['email']; 

    # check if username and email exist else insert 
    // u = username, e = emai, ue = both username and email already exists 
    $user = $_POST['username']; 
    $usernamecheck=mysql_query("SELECT username FROM users WHERE username='$user'", $mysqli); 
     if (mysql_num_rows($usernamecheck)>=1){ 
    echo $user." is already taken"; 
} 
    else{ 
     # insert data into mysql database 
     $sql = "INSERT INTO `users` (`id`, `username`, `password`, `first_name`, `last_name`, `email`) 
       VALUES (NULL, '{$username}', '{$password}', '{$first_name}', '{$last_name}', '{$email}')"; 

     if ($mysqli->query($sql)) { 
      header("Location: checklogin.php?msg=Registered Successfully!"); 
     } else { 
      echo "<p>MySQL error no {$mysqli->errno} : {$mysqli->error}</p>"; 
      exit(); 
     } 
    } 
} 
} 
?> 
<hr /> 
</body> 
</html> 
+1

вы смешиваете '' mysqli' и mysql' функция - держать в одной или другой, prefably 'mysqli' и использовать подготовленные заявления, а не непосредственно вложение переменных в SQL. Также я замечаю, что ваше использование фигурных скобок немного «ударило или пропустило» - я подозреваю, что логика не работает правильно в коде, потому что вы, похоже, не балансируете их – RamRaider

+1

Предупреждение: ваш код уязвим для [SQL-инъекций ] (https://en.wikipedia.org/wiki/SQL_injection). Пожалуйста, прочитайте [этот пост] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php), чтобы узнать больше о том, как его предотвратить. – Pang

+0

virtualAon, пожалуйста, проверьте приведенный ниже ответ и отметьте и подтвердите один ответ, как принято. вы можете проголосовать за других, если они тоже полезны. thkan –

ответ

2

В качестве примера того, как использовать подготовленный вы могли бы использовать следующие (не тестировалось btw)

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

Я также заметил, что параметры для соединения mysqli не были указаны - если они были определены как константы, тогда это было бы хорошо, иначе это тоже вызвало бы ошибки.

Держите до mysqli или pdo - так как вы можете лучше защитить свои сайты от злонамеренных пользователей, когда принимаете подготовленные заявления, как я пытался показать здесь.

<?php 
    require_once("functions.php"); 
    require_once("db-const.php"); 
    session_start(); 

    if (logged_in() == true) { 
     redirect_to("profile.php"); 
    } 

    $errors=array(); 

    if($_SERVER['REQUEST_METHOD'] == 'POST') { 

     if(isset($_POST['username'], $_POST['password'], $_POST['first_name'], $_POST['last_name'], $_POST['email'])) { 

      $username = !empty($_POST['username']) ? $_POST['username'] : false; 
      $mainpass = !empty($_POST['password']) ? $_POST['password'] : false; 
      $password = !empty($mainpass) ? hash('sha256', $mainpass) : false; 
      $first_name = !empty($_POST['first_name']) ? $_POST['first_name'] : false; 
      $last_name = !empty($_POST['last_name']) ? $_POST['last_name'] : false; 
      $email  = !empty($_POST['email']) ? $_POST['email'] : false; 

      if($username && $password){ 
       $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); 
       if($mysqli->connect_errno) { 
        $errors[]=$mysqli->connect_error; 
       } else { 

        /* Assume all is ok so far */ 
        $sql='select username from users where username=?'; 
        $stmt=$mysqli->prepare($sql); 
        $stmt->bind_param('s',$username); 
        $stmt->execute(); 

        $stmt->bind_result($found); 
        $stmt->fetch(); 

        if(!$found){ 
         /* username is not alreday taken */ 

         $sql='insert into `users` (`username`,`password`,`first_name`,`last_name`,`email`) values (?,?,?,?,?);'; 
         $stmt=$mysqli->prepare($sql); 
         $stmt->bind_param('sssss',$username,$password,$first_name,$last_name,$email); 
         $stmt->execute(); 

         header("Location: checklogin.php?msg=Registered Successfully!"); 
        } else { 
         /* username is taken */ 
         $errors[]='Sorry, that username is already in use.'; 
        } 
       } 
      } 
     } else { 
      $errors[]='Please fill in all details'; 
     } 
    } 
?> 
<html> 
    <head> 
     <title>Prospekt Member Area</title> 
    </head> 
    <body> 
     <h1> Register Here </h1> 
     <h2>&copy; Kirk Niverba</h2> 
     <hr /> 

     <!-- The HTML registration form --> 
     <form action="<?=$_SERVER['PHP_SELF']?>" method="post"> 
      Username: <input type="text" name="username" /><br /> 
      Password: <input type="password" name="password" /><br /> 
      First name: <input type="text" name="first_name" /><br /> 
      Last name: <input type="text" name="last_name" /><br /> 
      Email: <input type="type" name="email" /><br /> 

      <input type="submit" name="submit" value="Register" /> 
      <a href="login.php">Already have an account?</a> 
     </form> 
     <?php 
      if(!empty($errors)){ 
       echo implode('<br />', $errors); 
      } 
     ?> 
     <hr /> 
    </body> 
</html> 
+0

Спасибо за код, я очень ценю его. но я столкнулся с проблемами. Я не мог зарегистрироваться, проблема в том, что: Неустранимая ошибка: вызов функции-члена bind_param() в boolean в C: \ ... в строке 40, и когда поля не заполняются, ошибка не появляется («Пожалуйста, заполните все поля!») – virtualAnon

+0

Я замечаю, что есть файл 'db-const.php' ~, который вы указали, указали ли вы в этом файле константы, относящиеся к серверу, пользователю, паролю и db? В вашем исходном коде кажется, что они являются константами, но я, предположительно ошибочно, предположил, что они просто были не отсортированы в конструкторе mysqli. Если они определены как константы, удалите кавычки из аргументов конструктора, как вы это делали, и попробуйте это. – RamRaider

+0

Код в "constant", как вы говорите. Эти коды:? ' ' – virtualAnon

3

В строках вы получаете ошибки, заменить "mysql_query" для "mysqli_query" и "mysql_num_rows" для "mysqli_num_rows". Это связано с тем, что вы не можете смешивать вызовы mysql с соединениями mysli.

+0

Я пробовал, но он показывает: Предупреждение: mysqli_query() ожидает, что параметр 1 будет mysqli, строка задана в C: \ .. . on line 55 – virtualAnon

+0

Поскольку mysqli_query ожидает параметры в обратном порядке.$ Mysqli в качестве первого параметра и строка запроса в качестве второго параметра. –

+0

@virtualAnon вы пробовали мое решение? –

1

Это может быть удобно с mysql уникальное ограничение.

username varchar(50) NOT NULL, 
//other fields, 
UNIQUE (username) 

Для PHP части, вы можете использовать mysql_query для выбора нужного пользователя, чтобы проверить и отправить форму, только если mysql_num_rows возвращает 0.

+0

Это в основном хороший совет, но вы не должны использовать mysql-расширение для PHP, потому что оно устарело. Вместо этого используйте PDO или MySQLi. Кроме того, вы должны использовать 'SELECT COUNT (*)' – Stefan

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