0

Facebook登録を実装しようとしています。それは機能し、必要なすべてのデータを取り戻しています。今、私は次のようにユーザー名をユーザーに割り当てたいと思います:

$username = ''.$first_name.'.'.$lastname.'';

問題は、同じ名前と姓を持つユーザーが Web サイトに登録されるかどうかわからないことです。ユーザー名が取得されているかどうかを確認し、基本的な $username にシーケンス番号を追加したいと考えています (Facebook も同じことを行います)。 )、 このような:

name.lastname
name.lastname.1
name.lastname.2
etc

私が試した:

$temp_username = ''.$first_name.''.$last_name.'';
$check_username = mysql_query("SELECT username FROM users WHERE username = '$temp_username'");
$num_rows = mysql_num_rows($check_username);
if ($num_rows == 0){
    $username = strtolower($temp_username);
} else {
    $username = strtolower(''.$temp_username.'.'.$num_rows.'');
}

ただし、そのユーザー名を持つユーザーは常に 1 人しかいないため、もちろん機能しません。

編集* * *これは私がそれを修正する方法です(ザンダーに感謝します):

        $temp_username = ''.$first_name.''.$last_name.'';
        $num_rows = mysql_num_rows(mysql_query("SELECT username FROM users  WHERE username = '$temp_username' OR username LIKE '$temp_username%' "));
        $username = strtolower(''.$temp_username.'.'.$num_rows.'');
4

8 に答える 8

2

以下SELECTは、存在する場合、最大数のユーザーを決定します

select max(reverse(SUBSTRING(reverse(username), 1, LOCATE('.', reverse(username))-1))) trail 
  from users
 where username like 'John.Smith.%';

SQL フィドルのデモ

このようにPHPに追加します

...
if ($num_rows == 0){
    $username = strtolower($temp_username);
} else {
   ... query for the max number here
   ... concatenate the username with the max number 
}

ああ、最後になりましたが、重要なことです。コードが SQL インジェクションに対して脆弱でないことを確認してください。バインド パラメータを使用します。良いスタートはこの答えです:mysqlインジェクションとクロスサイトスクリプティングを防御するための最良の方法

于 2012-10-07T11:42:51.827 に答える
2

$num_rows = mysql_num_rows(mysql_query("SELECT username FROM users WHERE username = '$temp_username' OR username LIKE '$temp_username.%' "));実際に期待する行数を返します。次に、それを完了するために使用$username = strtolower(''.$temp_username.'.'.$num_rows.'');します。ループは必要ありません。

于 2012-10-07T11:01:34.453 に答える
1

WHERE 句で LIKE 演算子を使用することを正しく提案する既存の回答が多数あります。しかし、既存の回答で対処されていない重大な問題が 1 つあります。

2 人のユーザーが同時に (またはほぼ同時に) 同じユーザー名を追加しようとする可能性があります。それぞれがその名前に似ている既存のユーザー名の数を選択し、それぞれが同じ番号のサフィックスを生成しますが、それでも重複が発生します。

私は mysql 開発者でも php 開発者でもないので、特定の構文についてはあまり説明しません。

ユーザー テーブルがInnoDB ストレージ エンジンを使用していることを確認する必要があります。コードは次のことを行う必要があります。

  1. 取引開始

  2. 特定の時点で特定のユーザー名のカウントを取得できるのは 1 人だけであることを確認するには、SELECT FOR UPDATE を使用します。

  3. 新しいユーザーを挿入

  4. トランザクションをコミットします。

詳細については、更新の選択を参照してください。

于 2012-10-07T12:20:53.907 に答える
0

代わりに次のコードを使用してください。

$check_username = mysql_query("SELECT username FROM users WHERE username = '$temp_username' OR username LIKE  '$temp_username.%' ");

例:これは一致します:

johnsmith または joshnsmith.X x は 1 、 2 、 3 ......など

于 2012-10-07T10:56:32.347 に答える
0

DB ダンプ

CREATE TABLE Users (
  `username` varchar(255) PRIMARY KEY,
  `firstname` varchar(255),
  `lastname` varchar(255)
);

INSERT INTO Users (`username`, `firstname`, `lastname`) VALUES (
  'praveen.kumar', 'Praveen', 'Kumar'
),(
  'praveen.kumar.1', 'Praveen', 'Kumar'
),(
  'praveen.kumar.2', 'Praveen', 'Kumar'
);

SQL については、次の方法で実行できます。

SELECT *
FROM `Users`
WHERE `username` LIKE "praveen.kumar%"
ORDER BY `username` DESC

出力を与える:

+-----------------+-----------+----------+
|        USERNAME | FIRSTNAME | LASTNAME |
+-----------------+-----------+----------+
| praveen.kumar.2 |   Praveen |    Kumar |
| praveen.kumar.1 |   Praveen |    Kumar |
|   praveen.kumar |   Praveen |    Kumar |
+-----------------+-----------+----------+

そして、次の方法で最新のものを入手できます。

SELECT *
FROM `Users`
WHERE `username` LIKE "praveen.kumar%"
ORDER BY `username` DESC
LIMIT 1

PHPコード:

<?php
    # Outputs the largest number with that username.
    $nextUser = substr($userNameFromDB, strrpos($userNameFromDB, "."));
    $nextUser++;
?>

SQL フィドル: http://sqlfiddle.com/#!2/ad149/1

于 2012-10-07T11:00:38.177 に答える
0

count()関数とlike演算子を使用します。

$check_username = mysql_query("
    SELECT count(username) 
    FROM users 
    WHERE username like '$temp_username%'
");

存在する名前の数を返します。電話する必要はありませんmysql_num_rows

于 2012-10-07T11:01:35.090 に答える
0

count() 関数を使用する必要があります

$query = mysql_query("
  SELECT count(user_name) cnt
    FROM users 
    WHERE username = '$just_registered_username'
");

そして、次を使用して結果を取得します

$row = sql_fetchrow($query);

そして、ユーザーの数を次のように取得します

$next_index = $row->cnt;

次に、それを新しいユーザー名に追加します

$new_username = "{$just_registered_username}.{$next_index}";

最終的なコードにコメントを追加することを忘れないでください。また、データベース アクセスに PDO を使用してみてください。

于 2012-10-07T11:18:51.877 に答える
-1

存在しないユーザー名を見つけたい場合は、存在しないユーザー名が見つかるまで組み合わせを試す必要があります。

したがって、存在しない名前が見つかるまでループします。

$temp_username = $first_name . $last_name;
$i=1;
$found = false;
while(!$found) {
  $check_username = mysql_query(
     "SELECT username FROM users WHERE username = '$temp_username'");
  $found = mysql_num_rows($check_username);
  if ($found){
    $username = strtolower($temp_username);
  }
  else{
    $temp_username = $first_name . $last_name . '.' . $i;
    $i++
  }
}
于 2012-10-07T10:56:46.990 に答える