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

Ceci est mon code pour insérer des données de formulaire d'enregistrement dans une base de données. Ce code ajoute les données mais donne également une erreur d'analyse, mais ne donne pas l'erreur si le nom d'utilisateur existe déjà.enregistrement d'utilisateur php

Notice: Undefined variable: username in C:\Program Files\EasyPHP5.3.0\www\register_hirer2.php on line 6 
Thanks for registration 

ligne 6 est:

$checkusername=mysql_query("SELECT * FROM employer WHERE eusername='$username'"); 
+8

Arrêt. N'essayez pas de résoudre ce problème maintenant. Vous avez plus sérieux. Vous êtes ouvert pour une attaque d'injection SQL. Passer aux requêtes paramétrées: http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php – Quentin

Répondre

2

Si la "source de données" est un formulaire HTML (en utilisant soi-disant method = "post"), vous devez utiliser $ _POST [ 'username'] lorsque register_globals est défini sur off (qui est la valeur par défaut depuis ... âges). voir http://docs.php.net/security.globals
ont également une lecture de 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"; 
} 
?> 

Vous pouvez également utiliser prepared statements. De cette façon, vous n'avez pas besoin/ne peut pas oublier d'utiliser une fonction d'échappement.

éditer et btw: vous n'avez pas besoin du SELECT avant l'INSERT afin de rendre le nom d'utilisateur unique. En fait, cela rendra les choses encore plus difficiles puisque maintenant vous devez faire face à race conditions. Vous devez verrouiller la table entre ces deux requêtes.
Si vous ajoutez un unique index pour le nom d'utilisateur dans votre table, MySQL n'autorisera pas l'insertion d'un doublet mais retournera un code d'erreur spécifique que votre script peut récupérer et traiter sans avoir à gérer les conditions de course.

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

Eh bien, votre $username est en effet indéfini.

Très probablement, vous souhaitez utiliser $_POST['username'].

Et bien sûr, cette bande dessinée obligatoire XKCD:

0

C'est parce que vous ne définissez pas $username partout. Il semble que si vous voulez utiliser $_POST['username']

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

En outre, votre code est vulnérable à un SQL Injection

0

Vous ne définissez nulle part $username, il donne cette erreur parce que vous essayez d'utiliser une variable que n'a pas de valeur pour.

0

Ceci est probablement dû au fait que vous n'avez pas défini la variable "$ username". Je suppose que vous vous fiez à cette information provenant des données GET/POST entrantes (très probablement via les register_globals dépréciés), ce qui est une mauvaise pratique. En tant que tel, vous devrez soit remplir $ username via $ _POST ou $ _GET. Plus important encore, vous devez mettre à jour la requête d'insertion pour échapper les données entrantes 'non fiables' en utilisant mysql_real_escape_string (par exemple: mysql_real_escape_string ($ _ POST ['nom d'utilisateur']), etc.)

0

Comme @Yacoby dit que votre code est vulnérable à une injection SQL pour l'empêcher, vous pouvez utiliser mysqli ou AOP, si vous souhaitez utiliser mysqli utiliser le code suivant:

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

ASSUREZ-VOUS CHANGEZ le $ conn ET les variables pour ce que vous voulez!

Questions connexes