[問題]重複的會員名稱

phpBB Installation & Usage Support
phpBB 2 安裝於各類型作業平台之問題討論;外掛問題,請到相關版面依發問格式發表!
(發表文章請按照公告格式發表,違者砍文)

版主: 版主管理群

版面規則
本區是討論關於 phpBB 2.0.X 架設安裝上的問題,只要有安裝任何外掛,請到外掛討論相關版面按照公告格式發表。
(發表文章請按照公告格式發表,違者砍文)
baboo
星球公民
星球公民
文章: 79
註冊時間: 2004-02-11 10:23

文章 baboo »

垃圾貓 寫:...我用了您的方法,然後還是用那個重複的ID,結果還是可以註冊,真傷腦筋。有一些中文名稱檢查的時候正常??
跑下面的程式看看... 把結果 po 出來... :-o

(存成一個php檔, 放在phpbb目錄裡面)
<?php
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
include($phpbb_root_path . 'includes/functions_validate.'.$phpEx);

$username = stripslashes("筱惠兒");
echo "username = [".$username."]<br>";
$doubleCheck = validate_username($username);
if ( $doubleCheck['error'] ) echo "dup username";
else echo "good username";
?>
對了, 先別把那兩個剛剛註冊的"筱惠兒"刪掉, 跑這個程式要用到...
垃圾貓
星球普通子民
星球普通子民
文章: 28
註冊時間: 2003-06-27 17:43
聯繫:

文章 垃圾貓 »

baboo 寫: 跑下面的程式看看... 把結果 po 出來... :-o
不好意思,我不清楚您的意思,可不可以說明的詳細一些,感激
圖檔
baboo
星球公民
星球公民
文章: 79
註冊時間: 2004-02-11 10:23

文章 baboo »

把上面列出來那段程式存成一個新的 .php 檔, 例: test.php
再把那個檔放在phpbb目錄裡面, 例: http://www.electone.idv.tw/phpbb/test.php

然後在IE(或其它...)裡面打入這個位置: http://www.electone.idv.tw/phpbb/test.php

再把螢幕上面顯示出來的結果 po 來這邊...
垃圾貓
星球普通子民
星球普通子民
文章: 28
註冊時間: 2003-06-27 17:43
聯繫:

文章 垃圾貓 »

baboo 寫:把上面列出來那段程式存成一個新的 .php 檔, 例: test.php
再把那個檔放在phpbb目錄裡面, 例: http://www.electone.idv.tw/phpbb/test.php

然後在IE(或其它...)裡面打入這個位置: http://www.electone.idv.tw/phpbb/test.php

再把螢幕上面顯示出來的結果 po 來這邊...
結果是:
username = [筱惠兒]
good username

突然想到之前做了一個MOD的修改:admin_prv http://phpbb-tw.net/phpbb/viewtopic.php ... =admin_prv
這個是之前的版本,做的時候事已經升級到2.0.11,所以這個MOD沒有作用,也沒沒有刪除\r
會不會改了這個才會有這個現象?謝謝幫忙
圖檔
baboo
星球公民
星球公民
文章: 79
註冊時間: 2004-02-11 10:23

文章 baboo »

垃圾貓 寫:結果是:
username = [筱惠兒]
good username

突然想到之前做了一個MOD的修改:admin_prv http://phpbb-tw.net/phpbb/viewtopic.php ... =admin_prv
這個是之前的版本,做的時候事已經升級到2.0.11,所以這個MOD沒有作用,也沒沒有刪除\r
會不會改了這個才會有這個現象?謝謝幫忙
應該不是, 那個 mod 沒有改到原來phpbb的東西.

看來那個檢查重複使用者名稱的部份有問題...
竟然已經重複兩次的名字還是ok...

去找找看以前裝的 mod, 把所有有動到
includes\usercp_register.php 跟 includes\functions_validate.php 的 mod 的鏈接都列出來.

或是, 最好能直接把所有裝過的 mod 的鏈接列出來... :p
~倉木麻衣~
竹貓忠實會員
竹貓忠實會員
文章: 1405
註冊時間: 2004-03-21 21:00

