2009-12-26 96 views
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"; 
} 
?> 

这是我的用于插入登记表数据到数据库中的代码。这段代码添加了数据,但也给出了一个解析错误,但是如果用户名已经存在则不会给出错误。用户注册的PHP

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'"); 
+8

停止。现在不要试图解决这个问题。你有更严重的。您对SQL注入攻击广泛开放。切换到参数化查询:http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php – Quentin 2009-12-26 14:45:41

回答

2

如果 “数据源” 是(据说使用方法= “POST”)必须使用$ _POST [ '用户名']当register_globals的一个HTML形式设置为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"; 
} 
?> 

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

编辑和BTW:你不要在INSERT之前需要选择,以使用户名是唯一的。事实上,它会让事情变得更加困难,因为现在你必须处理race conditions。你必须在这两个查询之间锁定表格。
如果你对你的表MySQL不会让双峰的插入,而是返回一个特定的错误代码,脚本可以获取而无需处理竞态条件的处理的用户名添加unique index

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'; 
} 
9

那么,你的$username是不确定的确实。

最有可能要使用$_POST['username']

这种强制性XKCD漫画场和:

0

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

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

而且,你的代码很容易受到SQL Injection

0

你从来没有定义$username任何地方,因此它给出了错误,因为你要使用它的变量没有价值。

0

这很可能是因为你还没有定义的“$用户名”变量。我认为你依靠这个来自GET/POST数据的传入(很可能是通过折旧的register_globals),这是不好的做法。

因此,你需要通过$ _POST或$ _GET要么填充$用户名。

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

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和变量更改为任何你想要的!