1

ユーザーのデータベースを作成しようとしています。1人のユーザーが無数の電話番号を持つことができます。そのため、この形式で、新しい入力フィールドを提供するjs関数を作成し、それらが情報をネストされた配列に配置します。

配列を調べるためにdoubleforeachループを実行しており、IDがすでに存在していて更新する必要があるかどうか、またはまったく新しいもので挿入する必要があるかどうかに基づいて、SQLクエリを追加しています。これらのSQLクエリを変数$phoneSqlに追加します。その変数をエコーすると、phpMyAdminで直接試してみると機能する有効なSQLクエリが含まれています。

これはforeachループコードです:

 $phoneSql = 'SELECT id FROM user WHERE id = '.$id.' INTO @id;';
 foreach($_POST['phone'] as $key => $value) {
    foreach($_POST['user'][$key] as $id => $number) {
        if($id == 0 && !$number == ''){
            $phoneSql .= 'INSERT INTO phone_number (id, user_id, number) VALUES (NULL, @id, "'.$number.'");';
            } else if (!$number == '') {
                $phoneSql .= 'UPDATE phone_numbers SET user_id = @id,  number = "'.$number.'" WHERE id = '.$id.';';
            } 
        }
    }

フォームを含むedit.phpページが1つあり、update.phpに投稿されます。ここで、上からのforeachループと次のコードがあります。

$db->updatePhoneNumber($phoneSql);

また、現在編集しているユーザーから$idを取得します。次に、db.phpとこの関数に送信されます。

public function updatePhoneNumbers($phoneSql) {
    $ phoneSql = $ phoneSql;

    $sth = $this->dbh->prepare($phoneSql);
    $sth->execute();
    if ($sth->execute()) {
        return true;
    } else {
        return false;
    }
}

しかし、これは機能していません。SQLクエリを使用して変数をそのような関数に追加できますか、それとも他の方法で追加する必要がありますか?私はこれにまったく慣れていないので、どのように進めるかわかりません。解決策を探してみましたが、見つかりませんでした。アドバイスをいただければ幸いです。

4

1 に答える 1

1

あなたがすべきことは、INSERT ... ON DUPLICATE KEY UPDATE ...構成を使用することであり、そのロジックの多くを節約します。

例えば

INSERT INTO phone_number (id, user_id, number) VALUES (...)
ON DUPLICATE KEY UPDATE user_id=VALUES(user_id), number=VALUES(number)

これにより、選択、テスト、挿入/更新の必要がなくなります。挿入するだけで、重複キーエラーが発生した場合、MySQLはそれを透過的にアップデートに変換します。

于 2013-03-01T17:42:37.947 に答える