文章 ~倉木麻衣~ »

問題應該是出在strtolower()及傳給他的參數身上
strtolower()會將英文字轉成小寫\r
而「筱惠兒」這個字轉成16進位是D4 4E B4 66 A8 E0
其中的4E剛好是英文大寫的N~所以它會轉換成小寫的n(6E)
而66是小寫的f~所以不受影響\r
因此轉換後就變成了「羧惠兒」
那麼

代碼: 選擇全部

	$sql = "SELECT username 
		FROM " . USERS_TABLE . " 
		WHERE LOWER(username) = '" . strtolower($username) . "'";
若資料庫函式LOWER()能正確轉換的話~則上述的SQL就相當於\r

代碼: 選擇全部

	$sql = "SELECT username 
		FROM phpbb2_users 
		WHERE '筱惠兒' = '羧惠兒'";
意即該使用者名稱未存在於資料庫裡
至於資料庫裡的LOWER()函式會怎麼轉換~我就沒有去實際測試了
baboo
星球公民
星球公民
文章: 79
註冊時間: 2004-02-11 10:23

文章 baboo »

~倉木麻衣~ 寫:問題應該是出在strtolower()及傳給他的參數身上
strtolower()會將英文字轉成小寫\r
而「筱惠兒」這個字轉成16進位是D4 4E B4 66 A8 E0
其中的4E剛好是英文大寫的N~所以它會轉換成小寫的n(6E)
而66是小寫的f~所以不受影響\r
因此轉換後就變成了「羧惠兒」
那麼

代碼: 選擇全部

	$sql = "SELECT username 
		FROM " . USERS_TABLE . " 
		WHERE LOWER(username) = '" . strtolower($username) . "'";
若資料庫函式LOWER()能正確轉換的話~則上述的SQL就相當於\r

代碼: 選擇全部

	$sql = "SELECT username 
		FROM phpbb2_users 
		WHERE '筱惠兒' = '羧惠兒'";
意即該使用者名稱未存在於資料庫裡
至於資料庫裡的LOWER()函式會怎麼轉換~我就沒有去實際測試了
上面這個部份我也測試過... LOWER() 跟 strtolower() 結果完全相同...
所以真正比較的部份是 ("羧惠兒" == "羧惠兒") 而不是原本的"筱惠兒"
所以還是會找到這個字...

而且未mod版本phpbb 也找的到這個重複... :oops:

但是垃圾貓測試 validate_username() 的結果竟然是沒發現問題...

