Fritz: jQuery Sortable + PHP

Hallo,

könnt ihr hier ein Fehler sehen?

<section class="test-sortable">

<?php $result = $mysqli->query("SELECT * FROM test WHERE rubrik = 1"); ?>
  <ul id="test-list">
    <?php 
	$i = 1;
	while ($row = $result->fetch_assoc()) { 
    ?>
    <li id="listItem_<?php echo $i;?>">
         <?php echo htmlspecialchars($row["bezeichnung"] . " - " . $row["sort"])?>
    </li>
	<?php $i++; } ?>
   </ul>
</section>
$(document).ready(function(){

 $( "#test-list" ).sortable({
	      
   handle : '.handle',
   update : function () {
		var order = $('#test-list').sortable('serialize');
		$("#info").load("process-sortable.php?"+order);
	 }
 });	 
});              

Das Beispiel habe ich von hier: https://gist.github.com/linssen/2773872

Ich möchte damit erreichen dass sich meine Sortierung ändert indem man einfach einen Beitrag an eine andere Stelle schiebt.

Das PHP im Hintergrund:

foreach ($_GET['listItem'] as $position => $item)
{
    $sql[] = "UPDATE test SET sort = $position WHERE id = $item"; 
}
print_r ($sql); 
  1. Ok, ich muss es so aufbauen

    <li id="listItem_<?php echo $i;?>">
      <?php echo htmlspecialchars($row["bezeichnung"] . " - " . $row["sort"])?>
      <span class="handle">x</span>
    </li>
    

    handle : '.handle' hier wird gesagt mit was er ziehen soll.

    1. Sorry für den weiteren Beitrag, meinen alten kann ich nicht mehr bearbeiten.

      Was ich nicht verstehe ist folgendes. Warum erhalte ich nach dem Update in der Spalte -sort- eine 0. Eine 0 kommt in meinem Script nicht vor? Kann ich irgendwie erreichen dass ich mit einer 1 beginne?

      <?php $result = $mysqli->query("SELECT * FROM test WHERE rubrik = 1 ORDER by sort ASC"); ?>
      	<ul id="test-list">
      	<?php 
      		while ($row = $result->fetch_assoc()) { 
      	?>
      	  <li id="listItem_<?php echo htmlspecialchars($row["id"])?>"><?php echo htmlspecialchars($row["bezeichnung"] . " - Sort: " . $row["sort"])?>
      	  	|| <span class="handle" style="cursor: pointer;">xxx</span>
      	  </li>
      	<?php
      	 } 
      	?>
      	</ul>
      
      <script>
      	$(document).ready(function(){
      
      		$( "#test-list" ).sortable({
      	      
      	      handle : '.handle',
      		  
      		  update : function () {
      			var order = $('#test-list').sortable('serialize');
      			$("#info").load("process-sortable.php?"+order);
      		  }
      	    
      	    });
      	 
      	});              
      </script>
      
      foreach ($_GET['listItem'] as $position => $item)
      {
      
          if ($stmt = $mysqli->prepare("Update test SET sort=? WHERE id = ?"))
      		
      		{    
      			$sort	= $position;
      			$id 	= $item;
      
      			$stmt->bind_param("ss",	
      						$sort,
      						$id
      		 );
      		$stmt->execute();
      }}
      

      Und meine letzte Frage kann ich irgendwie erreichen dass ich meine li innerhalb von id="test-list" ziehen kann und nicht ein extra <span> einsetzen muss?

      1. Tach!

        Was ich nicht verstehe ist folgendes. Warum erhalte ich nach dem Update in der Spalte -sort- eine 0.

        Bitte etwas genauer beschreiben. Welche Operation liefert die 0?

        dedlfix.

        1. Hallo,

          Bitte etwas genauer beschreiben

          Ausgangspunkt, was in meiner Datenbank steht ist folgendes:

          INSERT INTO `test` (`id`, `rubrik`, `bezeichnung`, `sort`) VALUES
          (1, '1', 'Ich bin zum Start an Position 1', '1'),
          (2, '1', 'Ich bin zum Start an Position 2', '2'),
          (3, '1', 'Ich bin zum Start an Position 3', '3');
          

          Nachdem ich die Einträge verschoben habe steht folgendes in der Datenbank

          INSERT INTO `test` (`id`, `rubrik`, `bezeichnung`, `sort`) VALUES
          (1, '1', 'Ich bin zum Start an Position 1', '1'),
          (2, '1', 'Ich bin zum Start an Position 2', '0'),
          (3, '1', 'Ich bin zum Start an Position 3', '2');
          

          Ich habe den zweiten Eintrag an die erste Position geschoben.

          Welche Operation liefert die 0?

          Ich denke PHP?

          1. Tach!

            Welche Operation liefert die 0?

            Ich denke PHP?

            Debugging ist der leider oftmals beschwerliche Weg, das genauer herauszufinden. Durch Auf-den-Code-Schauen findet man meist nur die einfachen offensichtlichen Fälle. Vielleicht ist das Array $_GET['listItem'] die Ursache. Hat dieses explizite Keys, oder sind da nur die standardmäßig vergebenen numerischen Werte beginned mit 0 drin?

            dedlfix.

            1. Hallo,

              Vielleicht ist das Array $_GET['listItem'] die Ursache. Hat dieses explizite Keys, oder sind da nur die standardmäßig vergebenen numerischen Werte beginned mit 0 drin?

              Wenn ich mir

              var_dump($_GET['listItem']);
              

              ausgeben lasse, erhalte ich dieses

              array(3) {
                [0]=>
                string(1) "2"
                [1]=>
                string(1) "3"
                [2]=>
                string(1) "1"
              }
              

              Dann gehe ich davon aus, dass es am

              standardmäßig vergebenen numerischen Werte

              liegt? Kann man dieses irgendwie überschrieben? Ansonsten muss ich eben meine Abfrage etwas anpassen.

              1. Tach!

                Dann gehe ich davon aus, dass es am

                standardmäßig vergebenen numerischen Werte

                liegt? Kann man dieses irgendwie überschrieben?

                Manchmal sieht man die einfachsten Dinge nicht ;) Eine 1 dazurechnen.

                $sort = $position + 1;
                

                dedlfix.

                1. Hallo,

                  Manchmal sieht man die einfachsten Dinge nicht ;) Eine 1 dazurechnen.

                  $sort = $position + 1;
                  

                  dankeschön, es hat wunderbar funktioniert.

      2. Und meine letzte Frage kann ich irgendwie erreichen dass ich meine li innerhalb von id="test-list" ziehen kann und nicht ein extra <span> einsetzen muss?

        Das Problem ist auch behoben. Geht mit dieser Zeile JavaScript Code

        $( "#test-list" ).disableSelection();
        
      3. Nachdem dedlfix das "+1" Problem gelöst hat, möchte ich noch einen Hinweis zum SQL einwerfen.

        // Deins, etwas reformatiert
        
        foreach ($_GET['listItem'] as $position => $item)
        {
            if ($stmt = $mysqli->prepare("Update test SET sort=? WHERE id = ?"))
            {    
                $sort = $position;
                $id   = $item;
        
                $stmt->bind_param("ss", $sort, $id);
                $stmt->execute();
            }
        }
        

        Gebundene Parameter benutzt man etwas anders. Wenn eine Schleife eingesetzt wird, macht man den prepare nur einmal. Und bind_param bindet eine Referenz auf Variablen an das Statement, d.h. auch das macht man nur einmal und schreibt danach nur noch die Werte in die gebundenen Variablen. Ganz wichtig ist dann am Ende der stmt->close, um Ressourcen und Bindungen wieder freizugeben.

        // Mein Vorschlag
        if ($stmt = $mysqli->prepare("Update test SET sort=? WHERE id = ?"))
        {    
            $stmt->bind_param("ss", $sort, $id);
            foreach ($_GET['listItem'] as $position => $item)
            {
                $sort = $position;
                $id   = $item;
                $stmt->execute();
            }
            $stmt->close();
        }
        

        Ob man die foreach-Variablen direkt binden kann, weiß ich nicht, das müsste man mal ausprobieren. Es wäre ein netter Platzsparer.

            $stmt->bind_param("ss", $position, $item);
            foreach ($_GET['listItem'] as $position => $item)
            {
                $stmt->execute();
            }
        

        Rolf