1

mySQL データベースに 1 対多の関係を保存しようとしていますが、可能な限りエントリの重複を避けたいと考えています。

インターネットで読んだところ、「ON DUPLICATE KEY UPDATE」がオプションであることがわかりました。これは私の状況でうまくいきますか?

コード:

function insert_options($uid, $array) {
    if(!is_array($array)) {
        return false;
    }
    $db = db_connect();
    foreach($array as $a) {
        $sql = 'INSERT INTO newsletter_coupon_codes_options (uid, option_name, value) VALUES (?, ?, ?)';
        $stmt = $db->prepare($sql);
        if($stmt === false) {
            echo "Prepare failed: (" . $db->errno . ") " . $db->error;
        }
        $stmt->bind_param('iss', $uid, $a, $value);
        $value = '1';
        $stmt->execute();
    }
}

テーブル

UID(INT11), OPTION_NAME(varchar(255)), VALUE(INT(11))

ステートメントに追加しようとしましON DUPLICATE KEY UPDATE value = 1$sqlが、何もしないようでした。uid基本的に、とoption_nameが存在する場合にデータを挿入するときに、 を設定するだけでvalue新しい1エントリを作成しないことを確認したいと思います。

一意のキーは設定されておらず、主キーのみが設定されていuidます。何をユニークにすればいいのかわかりませんでした。uidごとに複数のエントリがあるため、一意にすることはできませんuid。複数のoption_nameに対して同じ option_name があるため、一意にすることもできませんuid

これを達成するための最良の方法は何ですか?

4

2 に答える 2

0

このようにクエリを変更し、mysqli_query 関数を使用してください。この種のクエリを実行し、mysqli_real_escape_string 関数を使用して SQL インジェクションを回避してください。

$sql = 'INSERT INTO newsletter_coupon_codes_options 
     (uid, option_name, value) VALUES ("'.$uid.'", "'.$option_name.'", "'.$value.'")
    ON DUPLICATE KEY UPDATE  value = "'.$value.'"';
于 2013-12-10T06:27:44.840 に答える