7

名前、番号、会社をDBに挿入しています。

私のテーブルは単純です:

id(primary key)
name
slideView
company

渡された名前が存在する場合はこの情報を更新する必要があります。存在しない場合は、このデータで新しい行を作成します。私は見ましREPLACE INTOたが、それが私にとってうまくいくとは思いません...私はIDにまったく触れないので。

私のコードは次のとおりです。

insertData($name,$count,$company);

function insertData($name, $count, $company) {

    #Try/Catch statement to connect to DB, and insert data
    try {
        #DB username/password   
        $usernameDB = '****';
        $passwordDB = '****';

        #Create new PHP Database Object with the address, username, and password as parameters
        $pdo = new PDO('mysql:host=localhost;dbname=*****', $usernameDB, $passwordDB);

        #Set pdo attributes to handle errors 
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        #assign the sth variable (sth means statement handle) to insert the data
        $sth = $pdo->prepare("REPLACE INTO ***** SET name = ?, slideView = ?, company = ?");

        #Execute the insert
        $sth->execute(array($name,$count,$company));

    #Error if can't connect or insert
    } catch(PDOException $e) {
        echo 'Error: ' . $e->getMessage();
    }#/try
}

私はSQLに不慣れで、havntはこれを行うための良い方法をまだ見つけました。

4

2 に答える 2

4

このための構文を使用する方がよい場合がありinsert ... on duplicate updateますが、いくつかの追加のパラメーターを渡すことを意味しますが、置換の特定の問題を、切り詰められ続けるように見える構文に押しつぶすことができます。

REPLACE INTO ***** SET name = ?, slideView = ?, company = ?

次のように書くことができます:

insert into yourTableName (name, slideView, company)
    values (:name, :slideView, :company)
    on duplicate key update set
        slideView=:$slideView2, company=:company2

次に、実行は次のように実行されます。

$sth->execute(array(':name' => $name, ':slideView' => $count,
    ':company' => $company, ':slideView2' => $count, ':company2' => $company));

上記の形式は、名前付きパラメーターを使用し(読み取り/デバッグが非常に簡単です)、データベースに新しい行を挿入します。または、一意/主キー列nameに既に値がある場合は、残りの行で行を更新します。情報。

クエリでパラメータを2回使用することはできないため、ここではパラメータを2回使用する必要があります(slideViewとcompanyには同じ情報が含まれます)。

于 2012-09-19T23:16:00.440 に答える
2

REPLACE INTOは正常に機能するはずです。また、UNIQUE制約のある列もチェックします。したがって、REPLACE INTOが重複として識別するように、列を一意としてマークするname必要があります。

私はこの特定のユースケースを試していませんが、ドキュメントで許可されているようです。

于 2012-09-19T23:01:57.700 に答える