2012-12-09 83 views
0

我想知道如果你認爲這是可能的: 好吧,所以我有一個數據庫存儲用戶名,我想呼應管理員在一個名爲admins.php的文件內如果他們匹配的內部用戶名數據庫到目前爲止我有:PHP,管理員usersystem

admins.php; 
$admins = array("username","username2","username3"); 

$users="SELECT username from usrsys"; 
$query_users=mysql_query($users); 
while loop here. 

while循環應該有希望迴音的admins.php文件相匹配的用戶。我想我應該使用像(inarray()),但我真的不確定。

+0

**擡起頭好多了!** PHP的未來版本是*自嘲和刪除*了'mysql_'系列函數。現在將是[切換到PDO](http://php.net/book.pdo)或[mysqli](http://php.net/book.mysqli)的好時機。 – Charles

回答

0

如果您尋找語法僅在users拉從$admins陣列,那麼你可以使用類似:

$users="SELECT username FROM usrsys WHERE username IN ('".join("','",$admins)."')"; 

凡PHP函數JOIN將打印username,username2,username3。你得到的MySQL的聲明將是這樣的:

SELECT username FROM usrsys WHERE username IN ('username','username2','username3') 

另外,如果你希望通過你的$query_vars陣列進行迭代,並從非管理員分開你的管理員,那麼你可以使用類似:

<?php 
while($row = mysql_fetch_assoc($query_users)){ 
    if(in_array($row['username'],$admins)){ 
     //do admin stuff here 
    }else{ 
     //do NON-admin stuff here 
    } 
}?> 
+0

加入的東西看起來更接近我正在尋找的東西,但是當我回顯$用戶並嘗試在phpmyadmin中將其用作SQL命令時,它會在'where子句'中顯示未知列'username' – user1868565

+0

啊我想我知道爲什麼,這是因爲用戶沒有在數據庫中註冊。編輯:其實我現在試着用一個實際的用戶,它仍然是一樣的。 – user1868565

+0

原因是你必須在你的'IN'子句中引用字符串值,就像你的SQL代碼中的任何字符串一樣。 SQL需要你像PHP那樣引用字符串。 – Sherif

0

就包括admins.php文件,並使用下一個建設在循環:

while ($row = mysql_fetch_array($users)) { 
if (in_array($users[0], $admins)) 
    echo $users[0]; 
} 
0

試試這個:

<?php 
# include admins.php file that holds the admins array 
include "admins.php"; 

# join all values in the admins array using "," as a separator (to use them in the sql statement) 
$admins = join(",", $admins); 

# execute the query 
$result = mysql_query(" 
    SELECT username 
    FROM usrsys 
    WHERE username IN ($admins) 
"); 

if ($result) { 
    while ($row = mysql_fetch_array($result)) { 
     echo $row["username"] . "<br>"; 
    } 
} 
?> 
2

您應該在SQL中使用IN子句來執行此操作。從表中選擇所有的東西,以便在PHP中確定它是否包含您要查找的用戶名是沒有道理的,而且非常浪費。你能想象如果你有一個100萬用戶的桌子會發生什麼,你需要看看他們中的兩個是否在列表中?您將要求您的DBMS向PHP返回100萬行,以便您可以搜索每個這些名稱,然後確定它們中的任何一個是否是您正在查找的。你要求你的DBMS做很多工作(發送表中的所有行),並且你還要求PHP做很多工作(將所有這些行存儲在內存中並計算匹配),不必要的。

根據您的需求,有一個更高效和更快的解決方案。

首先,如果你只需要知道,所有這些用戶的存在於表中,然後使用SELECT COUNT(username),而不是和你的數據庫將返回單個行與多少行表中發現的值。這樣,你有一個全部或沒有辦法(如果這就是你要找的)。無論是在表格中找到3行還是在數組中有3個元素,或者沒有。這也利用了你的表索引(你應該正確索引)並且意味着更快的結果。

$admins = array("username","username2","username3"); 
// Make sure you properly escape your data before you put in your SQL 
$list = array_map('mysql_real_escape_string', $admins); 
// You're going to need to quote the strings as well before they work in your SQL 
foreach ($list as $k => $v) $list[$k] = "'$v'"; 
$list = implode(',', $list); 
$users = "SELECT COUNT(username) FROM usrsys WHERE username IN($list)"; 
$query_users = mysql_query($users); 
if (!$query_users) { 
    echo "Huston we have a problem! " . mysql_error(); // Basic error handling (DEBUG ONLY) 
    exit; 
} 
if (false === $result = mysql_fetch_row($query_users)) { 
    echo "Huston we have a problme! " . mysql_error(); // Basic error handling (DEBUG ONLY) 
} 
if ($result[0] == count($admins)) { 
    echo "All admins found! We have {$result[0]} admins in the table... Mission complete. Returning to base, over..."; 
} 

如果你真的這樣做需要所有數據然後從SQL的COUNT,你會簡單地獲得這些用戶的所有行(如果發現)。

$admins = array("username","username2","username3"); 
// Make sure you properly escape your data before you put in your SQL 
$list = array_map('mysql_real_escape_string', $admins); 
// You're going to need to quote the strings as well before they work in your SQL 
foreach ($list as $k => $v) $list[$k] = "'$v'"; 
$list = implode(',', $list); 
$users = "SELECT username FROM usrsys WHERE username IN($list)"; 
$query_users = mysql_query($users); 
if (!$query_users) { 
    echo "Huston we have a problem! " . mysql_error(); // Basic error handling (DEBUG ONLY) 
    exit; 
} 
// Loop over the result set 
while ($result = mysql_fetch_assoc($query_users)) { 
    echo "User name found: {$result['username']}\n"; 
} 

可是,我真的勸你使用舊的分機/ MySQL的API,因爲它已被棄用,並從使用已經氣餒了相當一段時間,在PHP MySQL數據庫接口重新考慮。我強烈建議您開始使用新的替代API,例如PDO或MySQLi,並參閱手冊中的指南以獲取有關選擇API的幫助。

在PDO中,例如,這個過程對於準備好的語句和參數化查詢來說會很簡單,因爲您不必擔心所有這些轉義。

有以舉例的PDOStatement::Execute page例5),顯示你是如何做到使用IN子句與準備好的語句的方式......然後,您可以在代碼和它的其他地方重複使用此聲明提供了性能優勢,同時也讓您更難以無意中將自己暴露給SQL注入漏洞。

// Connect to your database 
$pdo = new PDO("mysql:dbname=mydb;host=127.0.0.1", $username, $password); 

// List of admins we want to find in the table 
$admins = array("username","username2","username3"); 

// Create the place holders for your paratmers 
$place_holders = implode(',', array_fill(0, count($admins), '?')); 

// Create the prepared statement 
$sth = $dbh->prepare("SELECT username FROM usrsys WHERE username IN ($place_holders)"); 

// Execute the statement 
$sth->execute($admins); 

// Iterate over the result set 
foreach ($sth->fetchAll(PDO::FETCH_ASSOC) as $row) { 
    echo "We found the user name: {$row['username']}!\n"; 
} 

你的PHP代碼,甚至看起來與PDO :)

+0

+1爲PDO轉換工作,做得好。 – Charles