Counter über + / - verändern und in Datenbank aktualisieren

^^ es geht! Ich freu mich ja so :)

Vielen vielen Dank, jetzt kann ich zufrieden ins Bett gehen :D

EDIT: eine Sache wäre da noch, der aktuelle Counter wird erst angezeigt, nachdem man einmaö + oder - gedrückt hat. Was müsste man in dem Script hinzufügen um z.b. in der counter.php den aktuellen Stand abzufragen?
 
Zuletzt bearbeitet:
Code:
$(document).ready(function () {
  $.get('counter.php', function (data) {
    $('#counter-value').text(data);
  });
  $('#counter-minus').click(function () {
    $.get('counter.php', { action: 'minus' }, function (data) {
      $('#counter-value').text(data);
    });
    $.get('counter.php', { action: 'plus' }, function (data) {
      $('#counter-value').text(data);
    });
  });
});
PHP:
$counter; // aus Datenbank
if(isset($_GET['action'])) {
  if($_GET['action'] === 'minus') {
    --$counter;
  } elseif($_GET['action'] === 'plus') {
    ++$counter;
  }
}

echo $counter;
 
Zuletzt bearbeitet:
danke, habe gerade selbst noch rumprobiert und das folgende gemacht
PHP:
$(document).ready(function () {

	$.get('counter.php', { action: 'init' }, function (data) {
      $('#counter-value').text(data);
    });

  $('#counter-minus').click(function () {
    $.get('counter.php', { action: 'minus' }, function (data) {
      $('#counter-value').text(data);
    });
  });
  $('#counter-plus').click(function () {
    $.get('counter.php', { action: 'plus' }, function (data) {
      $('#counter-value').text(data);
    });
  });
});

Aber zwecks Code Optimierung werde ich deine Variante übernehmen :)

Man kennt ja von diversen Seiten mit Ajax diese Ladeanzeigen, wenn etwas ausgeführt wurde. Nur mal rein theoretisch, wie kann man abfragen, dass das Ajax Script fertig ist?

überlegt hatte ich mir dann + / - zu sperren bis das script den befehl ausgeführt hat
 
Wie willst du das denn genau sperren? Bei normalen Buttons kannst du sie als disabled markieren. Das geht allerdings bei Ankern nicht. Da könntest du höchstens dafür sorgen, dass bei einem Klick nichts passiert.
 
mh das weiß ich nicht genau. Mir ist dann noch eingefallen, man könnte bei Aufruf des event handlers die Buttons "deaktivieren" und wenn es zur Callback Funktion kommt, wieder "aktivieren".

Ich weiß nur noch nicht ganz wie man das deaktivieren/aktivieren umsetzen könnte.
Wenn + und - Grafiken wären, könnte man bei deaktivieren für beide eine graue Grafik laden und die EventHandler sperren über eine Variable, die in der Callback Funktion wieder zurück gesetzt wird.

EDIT:
Jetzt muss ich mir noch überlegen wie ich das umsetze, wenn ich mehrere Counter habe, also es werden über 5 sein. Meine Idee war über die href id das zu lösen. nur müsste ich die ID irgendwie an die Counter PHP weitergeben.

EDIT2:
Das wäre der Code den ich jetzt mit dem Counter verbinden müsste.

PHP:
<?php
// Verbindung oeffnen und Datenbank ausweahlen
include("config.php");

// Anfrage zusammenstellen um die Datensaetze auszulesen
$sql = "SELECT `Name`, `Anzahl` FROM `artikel`";
// Anfrage an die DB schicken und die Rueckmeldung in eine Variable ablegen
$abfrageergebnis = mysql_query( $sql, $db_con );

