3

ユーザーが商品グループに商品が表示される順序を制御できるように設計されたメカニズムがあります。、、、およびの列を持つ" "テーブル(MySQL )があります。最初の2つは製品グループに割り当て、3つ目は順序を決定します。grouplinesgroup_idproduct_idmanual_order

値は10manual_orderから始まり、10ずつ増加します。したがって、たとえば、製品をリストの3番目に移動することは、単にその値を25に変更してから、値を再計算する場合です。これは、製品IDのリストを取得し、順序を付けて、番号を付け直すことによって行われます。manual_ordermanual_ordermanual_order

このコードは機能します:

$products = array();
$dbh = s3_pdo::get_connection();
$query = $dbh->prepare('SELECT product_id FROM grouplines WHERE group_id=:group_id ORDER BY manual_order');
$query->bindValue(':group_id', $group_id);
$query->execute();
$rows = $query->fetchAll();
$query->closeCursor();
if ($rows) {
    $query = $dbh->prepare('UPDATE grouplines SET manual_order=:manual_order WHERE group_id=:group_id AND product_id=:product_id');
    $query->bindValue(':group_id', $group_id);
    //$query->bindParam(':product_id', $row['product_id']);
    $query->bindParam(':product_id', $product_id);
    $query->bindParam(':manual_order', $i);
    $i = 10;
    foreach ($rows as $row) {
        $product_id = $row['product_id'];
        $query->execute();
        $i += 10;
    }
}

これはしません:

$products = array();
$dbh = s3_pdo::get_connection();
$query = $dbh->prepare('SELECT product_id FROM grouplines WHERE group_id=:group_id ORDER BY manual_order');
$query->bindValue(':group_id', $group_id);
$query->execute();
$rows = $query->fetchAll();
$query->closeCursor();
if ($rows) {
    $query = $dbh->prepare('UPDATE grouplines SET manual_order=:manual_order WHERE group_id=:group_id AND product_id=:product_id');
    $query->bindValue(':group_id', $group_id);
    $query->bindParam(':product_id', $row['product_id']);
    //$query->bindParam(':product_id', $product_id);
    $query->bindParam(':manual_order', $i);
    $i = 10;
    foreach ($rows as $row) {
        //$product_id = $row['product_id'];
        $query->execute();
        $i += 10;
    }
}

ご覧のとおり、違いは、foreachループ$product_idで値が与えられた2番目のコードがバインドするのに対し、最初のコードはループの外側でバインドしようとすることです...私が知る限り、動作しますが、動作しません。(from $row['product_id'])$row['product_id']

明確な答えが見つからないため、2番目のコードが機能しない理由を推測することしかできません。私はを使用するのが初めてで、システムの残りの部分を古いmysql_関数の代わりにPDO使用するように変換するので、この種のことを汚したくないので、明確な答えが欲しいです。PDO

4

2 に答える 2

2

あなたのコードが何をするか見てみましょう:

$query->bindParam(':product_id', $row['product_id']);

ここでは、1 つの要素を持つ配列を暗黙的に作成し、$rowこの要素を bindParam() への参照として渡します。これにより、次のような構造になります。

$row : Array(
           'product_id' => &null
       )

$rowそれ自体は参照ではないことに注意してください。ループに到達するとすぐに:

foreach ($rows as $row)

配列$row上書きされます。この時点で、古い $row-Array の参照が失われ、配列はもう存在しません。参照は、同じキーを持ち、たまたま同じ変数に割り当てられているという理由だけで、別の配列に自動的にホップすることはできません。

簡単に言えば、あなたがやろうとしていることは不可能です。

于 2013-02-15T14:49:20.553 に答える
-1
  1. 未定義の配列インデックスを参照しています $row['product_id']
  2. $query->bindParam(':product_id', $row['product_id']); ステートメントは失敗します。
  3. trycatchを使用して例外をキャッチします
于 2013-02-15T14:11:01.770 に答える