2

私は小さな趣味のアプリケーションを開発しています。私は以前にMySQLとPostgreSQLを使用したことがありますが、ここではn00bであり、助けていただければ幸いです。

MySQLデータベースに「TECH」というテーブルがあります。このテーブルには、「ID」(主キー)と「name」(技術者の名前-いかなる種類のキーでもない)の2つの列があります。次に、いくつかの行の例を示します。

+----+--------+
| ID |  name  |
+----+--------+
| 1  |  Python|
| 2  |  ASP   |
| 3  |  java  |
+----+--------+

作成するコードは次のTECHとおりです。

CREATE TABLE TECH (
        id      INT(5) ,
        name    VARCHAR(20),
        PRIMARY KEY (id)
);

ユーザーが新しいテクノロジーをに入力するためのhtmlフォームを開発しましたTECH。ただし、に重複するエントリが存在しないようにしたいと思いますTECH。たとえば、ユーザーはID 4を割り当てるために「Python」を入力することを許可されるべきではありません。さらに、ユーザーは別のIDで「pYthon」(または大文字と小文字の変形)を入力することも許可されるべきではありません。

現在、これを行う次のコードがあります(MySQL側ではなくPHP側で):

// I discovered that MySQL is not case sensitive with TECH.name
$rows = 0;
$result = $mysql_query("SELECT * FROM tech AS T WHERE T.name='python'");
while ($row = mysql_fetch_array($result)) {
    $rows += 1;
}

if ($rows != 0) {
    echo "'python' cannot be inserted as it already exists";
} else {
    // insertion code
}

UNIQUE (name)これを行う正しい方法は、PHP側で「挿入エラー」を実行してキャッチすることにより、TECH.nameをUNIQUEに制限することです。ただし、このプロセスに関して次の2つの質問があります。

  1. UNIQUE制約を定義すると、上記の大文字と小文字が区別されないことが維持されますか?
  2. PHP側でこのような挿入エラーを正確にキャッチするにはどうすればよいですか?

私はこれまたは誰かが持っているより良いアイデアで助けていただければ幸いです。

4

3 に答える 3

2

mysqlフォームphpを操作するとき(つまり、INSERTまたはUPDATEを実行することによって)、影響を受ける行を返すmysql_get_rows_affectedを呼び出すことができます。UNIQUE制約が原因でクエリが失敗した場合、影響を受ける行は0になります。

http://php.net/manual/en/function.mysql-affected-rows.php

私は通常、その関数から返される行数をチェックします。INSERTOR IGNOREアプローチを使用する場合も、同じチェックを適用できます。

于 2012-08-20T14:27:19.957 に答える
1

試す

INSERT IGNORE INTO mytable
    (primaryKey, field1, field2)
VALUES
    ('abc', 1, 2),
    ('def', 3, 4),
    ('ghi', 5, 6);

重複した行は無視されます

于 2012-08-20T14:28:08.177 に答える
0

フィールドの照合をに変更する_ci_cs、一意のキーがcasensensitiveであるiかaseensitivecであるかを決定しsます。

エラーのキャッチについては、mysqliまたはPDOを使用してdbクエリを実行してみてください:http ://www.php.net/manual/en/pdo.exec.php

次のように、PDOで重複するエラーエントリをキャッチできます。

try
{
    $dbh->exec($mySqlQuery);
    // insert was successful...
} catch (PDOException $e) {
    if ($e->errorInfo[1]==1062) {
        // a 'duplicate' error occurred...
    } else {
        // a non 'duplicate error' occurred...
    }
}

編集:

PDOを使用していない場合、これはmysql_queryの後で機能するはずです。

if (mysql_errno() == 1062)
{
   // you have a duplicate error...
}
于 2012-08-20T14:34:45.580 に答える