Håller på att bli flintskallig (PHP > MySQL)

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2005

Håller på att bli flintskallig (PHP > MySQL)

Problem nr1:
Försöker få till en funktion som kollar vad som står i en kolumn i databasen (kolumnen innehåller värdet för en position i en lista som med hjälp av ajax går att dra och släppa i ordningen av föremålen i listan), varpå det nya värdet ska skrivas in på den gamla positionen. Har suttit med detta några timmar nu och får databasen att skriva in värdena men de blir inte i rätt ordning. Någon som ser vad som kan vara fel?

$user = $_SESSION['member_username']; // Hämta in en användares lista från db och lägg in positionerna i en array $sql = "SELECT * FROM tabell WHERE user = '$user' ORDER BY id"; $result = mysql_query($sql)or die(mysql_error()); $i=0; while ($row = mysql_fetch_array($result)) : $currentposition[] = $row['position']; echo $currentposition[$i] . "<br />"; $i++; endwhile; // Hämta in listItem (ajax), gör en arrayquery till db $i=0; foreach ($_GET['listItem'] as $position => $item) : $oldpos = $currentposition[$i]; $newpos = $item-1; $arrayquery[] = "UPDATE tabell SET position = '$newpos' WHERE position = '$oldpos' AND user ='$user'"; mysql_query($arrayquery[$i])or die(mysql_error()); echo $arrayquery[$i] . "<br />"; $i++; endforeach;

Problem nr2:
Jag insåg snart att koden ovan kommer ge problem i och med att användarens lista kan bli lång, vilket kommer generera extremt många slag mot databasen, så jag hittade denna lilla artikel: http://www.karlrixon.co.uk/articles/sql/update-multiple-rows-... - förminskar antal förfrågningar avsevärt, fantastiskt bra! Men jag behöver en knuff i rätt riktning med att kunna applicera det på min kod ovan, odugling som man är.

$ids = implode(',', array_keys($display_order)); $sql = "UPDATE categories SET display_order = CASE id "; foreach ($display_order as $id => $ordinal) { $sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal); } $sql .= "END WHERE id IN ($ids)"; echo $sql;

Som exempel så ser tabellen ut så här:

|id |user |position| |23|save|0 | |54|save|2 | |82|save|1 |

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Okt 2006

Använd Recrea så ska du få se att det fixar sig ;ı

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2005
Citat:

Ursprungligen inskrivet av Shanni
Använd Recrea så ska du få se att det fixar sig ;ı

Slänger Regaine direkt, är dock även verkligen i behov av hjälp med mitt andra problem.

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2005

Tror jag förstår felet, jag skriver ju över databasen med nya värdet samtidigt som den kollar efter det gamla. Så att använda gamla positionen är kanske inte rätt riktning här. - Men problemet är att om jag använder id't istället så kan jag flytta ett föremål ett snäpp upp eller ner i listan, flyttar jag det fler snäpp så hoppar oftast alla siffror i kolumnen - men ibland funkar det(?), snart har jag inte många hårstrån kvar. :S

Här är koden där jag jämför id't istället (som hittills fungerat mest korrekt - men som sagt när man flyttar vissa positioner så hoppar alla siffror i kolumnen 'position' i db):

// Hämta in en användares lista från db och lägg in positionerna i en array $sql = "SELECT * FROM tabell WHERE user = '$user' ORDER BY id"; $result = mysql_query($sql)or die(mysql_error()); $i=0; while ($row = mysql_fetch_array($result)) : $currentid[] = $row['id']; echo $currentid[$i] . "<br />"; $i++; endwhile; // Hämta in listItem (ajax), gör en arrayquery till db $i=0; foreach ($_GET['listItem'] as $position => $item) : $getid = $currentid[$i]; $newposition = $item-1; $arrayquery[] = "UPDATE tabell SET position = '$newposition' WHERE id = '$getid' AND user ='$user'"; mysql_query($arrayquery[$i])or die(mysql_error()); echo $arrayquery[$i] . "<br />"; $i++; endforeach;

Jäkla svårknäckt nöt!

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2003
Citat:

Ursprungligen inskrivet av save
Jäkla svårknäckt nöt!

Tjena, har du löst det här? För jag tror du tänker lite galet. Du har ju uppenbarligen programmerat förut, vilket språk kommer du från, AS2?

Kan du köra det här och posta output?

<?php // Hämta in en användares lista från db och lägg in positionerna i en array $sql = "SELECT id, position FROM tabell WHERE user = '${user}' ORDER BY id"; $result = mysql_query($sql) or die(mysql_error()); $currentPositions = array(); // Initiera tom array för att inte ge en Notice while ($row = mysql_fetch_array($result)) { $currentPositions[$row['id']] = $row['position']; } echo "<pre>Såhär ser listan över element och deras positioner ut\n"; var_dump($currentid); echo "Såhär ser AJAX-listan ut:\n"; var_dump($_GET['listItem']);

Citera gärna, jag glömmer så lätt

Brass knuckles and a 2x4

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2005
Citat:

Ursprungligen inskrivet av jonasc
Tjena, har du löst det här? För jag tror du tänker lite galet. Du har ju uppenbarligen programmerat förut, vilket språk kommer du från, AS2?

Kan du köra det här och posta output?

<?php // Hämta in en användares lista från db och lägg in positionerna i en array $sql = "SELECT id, position FROM tabell WHERE user = '${user}' ORDER BY id"; $result = mysql_query($sql) or die(mysql_error()); $currentPositions = array(); // Initiera tom array för att inte ge en Notice while ($row = mysql_fetch_array($result)) { $currentPositions[$row['id']] = $row['position']; } echo "<pre>Såhär ser listan över element och deras positioner ut\n"; var_dump($currentid); echo "Såhär ser AJAX-listan ut:\n"; var_dump($_GET['listItem']);

Citera gärna, jag glömmer så lätt

Tack för att du tar dig tid! Kommer främst från lingo (flashs gamla storebror).
Jag tog dock en annan väg, istället för att sortera via en egen ordning så ordnade jag en lista som går att sortera via skapelsedatum, namn etc. vilket jag tror är bättre för användaren i slutändan. Men för ni andra som vill ge er på detta (för funktionen är väldigt snygg) kika in här:
http://www.wil-linssen.com/extending-the-jquery-sortable-with...
och även denna kan komma till hands: http://www.karlrixon.co.uk/articles/sql/update-multiple-rows-...

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com