ユーザーが商品グループに商品が表示される順序を制御できるように設計されたメカニズムがあります。、、、およびの列を持つ" "テーブル(MySQL )があります。最初の2つは製品をグループに割り当て、3つ目は順序を決定します。grouplines
group_id
product_id
manual_order
値は10manual_order
から始まり、10ずつ増加します。したがって、たとえば、製品をリストの3番目に移動することは、単にその値を25に変更してから、値を再計算する場合です。これは、製品IDのリストを取得し、順序を付けて、番号を付け直すことによって行われます。manual_order
manual_order
manual_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