Dinamik MySQL satır başına bir artış değerini nasıl ayarlanır

2 Cevap php

Ben, bir öncelik listesi gibi davranan bir web uygulaması oluşturma, bir kullanıcı bir listede öğelerin bir dizi yeniden düzenlemek için izin ve bir PHP arka uç aracılığıyla MySQL veritabanında bu düzenleme depolamak.

Kullanıcı kendi ürün yerleştirmeyi tamamladı ve yapılandırmayı kaydeder zaman anda, ben her priorityLevel içinde (listede pozisyon) takarak, her satır için ayrı bir UPDATE deyimi arıyorum.

Örneğin: (benim üretim kodu, ancak bu noktayı göstermektedir değil)

<?php
  $items = array(12, 17, 27, 26, 5); // an array of IDs, in proper order
  // due to nature of foreach loop in PHP, this makes $order be the key value,
  // in this case, 0, 1, 2, 3, 4 respectively
  foreach ($items as $order => $item)
  {
    $database->query("UPDATE `table` SET `priorityLevel` = {$order} " .
                     "WHERE `ID` = {$item}");
  }
?>

Bu yeterince iyi çalışıyor, ama bu liste uzun olur, özellikle çok UPDATE sorguları çalıştırmak için verimsiz gibi görünüyor ve biz birçok öğe yeniden sipariş ediyoruz. Ben dinamik, UPDATE komutu içinde böyle bir şey sipariş oluşturmak için bir yol vardı umuyordum:

<?php
  $database->query("UPDATE `table` SET `priorityLevel` = ORDER_NUMBER " .
                   "WHERE `ID` IN (12, 17, 27, 26, 5)");
?>

... ORDER_NUMBER WHERE yan tümcesinde ID değeri konumuna göre belki belirlenen dinamik bir numara nerede. Bu priorityLevel kullanıcının isteklerine göre ayarlanmış olduğundan emin olmak için de WHERE yan öğelerin sırasını saygı gerekir.

Bu MySQL 5 / PHP 5 ortamında mümkün olup olmadığını biliyor mu? Bu işlemleri desteklemiyor böylece tablo MyISAM motorunu kullanıyor.

(PS - açıklayıcı olun, INSERT, UPDATE, DELETE komutları, ben de yeterince MySQL bazı temel biliyorum, ama ben çok bir uzman değilim, bu yüzden basit ötesinde burada yer bir şey varsa CREATE)

(PPS - terimleri çok genel olarak bu konu, Google'a zor ben 'mysql sipariş' için arama yapıyorsanız, ben MySQL için Alışveriş sepeti uygulamaları oluşturmak öğreticiler bir demet olsun.!)

2 Cevap

Böyle PHP bir sorgu oluşturmak ve mysql için bu sorguyu göndermek zorunda:

UPDATE `table`
SET priorityLevel = 
CASE 
WHEN `ID` = 12 THEN 1
WHEN `ID` = 17 THEN 2 
WHEN `ID` = 27 THEN 3
WHEN `ID` = 26 THEN 4
WHEN `ID` = 5 THEN 5
END 
WHERE `ID` IN (12, 17, 27, 26, 5);

(MySQL 5.0 ile test edilmiştir)

Eğer MySQL sunucu belleği sorgu tutar sırasında belirli değerleri değiştirmek sağlayan hazırlanmış bir deyimi kullanmak durumunda da hızlı döngü yapabilir. Bu yerine normal MySQL birinin MySQLi uzantısını kullanarak gerektirir.

Bu satırlar boyunca bir şey:

$mysql = new mysqli(HOST, USER, PASS, DB);

$stmt = $mysql->prepare("UPDATE items SET sortorder = ? WHERE id = ?");

$stmt->bind_params('ii', $sort, $id);

foreach ( $items as $sort => $id ) {
    $stmt->execute();
}