所以應該是別的地方... 可能是 mod 也可能是其它問題.... 沒看到code 沒辦法知道... :-(
垃圾貓
星球普通子民
星球普通子民
文章: 28
註冊時間: 2003-06-27 17:43
聯繫:

文章 垃圾貓 »

baboo 寫: 或是, 最好能直接把所有裝過的 mod 的鏈接列出來... :p
看起來好像蠻嚴重的,我已經把您說的這兩個檔案列出來,有幫助嗎?
http://home.pchome.com.tw/education/electone01/phpbb/
圖檔
baboo
星球公民
星球公民
文章: 79
註冊時間: 2004-02-11 10:23

文章 baboo »

垃圾貓 寫:
baboo 寫: 或是, 最好能直接把所有裝過的 mod 的鏈接列出來... :p
看起來好像蠻嚴重的,我已經把您說的這兩個檔案列出來,有幫助嗎?
http://home.pchome.com.tw/education/electone01/phpbb/
那兩個檔案沒問題... :-?

再跑下面這個程式試試看, 再把結果 po 出來,
照樣存成 test.php
(這段程式需要你目前論壇的那兩個"筱惠兒"賬號, 所以先別砍它們.)

代碼: 選擇全部

<?php
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
include($phpbb_root_path . 'includes/functions_validate.'.$phpEx);

$username = stripslashes("筱惠兒");
echo "username = [".$username."]<br>";
$doubleCheck = validate_username($username); 
if ( $doubleCheck['error'] ) echo "1:dup found<br>"; 
else echo "1:no dup<br>";

$sql = "SELECT username FROM ".USERS_TABLE." WHERE LOWER(username) = '".strtolower($username)."'";
if (!($result = $db->sql_query($sql))) echo "2:no dup found...<br>";
$totalFound = array();
while($row = $db->sql_fetchrow($result)) $totalFound[] = $row;
for($i = 0; $i < count($totalFound); $i++) 
	echo "2:found dup ".$i.": ".$totalFound[$i]['username']."<br>";

$sql = "SELECT user_id, username FROM ".USERS_TABLE." WHERE user_id = 1786 OR user_id = 1787";
if (!($result = $db->sql_query($sql))) echo "3:db error?<br>";
$totalFound = array();
while($row = $db->sql_fetchrow($result)) $totalFound[] = $row;
for($i = 0; $i < count($totalFound); $i++) 
	echo "3:found ".$totalFound[$i]['user_id'].":".$totalFound[$i]['username']."<br>";
?>
垃圾貓
星球普通子民
星球普通子民
文章: 28
註冊時間: 2003-06-27 17:43
聯繫:

文章 垃圾貓 »

感謝幫忙,這樣處理會不會太佔版面?花了您不少時間,上面跑的結果:
username = [筱惠兒]
1:no dup
3:found 1786:筱惠兒
3:found 1787:筱惠兒
圖檔
baboo
星球公民
星球公民
文章: 79
註冊時間: 2004-02-11 10:23

文章 baboo »

咦.... 奇怪...

麻煩再試一個... 下面這段.

代碼: 選擇全部

<?php
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);

$username = "筱惠兒";

$sql = "SELECT username FROM ".USERS_TABLE." WHERE LOWER(username) = '".mb_convert_case($username, MB_CASE_LOWER, "BIG5")."'";
if (!($result = $db->sql_query($sql))) echo "1:bad<br>";
$totalFound = array();
while($row = $db->sql_fetchrow($result)) $totalFound[] = $row;
for($i = 0; $i < count($totalFound); $i++) 
	echo "1:found dup ".$i.": ".$totalFound[$i]['username']."<br>";

$sql = "SELECT username FROM ".USERS_TABLE." WHERE HEX(username) = '".bin2hex($username)."'";
if (!($result = $db->sql_query($sql))) echo "2:bad<br>";
$totalFound = array();
while($row = $db->sql_fetchrow($result)) $totalFound[] = $row;
for($i = 0; $i < count($totalFound); $i++) 
	echo "2:found dup ".$i.": ".$totalFound[$i]['username']."<br>";
?>
還有, 麻煩也把你的多國語言 mod 鏈接 po 出來.
垃圾貓
星球普通子民
星球普通子民
文章: 28
註冊時間: 2003-06-27 17:43
聯繫:

文章 垃圾貓 »

Fatal error: Call to undefined function: mb_convert_case() in c:\appserv\www\phpbb\test.php on line 9
好像有錯誤
多國語言已經是2.0.6的時候作的,一年多前了,印象中好像是下面這裡參考的
http://home.pchome.com.tw/enjoy/roseman ... ilang.html
圖檔
baboo
星球公民
星球公民
文章: 79
註冊時間: 2004-02-11 10:23

文章 baboo »

咦.... appserv 2.3.0 應該可以跑那個 mb_convert_case 啊....

那換下面這個試試看.

代碼: 選擇全部

<?php
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);

$username = "筱惠兒";

$sql = "SELECT LOWER(username) AS lu FROM ".USERS_TABLE." WHERE LOWER(username) = '".strtolower($username)."'";
if (!($result = $db->sql_query($sql))) echo "1:bad<br>";
$totalFound = array();
while($row = $db->sql_fetchrow($result)) $totalFound[] = $row;
for($i = 0; $i < count($totalFound); $i++) 
	echo "1:found dup ".$i.": ".$totalFound[$i]['lu']."<br>";

