Veritabanı + JavaScript (jQuery) PHP / MySQL Swap yerler

2 Cevap php

Şu anda PHP ve jQuery kullanarak bir MySQL veritabanı imlerinin bir web sitesi geliştiriyorum.

Imleri için MySQL bu (CSV formatında) gibi görünüyor:

id,userid,link_count,url,title,description,tags,shareid,fav,date
"1";"1";"0";"img/test/google.png";"Google";"Best. Search Engine. Ever.";"google, search, engine";"7nbsp";"0";"1267578934"
"2";"1";"1";"img/test/james-brooks.png";"jTutorials";"Best. jQuery Tutorials. Ever.";"jquery, jtutorials, tutorials";"8nbsp";"0";"1267578934"
"3";"1";"2";"img/test/benokshosting.png";"Benoks Hosting";"Cheap website hosting";"Benoks, Hosting, server, linux, cpanel";"9nbsp;";"0";"1267578934"
"4";"1";"3";"img/test/jbrooks.png";"James Brooks";"Personal website FTW!";"james, brooks, jbrooksuk, blog, personal, portfolio";"1nbsp";"0";"1267578934"
"6";"1";"4";"img/test/linkbase.png";"LinkBase";"Store and organise your bookmarks and access them from anywhere!";"linkbase, bookmarks, organisation";"3nbsp";"0";"1267578934"
"5";"1";"5";"img/test/jtutorials.png";"jTutorials";"jQuery tutorials, videos and examples!";"jquery, jtutorials, tutorials";"2nbsp";"0";"1267578934"

Ben (Google Chrome nasıl yaptığını benzer) etrafında yer imlerini taşımak için jQuery sıralanabilir kullanıyorum. Burada yer imleri biçimlendirmek ve PHP sayfasına veri göndermek için kullanabileceğiniz JavaScript kodu:

$(".bookmarks").sortable({scroll: false, update: function(event, ui){
        // Update bookmark position in the database when the bookmark is dropped
        var newItems = $("ul.bookmarks").sortable('toArray');
        console.log(newItems);
        var oldItems = "";
        for(var imgI=0;imgI < newItems.length;imgI++) {
            oldItems += $("ul.bookmarks li#" + imgI + " img").attr("id") + ",";
        }
        oldItems = oldItems.slice(0, oldItems.length-1);
        console.log("New position: " + newItems);
        console.log("Old position: " + oldItems);

        // Post the data 
        $.post('inc/updateBookmarks.php', 'update=true&olditems=' + oldItems + "&newitems=" + newItems, function(r) {
            console.log(r);
        });
    }
});

PHP sayfası o zaman gibi, patlayabilir kullanarak yayınlanan diziler bölme gider:

if(isset($pstUpdate)) {
    // Get the current and new positions
    $arrOldItems = $_POST['olditems'];
    $arrOldItems = explode(",", $arrOldItems);

    $arrNewItems = $_POST['newitems'];
    $arrNewItems = explode(",", $arrNewItems);

    // Get the user id
    $usrID = $U->user_field('id');

    // Update the old place to the new one
    for($anID=0;$anID<count($arrOldItems);$anID++) {
        //echo "UPDATE linkz SET link_count='" . $arrNewItems[$anID] . "' WHERE userid='" . $usrID . "' AND link_count='" . $arrOldItems[$anID] . "'\n";
        //echo "SELECT id FROM linkz WHERE link_id='".$arrOldItems[$anID]."' AND userid='".$usrID."'";

        $curLinkID = mysql_fetch_array(mysql_query("SELECT id FROM linkz WHERE link_count='".$arrOldItems[$anID]."' AND userid='".$usrID."'")) or die(mysql_error());
        echo $arrOldItems[$anID] . " => " . $arrNewItems[$anID] . " => " . $curLinkID['id'] . "\n";

        //mysql_query("UPDATE linkz SET link_count='" . $arrNewItems[$anID] . "' WHERE userid='" . $usrID . "' AND link_count='" . $curLinkID['id'] . "'") or die(mysql_error());

        // Join a string with the new positions
        $outPos .= $arrNewItems[$anID] . "|";
    }

    echo substr($outPos, 0, strlen($outPost) - 1);
}

Yani, her imi (ki her kullanıcı için 0'dan başlar) o kendi LINK_COUNT kimliği verilir. Bir yer imi değişti her zaman, ben gerektiği gibi değiştirilmesi LINK_COUNT gerekir. Biz yerlerden başlayarak bu dizi çıktısı alırsak:

Array
(
    [0] => 0
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
)

LINK_COUNT konumunu eşit Her endeks, çıkan güncelleme olacak:

Array
(
    [0] => 1
    [1] => 0
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 2
)

Ben birçok yolu denedim ama hiçbiri başarılı.

Şimdiden teşekkürler.

2 Cevap

, Googling arama ve test bazı uzun saat sonra, ben pratik bir şey ile gelip, ama 100% ettik.

// Update the old place to the new one
for($anID=0;$anID<count($arrOldItems);$anID++) {
    if($oldCycle != $arrNewItems[$anID]) {
        if($arrOldItems[$anID] != $arrNewItems[$anID]) {
            $sQuery = "UPDATE linkz AS rule1 JOIN linkz AS rule2 ON (rule1.link_count = $arrOldItems[$anID] AND rule2.link_count = $arrNewItems[$anID]) OR ( rule1.link_count = $arrNewItems[$anID] AND rule2.link_count = $arrOldItems[$anID]) SET rule1.link_count = rule2.link_count, rule2.link_count = rule1.link_count";
            mysql_query($sQuery) or die(mysql_error());
            // Now set a temporary variable which we'll check later
            $oldCycle = $anID;
        }
    }else{
        $oldCycle = NULL;
    }
}

Bu tür, ancak iki kez aynı yer imlerini takas izin vermez, çalışır. Ben bir şey bulurum.

Şimdiye kadar ben yanlış değere her li.droplet bir img ID özniteliği ayarlayarak olduğunu öğrenmek için idare ettik, şimdi (veritabanından) eşleşen LINK_COUNT hazırsınız.

Ben de fark ettim ki, örneğin, biz sırayla başlayan imleri varsa: 0,1,2,3,4,5

Ve biz 1 yerleştirmek için 0 imi sürüklemek, böylece yeni çıktı, 1,0,2,3,4,5

(Yeni) PHP çıktısı:

// Update the old place to the new one
for($anID=0;$anID<count($arrOldItems);$anID++) {            
    echo $arrNewItems[$anID] . " = " . $arrOldItems[$anID] . "\n";
    echo $arrOldItems[$anID] . " = " . $arrNewItems[$anID] . "\n\n";

    //mysql_query("UPDATE linkz SET link_count='" . $arrNewItems[$anID] . "' WHERE userid='" . $usrID . "' AND link_count='" . $arrOldItems[$anID] . "'") or die(mysql_error());

    //mysql_query("UPDATE linkz SET link_count='" . $arrOldItems[$anID] . "' WHERE userid='" . $usrID . "' AND link_count='" . $arrNewItems[$anID] . "'") or die(mysql_error());
}

becomes, 1 = 0, 0 = 1 0 = 1, 1 = 0

2 = 2, 2 = 2

3 = 3, 3 = 3

4 = 4, 4 = 4

5 = 5, 5 = 5 If we take a look at the bits in bold, we can see that the data is being over written again so how can I go about stopping that from happening?