// Tabelle erstellen fuer die Ausgabe
echo '<table border="1" width="450">';
echo "<tr><th>Artikel</th><th>Anzahl</th></tr>";
// Ab hier werden die Datensaetze zeilenweise ausgeben (auch fetchen genannt)
while ($datensatz = mysql_fetch_array( $abfrageergebnis ))
{    
	$name = htmlspecialchars( $datensatz['Name'] );
	$anzahl = htmlspecialchars( $datensatz['Anzahl'] );
	$id = htmlspecialchars( $datensatz['ID'] );
    // Jeder Datensatz entspricht einer Tabellenzeile
    echo "<tr>";
    echo "<td>" .$name. '<a id="counter-plus" href="#plus">+</a></td>';
    echo "<td>" .$anzahl. "</td>";
    echo "</tr>";
}
// Tabelle schliessen
echo "</table>";

?>


Hinter jedem Name soll ein eigener Counter stehen.
PHP:
    $name = htmlspecialchars( $datensatz['Name'] );

ich habe mir überlegt man könnte an der Stelle
PHP:
 $.get('counter.php', { action: 'minus' }, function (data) {
könnte man eine neue "action" hinzufügen oder hinter counter.php ein ?id=ID hängen?
Das könnte ich dann in der Counter.php über Get abfragen.
 
Zuletzt bearbeitet:
PHP:
<?php
require_once 'config.php';

$sql = 'SELECT `id`, `name`, `anzahl` FROM `artikel`';
if(($result = mysql_query($sql, $db_con)) === false) {
  die('<b>Verbindung zur Datenbank fehlgeschlagen!</b>');
}
?>
<table border="1">
  <thead>
    <th>Artikel</th>
    <th>Anzahl</th>
  </thead>
  <tbody>
<?php while($row = mysql_fetch_array($result)): ?>
    <tr data-dataset-id="<?php echo $result['id'] ?>">
      <td><?php echo $result['name'] ?> (<a class="counter-minus" href="#minus">–</a>/<a class="counter-plus" href="#plus">+</a>)</td>
      <td><?php echo $result['anzahl'] ?></td>
    </tr>
<?php whileend; ?>
  </tbody>
</table>
Code:
$(document).ready(function () {
  $.getJSON('counter.php', function (data) {
    for(var dataset in data) {
      $('tr[data-dataset-id=" + dataset['id'] + "] > td:last').text(dataset['count']);
    }
  });
  $('a.counter-minus').click(function () {
    row = $(this).parent().parent();
    $.get('counter.php', { action: 'minus', id: row.attr('data-dataset-id') }, function (data) {
      row.last().text(data['count']);
    });
  });
  $('a.counter-plus').click(function () {
    row = $(this).parent().parent();
    $.get('counter.php', { action: 'plus', id: row.attr('data-dataset-id') }, function (data) {
      row.last().text(data['count']);
    });
  });
});
PHP:
if(isset($_GET['action']) && isset($_GET['id'])) {
  $sql = 'SELECT `anzahl` FROM `artikel` WHERE `id` = ' . (int) $_GET['id'];
  // Datenbankabfrage ... => $result
  if($_GET['action'] === 'minus') {
    echo (((int) $result[0]['anzahl']) - 1);
  } elseif($_GET['action'] === 'plus') {
    echo (((int) $result[0]['anzahl']) + 1);
  }
  // speichern
} else {
  $sql = 'SELECT `id`, `anzahl` FROM `artikel`';
  // Datenbankabfrage ... => $result;
  echo json_encode($result);
  // speichern
}
 
oh, da war aber richtig viel zum ändern nötig. Das hatte ich nicht gedacht, sonst hätte ich das gleich am Anfang geschrieben. Ich kann mich immer nur wieder bedanken :)

Ein Fehler ist allerdings noch im Script, da komm ich nicht drauf was da falsch ist.
Der Fehler ist in dieser Zeile
Code:
$('tr[data-dataset-id=" + dataset['id'] + "] > td:last').text(dataset['count']);
 
ok, die Ausgabe funktioniert nun. Aber die Werte ändern sich nicht. Also weder in der Datenbank noch auf dem Bildschirm. Bin gerade am prüfen ob vll noch im DB Teil von counter.php ein Fehler drin ist.
Aber das ganze ist recht schwer zu testen irgendwie.
 
Zurück