2014-02-20 28 views
0

我是一個完全在PHP的初學者,所以我需要幫助我的註冊腳本。我有4個字段,1個用戶名(在電子郵件地址後面轉換),1個當前郵箱地址和2個密碼字段。註冊工作正常,我只想在存在或不存在的情況下添加用戶名的驗證。我的問題是我不知道在哪裏以及如何去做,我應該創建一個函數嗎?怎麼樣?我想保持簡單,所以我沒有創建任何類型的會話,是否有可能沒有,因爲? 這裏是代碼:如何使用php pdo連接檢查mysql中的值?

<?php 

$host = '127.0.0.1'; 
$dbuser = 'reguser'; 
$dbpass = 'regpass'; 
$dbn = 'regform'; 


$conn = new PDO("mysql:host=$host;dbname=$dbn", $dbuser, $dbpass); 


$RegScrIdErr = $RegScrIdChrErr = $OwnAddressErr = $Password1Err = $Password2Err =  $PasswordMErr = ""; 

$formValid = true; 

if ($_SERVER["REQUEST_METHOD"] == "POST") { 
if (empty($_POST["RegScrId"])) {$RegScrIdErr = "Userame is required"; $formValid = false;} 
    else {$RegScrId = check_input($_POST["RegScrId"]); 
     if (!preg_match("/^[a-zA-Z0-9]*$/",$RegScrId)){$RegScrIdErr = "Only letters and numbers allowed"; $formValid = false;} 

      } 

if (empty($_POST["OwnAddress"])) {$OwnAddressErr = "Email is required"; $formValid = false;} 
    else {$OwnAddress = check_input($_POST["OwnAddress"]); 
     if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$OwnAddress)){$OwnAddressErr = "Invalid email format"; $formValid = false;} 
} 

    if (empty($_POST["Password1"])) {$Password1Err = "Password field can't be empty!"; $formValid = false;} 
    else {$Password1 = check_input($_POST["Password1"]);} 
    if (empty($_POST["Password2"])){$Password2Err = "Password Confirmation can't be empty!"; $formValid = false;} 
    else {$Password2 = check_input($_POST["Password2"]); 
     if ($_POST["Password1"]!= $_POST["Password2"]) {$PasswordMErr = "Password does not match!"; $formValid = false;} 
} 
     if ($formValid) { header('Location: index.html'); } 
} 




function check_input($data){ 
$data = trim($data); 
$data = stripslashes($data); 
$data = htmlspecialchars($data); 
return $data; 
} 




$RegScrIdFull = "[email protected]"; 
$userIp = $_SERVER['REMOTE_ADDR']; 
$hash = hash('sha1', $Password1); 

FUNCTION createSalt(){ 
    $text = md5(uniqid(rand(), TRUE)); 
    RETURN substr($text, 0, 3); 
} 
$salt = createSalt(); 
$PasswordSec = hash('sha256', $salt . $hash); 

if ($formValid) { 

    $qry = $conn->PREPARE('INSERT INTO userlist (RegScrId, password, email, userIp, salt) VALUES (?, ?, ?, ?, ?)'); 
    $qry->EXECUTE(array($RegScrIdFull, $hash, $OwnAddress, $userIp, $salt)); 
    $conn = null; 

} 
    ?> 


    <div id="wrapper"> 
    <header><img src="img/logo3.png" width="170" height="110" /><br><br> 
    </header><br> 
    <div id="section_contact"> 
    <form name="register" method="post" action="<?php echo $_SERVER["PHP_SELF"];?>"><br /> 
      <table width="850" border="0" id="tb-form"> 
     <tr> 
       <td class="tb-form-left" colspan="2"><h4><strong>Sign Up</strong></h4><br /></td> 
     </tr> 
     <tr> 
     <td class="tb-form-left"><input type="text" name="OwnAddress" maxlength="30" placeholder=" Own Email Address" value="<?php echo $ $OwnAddress;?>" /><span class="error"><?php echo $OwnAddressErr;?></span></td> 
     </tr> 
     <tr> 
     <td class="tb-form-left"><input type="text" class="RegScrIdPic" maxlength="28" name="RegScrId" id="email" placeholder=" RegScrserver Username" value="<?php echo $RegScrId;?>" /><span class="error"><?php echo $RegScrIdErr;?><?php echo $RegScrIdChrErr;?></span></td> 
     </tr> 
     <tr> 
     <td class="tb-form-left"><input type="password" name="Password1" placeholder=" Enter Password"/><span class="error"><?php echo $Password1Err;?></span></td> 
     </tr> 
     <tr> 
     <td class="tb-form-left"><input type="password" name="Password2" placeholder=" Confirm Password" /><span class="error"><?php echo $Password2Err;?><?php echo $PasswordMErr;?></span></td> 
     </tr> 
     <tr> 
     <td class="tb-form-left"><input id="form-btn" type="submit" value="Create Account" /></td> 
     </tr> 
     </table> 
</form> 
</div> 


</div> 


</div> 
</body> 
</html> 
+0

你需要做'select',看看用戶名存在。但是這有點讓人費解,並且如果某些其他註冊並行運行的速度比這個更快,可能會導致用戶名被「狙擊」出來。 –

+0

當然,我需要一個選擇,我的問題是我如何在我的腳本中實現..?我如何顯示該用戶在輸入字段旁邊?否則,用相同的用戶名進行平行註冊,在我的情況下很難發生,但感謝指出它。 – raklik

回答

0

如果要在用戶名存在於數據庫中,你首先要問的數據庫用戶名是否真的存在實現驗證。您的插入之前,你應該使用SELECT查詢

$sth = $conn->prepare('SELECT id FROM users WHERE username=:username'); 
$sth->bindValue(':username',$username,PDO::PARAM_STR); 
sth->execute(); 
while($row = $sth->fetch()){ 
    /// ....... here you get username 
} 
// if in $row you get username you can use now validation for example 
if(!empty($row)){ 
    my_validation_function(); 
} 
else{ 
    // we dont want approaching form so we redirect customer to some page 
    header('location: some url'); 
} 


if ($formValid) { 


    $qry = $conn->PREPARE('INSERT INTO userlist (RegScrId, password, email, userIp, salt) VALUES (?, ?, ?, ?, ?)'); 
    $qry->EXECUTE(array($RegScrIdFull, $hash, $OwnAddress, $userIp, $salt)); 
    $conn = null; 

} 
+0

感謝您的快速回答,我以爲我必須做我的分貝選擇,也許我沒有完成的問題,因爲你可以看到我的腳本我扔驗證錯誤消息旁邊的輸入字段,我會喜歡在用戶存在的情況下做同樣的事情,不要將它們重定向到另一個頁面,或者它們丟失已經插入的內容。 – raklik