0

私はちょっと動作するコードを持っていますが、実際には理由がわかりません。私がしようとしているのは、データベース内でURLが既に存在するかどうか、ユーザーに通知されているかどうか、それがうまくいかないかどうかを確認することです追加します。

このコードは、フィールドが空でないことも確認します。ただし、URLがすでに存在するかどうかを確認しているようですが、データベースに追加されていない場合は. また、重複チェックは、機能する場合と機能しない場合があるため、バグが多いようです。どんな指針も素晴らしいでしょう。ありがとうございました。

    if(isset($_GET['site_url']) ){

    $url= $_GET['site_url'];


    $dupe = mysql_query("SELECT * FROM $tbl_name WHERE URL='$url'");
    $num_rows = mysql_num_rows($dupe);
    if ($num_rows) {
    echo 'Error! Already on our database!';
    }
    else {
    $insertSite_sql = "INSERT INTO $tbl_name (URL) VALUES('$url')";
    echo $url;
    echo ' added to the database!';

    }

}
else {
echo 'Error! Please fill all fileds!';
}
4

3 に答える 3

4

PHP 側でチェックする代わりに、MySQL でフィールドを作成する必要がありますUNIQUE。このようにして、データベース レベルでの一意性チェックが行われます(おそらくはるかに効率的です)。

ALTER TABLE tbl ADD UNIQUE(URL);

INSERTここで、重複がed の場合、MySQL が文句を言うことに注意してください。MySQL から返されるエラーをリッスンする必要があります。現在の関数では、 mysql_query()false を返すかどうかを確認して調べる必要がありますmysql_error()。ただし、実際にはPDOを使用する必要があります。そうすれば、次のことができます。

try {
    $db = new PDO('mysql:host=localhost;db=dbname', $user, $pass);

    $stmt = $db->query('INSERT INTO tbl (URL) VALUES (:url)');
    $stmt->execute(array(':url' => $url));
} catch (PDOException $e) {
    if($e->getCode() == 1169) { //This is the code for a duplicate
        // Handle duplicate
        echo 'Error! Already in our database!';
    }
}

また、テーブルにがあることも非常に重要です。PRIMARY KEY本当に追加する必要があります。それには多くの理由があります。あなたはそれを行うことができます:

ALTER TABLE tbl ADD Id INT;
ALTER TABLE tbl ADD PRIMARY KEY(Id);
于 2012-07-18T01:52:35.413 に答える
1

UNIQUEフィールドタイプに関するPhpMyCoderのアドバイスを受ける必要があります。

また、エラーを出力していません。

関数or die (mysql_error());の最後にエラーを出力する必要があることを確認してください。mysql_*

また、mysql_*関数を使用するべきではありません。代わりに、PDOまたはMySQLiを見てください。

また、挿入クエリを実行していません...

このコードを試してください:

if(isset($_GET['site_url']) ){

$url= $_GET['site_url'];


$dupe = mysql_query("SELECT * FROM $tbl_name WHERE URL='$url'") or die (mysql_error());
$num_rows = mysql_num_rows($dupe);
if ($num_rows > 0) {
echo 'Error! Already on our database!';
}
else {
$insertSite_sql = "INSERT INTO $tbl_name (URL) VALUES('$url')";
mysql_query($insertSite_sql) or die (mysql_error());
echo $url;
echo ' added to the database!';

}

}
else {
echo 'Error! Please fill all fileds!';
}
于 2012-07-18T01:58:17.727 に答える
0

PhpMyCoder が言ったように、一意のインデックスをテーブルに追加する必要があります。

彼の答えに加えて、たった 1 つのクエリでやりたいことを実行する方法を次に示します。

一意のインデックスを追加した後、"INSERT INTO" を試みた結果が重複すると、MySQL はエラーを生成します。

mysql_errno() を使用して、重複したエントリがあったかどうかを確認し、ユーザーに伝えることができます。

例えば

$sql = "INSERT INTO $tbl_name (URL) VALUES('$url')";
$result = mysql_query($sql);

if($result === false) {
  if(mysql_errno() == $duplicate_key_error) {
    echo 'Error! Already in our database!';
  } else {
    echo 'An error has occurred. MySQL said: ' . mysql_error();
  }
}

mysql_error() は mysql エラーを平易な英語で返します。

mysql_errno() は数値エラー コードのみを返します。したがって、 $duplicate_key_error をコードが何であれ (頭の中でわからない) に設定すると、すべて設定されます。

また、特定のシステム エラーを本番環境のユーザーに出力したくないことにも注意してください。サーバーに関するあらゆる種類の情報をハッカーに取得してほしくありません。テストまたは非公開プログラムでのみ MySQL エラーを出力します。

また!重要なことに、mysql 関数は非推奨です。それらのページ (例: http://php.net/manual/en/function.mysql-errno.php )のいずれかにアクセスすると、より良い代替案の推奨事項が表示されます。おそらく PDO を使用したいと思うでしょう。

私の回答を編集してmysqlをPDOに変更したり、PDOバージョンを追加したい人は誰でもどうぞ。

于 2012-07-18T02:06:27.483 に答える