「データ ソース」が 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';
}