2010-12-13 8 views
0

私は、SQLテーブルの "UserID"フィールドからデータを収集し、すべてのデータを配列に渡し、変数を配列のwhatsと比較するスクリプトを用意しています。変数の値がすでに配列内にある場合は、その値が無効であることをユーザーに通知します。私は$ユーザーの出力は、配列( 'USER1'、 'user2の'、 'ユーザー3')に相当する必要がforeach関数を使用して配列出力をフォーマットする

$sql = "SELECT *" //User info 
    . " FROM Users" ; 
$result = mysql_query($sql); 
//insert where line for assessorid 


$users = array(); 

while(($user = mysql_fetch_assoc($result))) { 
$users[] = $user; 
} 

foreach($users as $user){ 
$user['UserID']; 
} 

。 何が起きているのかというのは、データは$ user_nameという形式から来るということです。私は、次のような文でこれを使用する:

if(in_array($user_name,$users)){ 
    echo "username available" 
} 
else{ 
    echo "not available"} 

私は抽出機能を使用してみましたが、それだけで大きな混乱を作成しました。 配列としての$ usersの形式をin_array()関数で解析できない場合を除いて、私がやっていることについて何が間違っているのか分かりません。どんなアドバイスも大歓迎です。ありがとう!

答えて

0

たぶん私は何かが欠けています...なぜこのようにそれをしない:それからちょうどユーザ名がすでに存在しているかいないかどうかを確認するためにmysql_num_rows()を使用

SELECT UserID FROM Users WHERE Username = 'username' 

。これは、より高速で効率的でなければなりません(メモリ単位)。

1
$sql = "SELECT USERID FROM Users" ; 

$result = mysql_query($sql); 

$users = array(); 

while(($user = mysql_fetch_assoc($result))) { 
$users[] = $user['USERID']; 
} 

あなたはあなたが配列に追加される結果セットのどの列を指定していない

$users[] = $user; 

を言っています。

0

この場合、データベースからすべてのデータを収集し、PHPでも非効率な処理を行う必要があります。そう、それがデータベース内にあるかどうかを確認するために、その値を照会することをお勧めします:

$username = mysql_real_escape_string($username); 
$query = " 
    select 
    count('x') as usercount 
    from 
    users u 
    where 
    u.username = '$username'"; 

ザ・ 'USERCOUNTが0であれば、ユーザ名が存在しません。 > 0の場合、ユーザー名は存在します。このようにして、データベースには設計された作業をさせ、実際に回収される唯一の値は単一の数値だけです。

0

クエリを変更しようとしましたか?現在、すべてのユーザーのすべての値を取得していますが、ちょうどUserIDが必要です。

$sql = "SELECT UserID FROM Users"; 
$result = mysql_query($sql); 

$users = array(); 

while(($user = mysql_fetch_assoc($result))) 
{ 
    $users[] = $user['UserID']; 
} 

// ... 
if (in_array($user_name, $users)) 
{ 
    echo 'Username not available'; 
} 
else 
{ 
    echo 'Username available'; 
} 

それとも、ただ与えられたユーザ名のデータベースで調べることができます::

$sql = 'SELECT count(*) FROM Users WHERE UserID = '.mysql_escape_string($user_name); 
$result = mysql_query($sql); 

// and then just check if the resulting row is equal to 0 
0

ユーザー名が取られているかどうかを確認するスクリプトを記述しようとしていますか?あなたはこれを行うことができますか

もしそうなら、プログラマチックアプローチに頼るのではなく、実際のクエリをこの目的のために構成する方が簡単です(そして効率的です)。

$sql = "SELECT COUNT(*) FROM Users WHERE Username = '$username'"; 

その後、あなたは、カウントにこの結果を適用し、ユーザーがゼロより大きい値は(ユーザーが既にその名前を取った)か否か(その無料)が返されるかどうかに基づいて登録するかしない可能性があります。

+0

SQLインジェクションを使ってあなたのサイトに他人ができることがわからない限り、もちろん$ usernameをエスケープしないでください。 –

+0

もちろん、私はOPがそれを認識していないように、これを単にCOUNTクエリの例として提供します。これは決してログインの挿入や検証には使用されません。私は一般的にすべてのデータベースアクセスでPDOを使用してこれを証明するのに役立ちます。 – DeaconDesperado

0

すでに述べたように、これは既存のユーザー名を確認するにはかなり非効率的な方法です。あなたのクエリを変更するための提案は良いアドバイスです。しかし

、あなたが提供するコードの問題に対処する:

in_array()は、多次元配列の値の存在を検出しません。

$users = array(
    array('userID', 'foo', 'bar'), 
    array('userID', 'foo', 'bar'), 
    array('userID', 'foo', 'bar') 
) 

in_arrayインデックスの最初のセットの下に検索しません:あなたの$users配列は、おそらくこのようなものが見えます。 in_array() and multidimensional array

関連する問題