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

stimmt, daran habe ich gar nicht gedacht.
Ok was mir auffällt beim Testen der Variablen Werte, $result[0] hat keinen Wert ist also leer.
ist das normal, wenn man den Counter direkt aufruft?

EDIT:

hier noch mal der Code aus counter.php

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



if(isset($_GET['action']) && isset($_GET['id'])) {
  $sql = 'SELECT `anzahl` FROM `artikel` WHERE `id` = ' . (int) $_GET['id'];
  if(($result = mysql_query($sql, $db_con)) === false) {
 	 die('<b>Verbindung zur Datenbank fehlgeschlagen***</b><br>');
   }

  if($_GET['action'] === 'minus') {
    echo (((int) $result[0]['anzahl']) - 1);
  } elseif($_GET['action'] === 'plus') {
    echo (((int) $result[0]['anzahl']) + 1);
  }
  
  echo "<br>result: ".$result[0]." id: " .$_GET['id'] ."<br>";
  // speichern
  $sql = 'UPDATE `artikel` SET `Anzahl` = '.$result[0].' WHERE `id` = ' . (int) $_GET['id'];
  if(($result = mysql_query($sql, $db_con)) === false) {
 	 die('<br><b>Verbindung zur Datenbank fehlgeschlagen!2</b><br>');
   }
  
} else {
  $sql = 'SELECT `id`, `anzahl` FROM `artikel`';
  if(($result = mysql_query($sql, $db_con)) === false) {
  	die('<b>Verbindung zur Datenbank fehlgeschlagen!3</b>');
   }
  echo json_encode($result);
    // speichern
  $sql = 'UPDATE `artikel` SET `Anzahl` = '.$result[0].' WHERE `id` = ' . (int) $_GET['id'];
  if(($result = mysql_query($sql, $db_con)) === false) {
 	 die('<b>Verbindung zur Datenbank fehlgeschlagen!4</b>');
   }
}


Ausgabe im Browser
-1
result: id: 6

Verbindung zur Datenbank fehlgeschlagen!2



ID 6 ist in der DB belegt.


EDIT2:
ach, da hat noch ein fetch array gefehlt.

EDIT3:
kurze Verständnis Frage, ist der unterste else Zweig in der Counter.php um den Wert am Anfang auszugeben? Ist es da sinnvoll den Wert zu holen und wieder zu speichern?
 
Zuletzt bearbeitet:
Genau. Der äußere else-Zweig dient allein dazu alle Werte als Array im JSON-Format auszugeben. Das passiert, wenn du das Skript ohne Parameter aufrufst. Du änderst also auch nichts und somit ist die UPDATE-Anweisung am Ende auch unsinnig.

Nachtrag: Du solltest noch einige Stellen ändern. Überall, wo ein Fehler im Zusammenhang mit der Datenbank auftritt, solltest du lieber folgendes schreiben:
PHP:
header('Status-Code: 500 Internal Server Error');
Das hat den Vorteil, dass die AJAX-Anfrage fehlschlägt und du das in Javascript abfangen kannst.
 
Zuletzt bearbeitet:
PHP:
counter.php?action=minus&id=1

diese Art von aufrufe funktionieren nun. Also plus und minus funktionieren für entsprechende Ids.

Was nun noch einen Fehler ausgibt ist

PHP:
counter.php

Da kommt
Code:
Warning: [json] (json_encode_r) type is unsupported, encoded as null.

Heißt das nur, dass der Browser damit nichts anfangen kann( also das auszugeben), oder ist da noch ein Fehler?

hier nochmal die komplette counter.php

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


if(isset($_GET['action']) && isset($_GET['id'])) {
  $sql = 'SELECT `anzahl` FROM `artikel` WHERE `id` = ' . (int) $_GET['id'];
  if(($result = mysql_query($sql, $db_con)) === false) {
 	 die('<b>Verbindung zur Datenbank fehlgeschlagen***</b><br>');
   }
  $row = mysql_fetch_array($result);

  if($_GET['action'] === 'minus') {
    --$row['anzahl'];
	
  } elseif($_GET['action'] === 'plus') {
	++$row['anzahl'];
  }
  echo $row['anzahl'] ;

  // speichern
  $sql = 'UPDATE `artikel` SET `Anzahl` = '.$row['anzahl'].' WHERE `id` = ' . (int) $_GET['id'];
  if(($result = mysql_query($sql, $db_con)) === false) {
 	 die('<br><b>Verbindung zur Datenbank fehlgeschlagen!2</b><br>');
   }
  
} else {
  $sql = 'SELECT `id`, `anzahl` FROM `artikel`';
  if(($result = mysql_query($sql, $db_con)) === false) {
  	die('<b>Verbindung zur Datenbank fehlgeschlagen!3</b>');
   }
  echo json_encode($result);
 }
?>
 
alles klar, habe ich gemacht.

Die counter.php scheint nun fehlerfrei zu laufen.

im zusammen spiel scheint es aber noch nicht zu klappen.
Wenn ich auf + oder - klicke passiert gar nichts. auch in der Datenbank nicht.


Hier mal beide Dateien:

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


