0

重複の可能性:
SQL エントリの重複を防ぐ

レコードが既に存在するかどうかを知る簡単な方法を探しています。存在する場合は、テーブルに挿入しないでください。以下のコードは、存在するかどうかに関係なく挿入されます...理由がわかりません。

<?php
$FirstName = $_POST["FirstName"];
$LastName = $_POST["LastName"];

$conn = sqlsrv_connect( $hostname, $connectionInfo)

$dup = sqlsrv_query($conn, "SELECT * FROM contact WHERE (FirstName='$FirstName') AND (LastName='$LastName')");
if(sqlsrv_num_rows($dup) > 0)
{
    echo "Already Exists";
}
else
{
    $query = "INSERT INTO contact (FirstName, LastName) VALUES ('$FirstName', '$LastName')";
    sqlsrv_query( $conn, $query );
}

編集:

最終的に、問題を修正するために変更sqlsrv_num_rows($dup) > 0しましsqlsrv_has_rows($dup)た。以下は私の更新されたコードです:

$params = array($_POST['FirstName'], $_POST['LastName']);
$conn = sqlsrv_connect( $hostname, $connectionInfo)
$sql = "SELECT * FROM contact WHERE FirstName = ? AND LastName = ?";
$dup = sqlsrv_query($conn, $sql, $params);
if(sqlsrv_has_rows($dup)) 
{
    echo "Already Exists";
}
else
{
    $query = "INSERT INTO contact (FirstName, LastName) VALUES (?, ?)";
    sqlsrv_query( $conn, $query, $params );
}
4

1 に答える 1

2

まず、主キーを特定する必要があります。これは通常、ある種の ID フィールドです。FirstName LastName のペアリングを使用しないことをお勧めします。名前と姓が同じ人の例が非常に多いためです。"Kevin Kline" は、アクターと SQL Server MVP の両方の名前です (そして、おそらくもっとたくさんいるでしょう)。

FirstName LastName をやみくもにテーブルに挿入したい場合は、RDBMSに依存しないクエリがより似ています

INSERT INTO contact (FirstName, LastName) VALUES ($FirstName, $LastName) WHERE NOT EXISTS 
(SELECT 1 FROM contact where FirstName = $FirstName and LastName = $LastName);

(免責事項:あなたが投稿した内容に従ってフォーマットしなかったことは知っています。これは、次の理由によるものです)

でも:

コードは、SQL インジェクション攻撃に対しても脆弱です。sqlsrv_query「params」引数に特に注意して PHP メソッドを読んでください。

さらに、「Kevin Kline」の例に戻ると、これは最初の「Kevin Kline」のみを挿入します。「Kevin Kline」をスター スキーマのディメンションとして追加し、ファクト テーブルの Profession などの他のディメンションに関連付ける場合は、これで問題ないと思います。ただし、それがアプリケーション ドメインでない場合は、適切なデータを正確に追跡できるように、テーブル キーとして何を使用するかを決定することを強くお勧めします。

于 2012-08-24T22:40:28.087 に答える