регистрация пользователя php - PullRequest
0 голосов
/ 26 декабря 2009
<?php
include"include/connection.php";

$checkusername=mysql_query("SELECT * FROM employer WHERE eusername='$username'");
if (mysql_num_rows($checkusername)==1)
{
  echo "username already exist";
}
else
{
  $query = "insert into employer(efname,elname,egender,eemail,eusername,epwd,eadd,ephone,ecity,ecountry) values ('".$_POST['first_name']."','".$_POST['last_name']."','".$_POST['gender']."','".$_POST['email']."','".$_POST['username']."','".$_POST['password']."','".$_POST['address']."','".$_POST['phone']."','".$_POST['city']."','".$_POST['country']."')";
  $result = mysql_query($query) or die (mysql_error());
  echo " Thanks for registration";
}
?>

Это мой код для вставки данных регистрационной формы в базу данных. Этот код добавляет данные, но также выдает ошибку разбора, но не выдает ошибку, если имя пользователя уже существует.

Notice: Undefined variable: username in C:\Program Files\EasyPHP5.3.0\www\register_hirer2.php on line 6
Thanks for registration 

строка 6:

 $checkusername=mysql_query("SELECT * FROM employer WHERE eusername='$username'");

Ответы [ 6 ]

8 голосов
/ 26 декабря 2009

Ну, ваш $username действительно не определен.

Скорее всего, вы хотите использовать $_POST['username'].

И конечно этот обязательный XKCD комикс:

image

2 голосов
/ 26 декабря 2009

Если «источником данных» является html-форма (предположительно с использованием method = «post»), вы должны использовать $ _POST ['username'], когда для register_globals установлено значение off (что является значением по умолчанию, поскольку ... возрастов). см http://docs.php.net/security.globals
Также прочитайте http://php.net/manual/en/security.database.sql-injection.php

<?php
include"include/connection.php";

$query = "SELECT
    *
FROM
    employer
WHERE
    eusername='". mysql_real_escape_string($username). "'
";
$checkusername=mysql_query($query) or die(mysql_error());
if (mysql_num_rows($checkusername)==1)
{
  echo "username already exist";
}
else
{
  $query = "INSERT INTO employer(efname,elname,egender,eemail,eusername,epwd,eadd,ephone,ecity,ecountry) values (". same mysql_real_escape_string() thing here for each parameter .")";
  $result = mysql_query($query) or die (mysql_error());
  echo " Thanks for registration";
}
?>

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

edit and btw: вам не нужен SELECT перед INSERT, чтобы сделать имя пользователя уникальным. На самом деле это будет еще сложнее, так как теперь вам приходится иметь дело с условиями гонки . Вам придется заблокировать таблицу между этими двумя запросами.
Если вы добавите уникальный index для имени пользователя в вашей таблице, MySQL не разрешит вставку дублета, а вместо этого вернет определенный код ошибки, который ваш скрипт может извлекать и обрабатывать без необходимости иметь дело с условиями гонки.

define('ER_DUP_ENTRY', 1062);
$mysql = mysql_connect('..', '..', '..');
mysql_select_db('..', $mysql) or die(mysql_error($mysql));

$fields = array(
  'efname'=>'first_name',
  'elname'=>'last_name',
  'egender'=>'gender',
  'eemail'=>'email',
  'eusername'=>'username',
  'epwd'=>'password',
  'eadd'=>'address',
  'ephone'=>'phone',
  'ecity'=>'city',
  'ecountry'=>'country'
);

$sqlparams = array();
foreach($fields as $sql=>$form) {
  if ( !isset($_POST[$form]) ) {
    die('missing post parameter '. $form);
  }
  $sqlparams[$sql] = "'".mysql_real_escape_string($_POST[$form], $mysql)."'";
}  

$query = '
  INSERT INTO
    employer
    '. join(', ', array_keys($sqlparams)) .'
  VALUES
  ('.join(',', $sqlparams).')
';

// table:employer has been defined with "unique key idxName (eusername)"
$result = mysql_query($query, $mysql);
if ( false!==$result ) {
  echo " Thanks for registration";
}
else if ( ER_DUP_ENTRY===mysql_errno($mysql) ) {
  echo 'username already exists';
}
else {
  echo 'an error occurred';
}
0 голосов
/ 06 февраля 2017

Как сказал @Yacoby, ваш код уязвим для SQL-инъекций, чтобы предотвратить его, вы можете использовать mysqli или PDO, если вы хотите использовать mysqli, используйте следующий код:

<?php
include"include/connection.php";

$query = "SELECT
    *
FROM
    employer
WHERE
    eusername='". mysql_real_escape_string($username). "'
";
$checkusername=mysql_query($query) or die(mysql_error());
if (mysql_num_rows($checkusername)==1)
{
  echo "username already exist";
}
else
{
  $query = $conn->prepare("INSERT INTO employer(efname,elname,egender,eemail,eusername,epwd,eadd,ephone,ecity,ecountry)) values ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ?)"; // preparing the insert
$query->bind_param("ssssssssss" , $variable1 , $variable2 , $variable3 , $variable4 , $variable5 , $variable6 , $variable7 , $variable8 , $variable9 , $variable10); // binding parameters
  $query->execute(); // sending the parameter values 
  $query->close(); // closing the query
  $conn->close(); // closing the connection 
  if ($query) { // checking if the query has been executed with no errors
  echo " Thanks for registration";
 }
}
?>

ОБЯЗАТЕЛЬНО ИЗМЕНИТЕ $ conn И ПЕРЕМЕННЫЕ на то, что вы хотите!

0 голосов
/ 26 декабря 2009

Скорее всего, это потому, что вы не определили переменную $ username. Я полагаю, что вы полагаетесь на то, что это заполняется из входящих данных GET / POST (скорее всего через устаревшие register_globals), что является плохой практикой.

Таким образом, вам нужно либо заполнить $ username через $ _POST, либо $ _GET.

Что еще более важно, вы должны обновить запрос вставки, чтобы экранировать входящие «ненадежные» данные, используя mysql_real_escape_string (например, mysql_real_escape_string ($ _ POST ['username']) и т. Д.)

0 голосов
/ 26 декабря 2009

Вы никогда нигде не определяете $username, поэтому выдает эту ошибку, потому что вы пытаетесь использовать переменную, для которой у нее нет значения.

0 голосов
/ 26 декабря 2009

Это потому, что вы нигде не определяете $username. Похоже, вы хотите использовать $_POST['username']

mysql_query("SELECT * FROM employer WHERE eusername='{$_POST['username']}'");

Кроме того, ваш код уязвим для SQL-инъекции

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