用户注册php

时间:2009-12-26 14:39:32

标签: php mysql registration

<?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 个答案:

答案 0 :(得分:8)

嗯,你的$username确实未定义。

很可能您想使用$_POST['username']

当然这是强制性的XKCD漫画:

答案 1 :(得分:2)

如果“数据源”是一个html表单(假设使用method =“post”),当register_globals设置为off时,你必须使用$ _POST ['username'](这是默认的。 ..ages)。见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";
}
?>

您也可以使用prepared statements。这样你就不需要/不能忘记使用转义函数了。

编辑和顺便说一下:在INSERT之前不需要SELECT以使用户名唯一。实际上,由于现在你必须处理race conditions,这将使事情变得更加艰难。您必须在这两个查询之间锁定表格 如果在表中为用户名添加unique 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';
}

答案 2 :(得分:0)

这是因为你没有在任何地方定义$username。看起来好像要使用$_POST['username']

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

此外,您的代码容易受到SQL Injection

的攻击

答案 3 :(得分:0)

你永远不会在任何地方定义$username,所以它会给出错误,因为你试图使用一个没有值的变量。

答案 4 :(得分:0)

这很可能是因为您没有定义'$ username'变量。我认为你依赖于从传入的GET / POST数据填充(很可能是通过折旧的register_globals),这是不好的做法。

因此,您需要通过$ _POST或$ _GET填充$ username。

更重要的是,您应该使用mysql_real_escape_string更新插入查询以转义传入的“不受信任”数据(例如:mysql_real_escape_string($ _ POST ['username'])等。)

答案 5 :(得分:0)

由于@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和变量更改为您想要的任何内容!