2015-08-26 13 views
0

我想從數據庫中調用數據後張貼在

當有人使用此代碼登錄:閱讀從數據庫郵件沒有@或

function login($email, $password, $mysqli) 
    { 
     // Using prepared statements means that SQL injection is not possible. 
     if ($stmt = $mysqli->prepare("SELECT id, username, password, salt, phnumber, realname, age, sex FROM members WHERE email = ? LIMIT 1")) { 

      $stmt->bind_param('s', $email); // Bind "$email" to parameter. 
      $stmt->execute(); // Execute the prepared query. 
      $stmt->store_result(); 

      // get variables from result. 
      $stmt->bind_result($user_id, $username, $db_password, $salt, $phnumber, $realname, $age, $sex); 
      $stmt->fetch(); 
      } 
    } 

然後我用設置電子郵件,姓名等變量驗證碼:

$realname = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $realname);   
$_SESSION['realname'] = $realname; 
$email = preg_replace("/\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b/", "", $email);   
$_SESSION['email'] = $email; 

後來,當我回憶起使用print_r($_SESSION);電子郵件張貼不@或所有變量。例如:johnsmithyahoocom並且該名稱的發佈沒有像JohnSmith這樣的空間,這是不可取的。
如何讓它發佈正確的電子郵件地址和名稱之間的空格?

+0

在將信息放入數據庫之前,您應該驗證您的輸入,而不是在出路 – BobbyTables

+0

@zedd在輸入數據之前使用Javascript進行驗證,並在數據庫中驗證它是否爲'johnsmith @ yahoo.com'我只是不能回想一下,它沒有@或者是張貼的。並且名稱沒有空格發佈。 –

+0

如果這個正則表達式被用來「清理」電子郵件地址,那麼你在那裏遇到了一堆問題......嘗試比用戶更聰明並「修復」他們的輸入永遠不是一個好主意。你會失敗。例如,TL​​D可以有4個以上的字符,一個域可以有兩個以上的標籤... – arkascha

回答

0

爲什麼使用preg_replace?

如果您已經在使用數據庫,我建議您只在SESSION中存儲用戶標識,並在需要用戶信息時從數據庫中獲取其他數據。

+0

我使用pref_replace作爲XSS保護。即使我刪除它,它仍然不會發布@,「。」或空間。 –

+0

爲XSS保護使用PHP函數[htmlspecialchars](http://php.net/manual/de/function.htmlspecialchars.php)。數據庫中的值是否正確?如果不是,則在調用登錄函數之前,問題就在於此。您必須已經過濾了@和「。」在將值保存到數據庫之前 –

+0

我在調用數據時使用'htmlspecialchars'和'htmlentities'。但是,這仍然沒有發佈正確的電子郵件形式或空間。 –

0

對不起,浪費你的時間在這
一切都進行得很順利,我不得不重新登錄申請我做
/\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b/工作正常變化,並從數據庫中調出正確的電子郵件的形式我不得不重新啓動SESSION到看到我改變了。