$sql = "SELECT username FROM ".USERS_TABLE." WHERE HEX(username) = '".bin2hex($username)."'";
if (!($result = $db->sql_query($sql))) echo "2:bad<br>";
$totalFound = array();
while($row = $db->sql_fetchrow($result)) $totalFound[] = $row;
for($i = 0; $i < count($totalFound); $i++) 
	echo "2:found dup ".$i.": ".$totalFound[$i]['username']."<br>";

$sql = "SELECT user_id, LOWER(username) AS lu FROM ".USERS_TABLE." WHERE user_id = 1786 OR user_id = 1787"; 
if (!($result = $db->sql_query($sql))) echo "3:bad<br>"; 
$totalFound = array(); 
while($row = $db->sql_fetchrow($result)) $totalFound[] = $row; 
for($i = 0; $i < count($totalFound); $i++) 
   echo "3:found ".$totalFound[$i]['user_id'].":".$totalFound[$i]['lu']."<br>"; 

echo "php version: ".phpversion();
?>
垃圾貓
星球普通子民
星球普通子民
文章: 28
註冊時間: 2003-06-27 17:43
聯繫:

文章 垃圾貓 »

2:found dup 0: 筱惠兒
2:found dup 1: 筱惠兒
3:found 1786:筱惠兒
3:found 1787:筱惠兒
php version: 4.3.4
圖檔
baboo
星球公民
星球公民
文章: 79
註冊時間: 2004-02-11 10:23

文章 baboo »

發現問題所在了...
不知道為什麼, 你的 mySQL 不會轉換大小寫...

你的 mySQL 對 LOWER('筱惠兒') 這個指令沒有反應... 出來的還是"筱惠兒....."

跑下面那個程式就看的出來... 你的結果應該是三個名字都相同...
(至少 LOWER 那個會是相同的...)

我用來測試的 mySQL 版本是 4.02, 而用的是 latin1 編碼...
如果你是用 appServ 裝的話應該跟我的 mySQL 的設定不同, 尤其在安裝時設定的編碼上(big5?),
我沒用過設定用 big5 編碼的 mySQL, 不知道這個問題是不是只有非 latin1 才會出現...

不過在找出問題的根本之前, 照你前面測試的結果來看, 可能有一個解決辦法, 不過要再麻煩你再試一個...
順便列出來 mySQL 的版本.

代碼: 選擇全部

<?php
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);

$sql = "SELECT user_id, LOWER(username) AS lu, UPPER(username) AS uu, username FROM ".USERS_TABLE." WHERE user_id = 1786"; 
if (!($result = $db->sql_query($sql))) echo "1:bad<br>"; 
$totalFound = array(); 
while($row = $db->sql_fetchrow($result)) $totalFound[] = $row; 
for($i = 0; $i < count($totalFound); $i++) {
   echo "1:UPPER ".$totalFound[$i]['user_id'].":".$totalFound[$i]['lu']."<br>"; 
   echo "1:LOWER ".$totalFound[$i]['user_id'].":".$totalFound[$i]['uu']."<br>"; 
   echo "1:NORMAL ".$totalFound[$i]['user_id'].":".$totalFound[$i]['username']."<br>"; 
}
echo "mysql version: ".mysql_get_server_info()."<br>";

$username = "Priscilla";

$sql = "SELECT user_id, LOWER(username) AS lu, UPPER(username) AS uu, username FROM ".USERS_TABLE." WHERE HEX(LOWER(username)) = '".bin2hex(strtolower($username))."'";
if (!($result = $db->sql_query($sql))) echo "2:bad<br>"; 
$totalFound = array(); 
while($row = $db->sql_fetchrow($result)) $totalFound[] = $row; 
for($i = 0; $i < count($totalFound); $i++) {
   echo "2:UPPER ".$totalFound[$i]['user_id'].":".$totalFound[$i]['lu']."<br>"; 
   echo "2:LOWER ".$totalFound[$i]['user_id'].":".$totalFound[$i]['uu']."<br>"; 
   echo "2:NORMAL ".$totalFound[$i]['user_id'].":".$totalFound[$i]['username']."<br>"; 
   echo "2:ORIGINAL :$username";
}
?>
主題已鎖定

回到「phpBB 2 安裝與使用」