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";
}
?>

準備済みステートメントも使用できます。この方法では、エスケープ関数を使用する必要はありません/忘れることはできません。

編集とところで:ユーザー名を一意にするために、INSERTの前にSELECTは必要ありません。実際には、競合状態に対処する必要があるため、事態はさらに難しくなります。これら 2 つのクエリの間でテーブルをロックする必要があります。テーブルにユーザー名の一意のインデックス
を追加すると、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 に答える