0

ユーザーの名($ first_name)とユーザーの名前($ last_name)を取得し、それらをユーザーテーブル(url)列に挿入する単純なmysql挿入を実装しようとしています。これは、QuoraやFacebookに非常によく似ています...たとえば、www.facebook.com/Michael.Jackson.32です。

私のwhileループは以下のとおりであり、エラーを知っていればよかったのですが、コードを実行すると、サーバーは動作を続け、最終的にはタイムアウトになります。

どんな助けでも大歓迎です。

//Store Vanity URL
$user_id_sql = $db->prepare("SELECT id FROM users WHERE first_name = :first_name AND last_name = :last_name");
$user_id_sql->execute(array(':first_name' => $first_name , ':last_name' => $last_name));
$user_search_results = $user_id_sql->rowCount();

if($user_search_results == "0") {
    $vanity = $first_name.'.'.$last_name;
    $insert_vanity_url = $db->prepare("INSERT INTO users (url) VALUES (:vanity) WHERE uid = :uid");
    $insert_vanity_url->execute(array(':vanity'=>$vanity , ':uid'=>$uid));
}
else {
    $var1 = "bad";
    $i = "1";
    while($var1 == "bad") {
        $user_id_sql_two = $db->prepare("SELECT id FROM users WHERE first_name = :first_name AND last_name = :last_name");
        $user_id_sql_two->execute(array(':first_name' => $first_name , ':last_name' => $last_name));
        $user_search_results_two = $user_id_sql_two->rowCount();
        if($user_search_results_two == "0") {
            $vanity = $first_name.'.'.$last_name.$i;]
            $insert_vanity_url = $db->prepare("INSERT INTO users (url) VALUES (:vanity) WHERE uid = :uid");
            $insert_vanity_url->execute(array(':vanity'=>$vanity, ':uid'=>$uid));
            $var1 = "good";
        }
        $i++;
    }
}
4

1 に答える 1

0

わかりました、私は問題を見つけました(まあ特定の問題):

このクエリ:

SELECT id FROM users WHERE first_name = :first_name AND last_name = :last_name

あなたが思っていることを正確に実行し、その姓名を持つすべてのユーザーを取得します。初めて使用するときは、そのようなユーザーがいない場合は、ユーザーとバニティを追加して先に進みます。

ただし、によって決定されるように、そのようなユーザーが存在する場合は、rowCount()そのループに入ります。

そのループには同じクエリが含まれており、その名前と姓を持つユーザーがいるかどうかを確認します。ただし、このブロックにいる唯一の理由は、クエリに一致するユーザーがいるためです。

ここでの一般的なロジックは次のとおりです。

  1. そのようなユーザーが存在しない場合は、それらを作成します。
  2. そのようなユーザーが存在する場合は、存在しなくなるまでループします。

おそらくあなたがすべきことは、基本的なバニティを生成し、次にテーブルにその存在をチェックし、次にフォールバックバニティをチェックして、存在しなくなるまでループごとに新しいバニティを生成することです(これは実際にはそれほど良い方法ではありませんそれを実行しますが、より重要な変更が必要になります)。

実際には、コードを改善するためにさらに多くのことがありますが、これはコードレビューではないので、私は口を閉ざします。

于 2012-07-24T03:23:38.110 に答える