0

正規化されたデータベースに書き込むとき、私はこのようなロジックを頻繁に使用します。

擬似コード:

is the thing I want in the table?:
    yes - get it's ID
else
    no - insert it, then get it's ID

PHP の場合:

// is the useragent in the useragent table?
// if so, find the id, else, insert and find.
$useragentResult = $mysqli->query("SELECT id FROM useragent WHERE name = '".$useragent."' LIMIT 1");
if ($useragentResult->num_rows == 0) {
    // It is not in there
    $mysqli->query("INSERT INTO useragent (name) VALUES ('".$useragent."')");

    $resultID_object = $mysqli->query("SELECT LAST_INSERT_ID() as id");
    $row = $resultID_object->fetch_object();
    $useragentID = $row->id;
} else {
    // It is, so find it and set it
    $useragentData = $useragentResult->fetch_object();
    $useragentID = $useragentData->id;
}

これは (PHP だけが原因ではありません!) 見苦しく感じられます。

これを行う本当の方法は何ですか、それともこれが最善の方法ですか?

4

2 に答える 2

1

を使用しINSERT ... ON DUPLICATE KEY UPDATEます。

MySQL 5.5以降:

テーブルにAUTO_INCREMENT列が含まれていINSERT ... ON DUPLICATE KEY UPDATEて、行を挿入または更新する場合、LAST_INSERT_ID()関数は値を返しAUTO_INCREMENTます。

または以前のバージョンでは:

テーブルにAUTO_INCREMENT列が含まれていINSERT ... ON DUPLICATE KEY UPDATEて、行を挿入する場合、LAST_INSERT_ID()関数は値を返しAUTO_INCREMENTます。ステートメントが代わりに行を更新する場合、LAST_INSERT_ID()意味がありません。ただし、 を使用してこれを回避できますLAST_INSERT_ID(expr)。それidAUTO_INCREMENT列だとします。更新をLAST_INSERT_ID()意味のあるものにするために、次のように行を挿入します。

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
于 2012-04-24T18:32:41.363 に答える
0

言語を十分に活用せずに基本的な PHP を使用している場合にのみ、これは見苦しくなります。このような操作には、オブジェクト指向プログラミングが非常に便利です。データベース アクセスをクラスに書き換えると、次のようなコードが生成されます。

$userAgent = new UserAgent();
$userAgent->name = $useragent;
$results = $userAgent->find();
if (empty($results)) {
    $userAgent->save();
}
$userAgentId = $userAgent->id;

この例では、UserAgent クラスの find メソッドがすべての SQL 作業をバックグラウンドで実行しています。検索結果が空の場合は、保存されたプロパティに基づいて挿入を行い、id プロパティを自動的に設定する save メソッドを呼び出します。したがって、if ステートメントの後、成功した find() または save() によって ID が設定されていることがわかります。

于 2012-04-24T18:31:43.003 に答える