0
<?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'");
4

6 回答 6

8

好吧,你$username的确实是未定义的。

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

当然还有这个强制性的XKCD漫画:

于 2009-12-26T14:43:50.673 回答
2

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

您还可以使用准备好的语句。这样你就不需要/不能忘记使用转义函数。

编辑和顺便说一句:您不需要 SELECT 在 INSERT 之前以使用户名唯一。实际上,这会使事情变得更加困难,因为现在您必须处理竞争条件。您必须在这两个查询之间锁定表。
如果您在表中为用户名添加唯一索引,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';
}
于 2009-12-26T14:43:17.913 回答
0

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

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

此外,您的代码容易受到SQL 注入的攻击

于 2009-12-26T14:43:58.163 回答
0

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

于 2009-12-26T14:44:49.220 回答
0

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

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

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

于 2009-12-26T14:47:08.420 回答
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 和变量更改为您想要的任何内容!

于 2017-02-06T17:44:09.527 回答