if(isset($_GET['action']) && isset($_GET['id'])) {
  $sql = 'SELECT `anzahl` FROM `artikel` WHERE `id` = ' . (int) $_GET['id'];
  if(($result = mysql_query($sql, $db_con)) === false) {
 	 die('<b>Verbindung zur Datenbank fehlgeschlagen***</b><br>');
	 header('Status-Code: 500 Internal Server Error1');
   }
  $row = mysql_fetch_array($result);

  if($_GET['action'] === 'minus') {
    --$row['anzahl'];
	
  } elseif($_GET['action'] === 'plus') {
	++$row['anzahl'];
  }
  echo $row['anzahl'] ;

  // speichern
  $sql = 'UPDATE `artikel` SET `Anzahl` = '.$row['anzahl'].' WHERE `id` = ' . (int) $_GET['id'];
  if(($result = mysql_query($sql, $db_con)) === false) {
 	 die('<br><b>Verbindung zur Datenbank fehlgeschlagen!2</b><br>');
	 header('Status-Code: 500 Internal Server Error2');
   }
  
} else {
  $sql = 'SELECT `id`, `anzahl` FROM `artikel`';
  if(($result = mysql_query($sql, $db_con)) === false) {
  	die('<b>Verbindung zur Datenbank fehlgeschlagen!3</b>');
	header('Status-Code: 500 Internal Server Error3');
   }

	$ar_werte = array();
	while($row = mysql_fetch_array($result))
	{
	   $ar_werte[] = $row['anzahl'];   
	}   
   
  echo json_encode($ar_werte);
 }
?>


ausgabe
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
  <title>AJAX-Counter</title>
  <link href="mediagroove.css" rel="stylesheet" type="text/css">
  <script type="text/javascript" src="jquery.js"></script>
  <script type="text/javascript">
		
	
	$(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']);
		});
	  });
	});

  </script>
  </head>
  <body>
	<?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>
    <thead>
        <tr>
        <th>Artikel</th>
        <th>Anzahl</th>
      </tr>
      </thead>
      
      
    <?php 
    // Durch Iterieren der Datensätze
    while($row = mysql_fetch_array($result)){ ?>
        <tr data-dataset-id="<?php echo $row['id'] ?>">
          <td><?php echo $row['name'] ?></td>
          <td>
              <a id="counter-minus" href="#minus"><img src="icon/32x32/2.png" border=0 /></a>
              <?php echo $row['anzahl'] ?>
              <a id="counter-plus" href="#plus"><img src="icon/32x32/1.png" border=0/></a>
          </td>
        </tr>
    <?php } ?>
    
    
    
    </table>
</body>
</html>
 
PHP:
$data = array();
while($row = mysql_fetch_array($result)) { 
  $data[] = array(
    'id'    => $row['id'],
    'count' => $row['anzahl'],
  );
}

echo json_encode($data);
Außerdem entferne mal alle die()-Funktionen.

Nachtrag: Ansonsten verwende noch die Javascript-Variante:
Code:
$(document).ready(function () {
  $.getJSON('counter.php', function (data) {
    for(var dataset in data) {
      $('tr[data-dataset-id="' + dataset['id'] + '"] span').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.filter('span').text(data);
      return false;
    });
  });
  $('a.counter-plus').click(function () {
    row = $(this).parent().parent();
    $.get('counter.php', { action: 'plus', id: row.attr('data-dataset-id') }, function (data) {
      row.filter('span').text(data);
      return false;
    });
  });
});
Nachtrag 2:
PHP:
<?php
  require_once 'config.php';
  $sql = 'SELECT `id`, `name`, `anzahl` FROM `artikel`';
  if(($result = mysql_query($sql, $db_con)) === false) {
    header('Status-Code: 500 Internal Server Error');
  }
?>
<!DOCTYPE html>
<html>
<head>
  <title>AJAX-Counter</title>
  <link href="mediagroove.css" rel="stylesheet" type="text/css" />
  <script type="text/javascript" src="jquery.js"></script>
  <script type="text/javascript">
    # siehe oben
  </script>
</head>
<body>
  <table>
    <thead>
      <tr>
        <th>Artikel</th>
        <th>Anzahl</th>
      </tr>
    </thead>
    <tbody>
<?php while($row = mysql_fetch_array($result)): ?>
      <tr data-dataset-id="<?php echo $row['id'] ?>">
        <td><?php echo $row['name'] ?></td>
        <td>
          <a class="counter-minus" href="#minus"><img src="icon/32x32/2.png" border="0" /></a>
          <span><?php echo $row['anzahl'] ?></span>
          <a class="counter-plus" href="#plus"><img src="icon/32x32/1.png" border="0" /></a>
        </td>
      </tr>
<?php whileend; ?>
    </tbody>
  </table>
</body>
</html>
 
Zuletzt bearbeitet:
yay, es geht.... FAST!
die werte verändern sich nun in der Datenbank. Aber die Anzeige aktualisiert sich noch nicht.

ein kleiner Fehler, nur weil es schon das zweite mal war, es heißt endwhile und nicht whileend ;)
 
Ich danke dir für den Hinweis auf das endwhile. Ansonsten lass dir mal anzeigen, welchen Wert row in der innersten Callback-Funktion hat.
 
bin mir nicht ganz sicher wie ich an den wert von row komme, aber ich habs mal so probiert(denke das war mit der innersten callback funktion gemeint):

Code:
$.get('counter.php', { action: 'minus', id: row.attr('data-dataset-id') }, function (data) {
      row.filter('span').text(data);
	  alert(row.filter('span').text(data));
      return false;
    });

liefert nur [object Object]

alternativ nur alert(row)
liefert das Gleiche.
 
Zurück