0

そのため、MySQL で更新して設定する必要がある 2 つの配列があります。item_id [1,2,3] および item_order[2,1,3]

配列挿入前の items テーブルは次のとおりです。

item_id item_order
  1         1 //should become 2
  2         2 // should become 1
  3         3 // should become 3

配列は、挿入用に 1-2、2-1、3-3 のペアにする必要があります。準備されたステートメントでこれを効率的に行うにはどうすればよいですか? また、配列項目が実際に数値であるかどうかをテストするにはどうすればよいですか?

4

2 に答える 2

1

次のような入力があると仮定します。

$item_id = array(1, 2, 3);
$item_order = array(2, 1, 3);
// and a PDO connection named $pdo

あなたはこのようなことを試すことができます。(問題が発生したときに例外をスローするようにPDOが構成されていることも前提としています)。

function all_numbers($input) {
  foreach($input as $o) {
    if(!is_numeric($o)) {
      return false;
    }
  }
  return true;
}

if(count($item_id) != count($item_order)) {
  throw new Exception("Input size mismatch!");
}

if(!all_numbers($item_id) || !all_numbers($item_order)) {
  throw new Exception("Invalid input format!");
}

$pairs = array_combine($item_id, $item_order);
// now $pairs will be an array(1 => 2, 2 => 1, 3 => 3);

if($pdo->beginTransaction()) {
  try {
    $stmt = $pdo->prepare('UPDATE `items` SET `item_order` = :order WHERE `item_id` = :id');

    foreach($pairs as $id => $order) {
      $stmt->execute(array(
        ':id' => $id,
        ':order' => $order,
      ));
    }
    $pdo->commit();
  } catch (Exception $E) {
    $tx->rollback();
    throw $E;
  }
} else {
  throw new Exception("PDO transaction failed: " . print_r($pdo->errorInfo(), true));
}

ただし、入力を再設計する方がよい場合があります。item_ids必要な順序でのみ渡し、それらのitem_order値を自動的に計算します。

于 2012-06-02T06:06:43.457 に答える
1

次に例を示します。

UPDATE mytable SET myfield = CASE other_field WHEN 1 THEN 'value' WHEN 2 THEN 'value' WHEN 3 THEN 'value' END WHERE id IN (1,2,3)

于 2012-06-01T18:31:11.023 に答える