Wert wird um 2 statt um 1 erhöht

quidnovi

Erfahrenes Mitglied
Hi @ all,

möchte einen Wert aus einer Mysql DB um eins erhöhen.

Das Ganze läuft mit Session.

Mit folgendem Code schicke ich den Befehl zum addieren an ein Verarbeitungsscript:
PHP:
echo '<a href="./update.php?plus='.$row['id'].'">';
		echo '<input type="image" src="../../images/gif/but_plus.gif" border="0"  name="send" alt="+1" title="+1">;

Im Verarbeitungsscript steht folgender Code:
PHP:
// gewählter Datensatz +1
	if(!empty($_GET['plus'])){
		$sql = "SELECT * FROM gesammelt where id = ".$plus."";
		$res = mysql_query($sql)or die (mysql_error(). "<br />" . $sql);
		$num = mysql_num_rows($res);
		while ($row = mysql_fetch_array($res)){
			$erg = ($row['menge'] + 1);
		}

		$sql = "UPDATE gesammelt SET menge = ".$erg." where id = ".$plus."";
		$res = mysql_query($sql)or die (mysql_error());
		mysql_close($connection);
		header("Location:./ausDb.php");
		die();
	}

Wenn ich nun das Script das erste mal starte, wird auch nur der Wert um eins erhöht.
Das Verarbeitungsscript leitet mich wieder auf das 1. Script zurück und gibt mir den richtigen Wert aus.

Möchte ich aber wieder um eins erhöhen, wird der Wert um 2 erhöht.

Denke dass das mit der Session zu tun hat, kann aber mit "unset()" nicht arbeiten, da dann der Wert aus der DB verloren geht.

Könnt Ihr mir bitte auf die Sprünge helfen? Danke
 
Anstatt diesen komplizierten und unnötigen Weg zu benutzen kannst du auch die einfache SQL Syntax verwenden:
Code:
UPDATE `table` SET field = field + 1
 
Hi,

danke, ist der viel bessere Code - nur das Problem besteht immer noch.

Ich weiß nicht, woher er den doppelten Wert nimmt.
 
Höchstwahrscheinlich wird der Code 2mal durchlaufen - 2 Frames oder weiß der Teufel :-).

cu Bloddy
 
hier mal der ganze Code:
PHP:
session_start();
	error_reporting(E_ALL);

	//Datenbankressourcen
	$server = "xxxx";
	$dbUser = "xxxx";
	$dbPw   = "xxx";
	$dbName = "xxx";

	// Verbindung zur DB aufbauen
	if(!($connection = @ mysql_pconnect($server,$dbUser,$dbPw)))
		echo "Verbindungsfehler zur Datenbank: " . (mysql_error());

	// Verbindung zur Tabelle wochenbericht aufbauen
	if (!mysql_select_db($dbName, $connection))
		echo "Verbindungsfehler zu Datenbanktabelle berechnungstool: " . (mysql_error());

	// gewählter Datensatz löschen
	if(!empty($_GET['del'])){
		$sql = "DELETE FROM gesammelt where id = ".$del."";
		$res = mysql_query($sql)or die (mysql_error(). " " . $sql);
		mysql_close($connection);
		header("Location:./ausDb.php");
		die();
	}

	// gewählter Datensatz +1
	if(!empty($_GET['plus'])){
		$sql = "UPDATE gesammelt SET menge = menge + 1 where id = ".$plus."";
		$res = mysql_query($sql)or die (mysql_error());
		mysql_close($connection);
		header("Location:./ausDb.php");
		die();
	}

	// gewählter Datensatz -1
	if(!empty($_GET['minus'])){
		$sql = "UPDATE gesammelt SET menge = menge - 1 where id = ".$minus."";
		$res = mysql_query($sql)or die (mysql_error());
		mysql_close($connection);
		header("Location:./ausDb.php");
		die();
	}

Würde beim besten Willen keinen Fehler entdecken, ihr vielleicht?
 
bin eben draufgekommen, dass immer das doppelte genommen wird.

Also wenn ich menge + 5 nehme, dann wird der Wert des Feldes um 10 erhöht!

Jetzt weiß ich, warum bei menge + 1 der Wert immer um 2 erhöht wird.

Aber warum ist das so?
 
Hallo quidnovi,

dem ist definitiv nicht so! Es wird nur um die Anzahl erhöht, die auch addiert wird, nicht das Doppelte oder Dreifache. Wie bereits gesagt vermute ich, dass der Code 2mal ausgeführt wird. In welchem Zusammenhang diese Konstellation auftreten kann, wird dir eher bewußt sein, als mir. Dafür fehlen einfach noch Infos bzgl. der Umgebung, in der das Script läuft. Du hast nach der eigentlichen Aktion eine Weiterleitung (header) eingebaut...gib zum Debugzweck an dieser Stelle doch mal etwas aus - Debugging in PHP ist ja leider nicht so einfach wie in anderen Sprachen, es sei denn du arbeitest mit ZEND Studio :-).

Viele Grüße
Robert
 
Tja, habe nun einfach ein "echo" ausgegeben und dann in die DB geschaut, das selbe Ergebnis. Der Wert wurde um das doppelte erhöht.

Die Umgebung:

PHP Version 4.4.1
MySQL 5.0.15-nt
xampp

Ich weiß schon, dass der Befehl zum addieren sonst schon funktioniert. Aber ich weiß leider nicht, wo und wie ich den Fehler eingrenzen kann.
 
Ich stehe vor einem Rätsel. Daher poste ich mal den kompletten Code.

Mit diesem Script rufe ich die Datenbank ab:
PHP:
<?php

        session_start();
	include('../../warenkorb_defaults.php');
	include('../../include/functions.php');
	
	// Daten aus DB holen

	//Datenbankressourcen
	$server = "xxx";
	$dbUser = "xxx";
	$dbPw   = "xxx";
	$dbName = "xxx";

	// Verbindung zur DB aufbauen
	if(!($connection = @ mysql_pconnect($server,$dbUser,$dbPw)))
		echo "Verbindungsfehler zur Datenbank: " . (mysql_error());

	// Verbindung zur Tabelle wochenbericht aufbauen
	if (!mysql_select_db($dbName, $connection))
		echo "Verbindungsfehler zu Datenbanktabelle berechnungstool: " . (mysql_error());

	$sql = "SELECT * FROM gesammelt where kennung = ".$_SESSION['counter']."";
	$res = mysql_query($sql)or die (mysql_error());
	
	//Abfrage der Datensatzmenge
	$num = mysql_num_rows($res);

?>

	<table width="800" height="" align="center" border="1"  bordercolor="#90ACC8" bgcolor="#f4e3d3" cellpadding="0" cellspacing="0">
	 <form action="./inDb.php" method="post">
	  <tr>
	   <!--<td align="center">ID</td>-->
	   <td align="center">ArtNr</td>
	   <td align="center">Bezeichnung</td>
	   <td align="center">Einzelpreis</td>
	   <td align="center">Gesamtpreis</td>
	   <td align="center">Menge</td>
	   <td align="center">L&auml;nge</td>
	   <td align="center">del</td>
	   <td align="center">+1</td>
	   <td align="center">-1</td>
	  </tr>
<?php

		while ($row = mysql_fetch_array($res)){
			
		//Tabellenzeilen fuellen
		echo '<tr height="30">';
		//echo '<td>'.$row['id'].'</td>';
		echo '<td>'.$row['artNr'].'</td>';
		echo '<td>'.$row['beschreibung'].'</td>';
		echo '<td>'.$row['einzelPreis'].'</td>';
		echo '<td>'.$row['gesamtPreis'].'</td>';
		//echo '<td><input type="text" value="'.$row['menge'].'" name="menge" size="3"></td>';
		echo '<td>'.$row['menge'].'</td>';
		echo '<td>'.$row['laenge'].'</td>';

		// loeschen
        echo '<td align="center">';
		echo '<a href="./update.php?del='.$row['id'].'">';
		echo '<input type="image" src="../../images/gif/but_del.gif" border="0"  name="send" value="del" alt="l&ouml;schen" title="l&ouml;schen"></td>';

		// +1
		echo '<td align="center">';
		echo '<a href="./update.php?plus='.$row['id'].'">';
		echo '<input type="image" src="../../images/gif/but_plus.gif" border="0"  name="send"  value="plus" alt="+1" title="+1"></td>';

		// -1
		echo '<td align="center">';
		echo '<a href="./update.php?minus='.$row['id'].'">';
		echo '<input type="image" src="../../images/gif/but_minus.gif" border="0"  name="send"  value="minus" alt="-1" title="-1"></td>';
	}

				
		//Tabellenende
		echo "</tr></table>";

		//Schliessen der Datenbank
		mysql_close($connection);
?>

		<table width="800" height="50" align="center" border="1"  bordercolor="#90ACC8" bgcolor="#f4e3d3" cellpadding="0" cellspacing="0">
	     <tr>
	       <td width="400" align="center"><a href="../../index.php">auf Stick speichern</a></td>
		   <td width="400" align="center"><?php echo '<a href="./update.php?name=delAll">'; ?>zur&uuml;ck an den Anfang</a></td>
		  </tr>
		</table>

Das Script, das die Befehle ausführt und auf den aufrufende Script zurückleitet:
PHP:
error_reporting(E_ALL);

	//Datenbankressourcen
	$server = "xxx";
	$dbUser = "xxx";
	$dbPw   = "xxx";
	$dbName = "xxx";

	// Verbindung zur DB aufbauen
	if(!($connection = @ mysql_pconnect($server,$dbUser,$dbPw)))
		echo "Verbindungsfehler zur Datenbank: " . (mysql_error());

	// Verbindung zur Tabelle wochenbericht aufbauen
	if (!mysql_select_db($dbName, $connection))
		echo "Verbindungsfehler zu Datenbanktabelle berechnungstool: " . (mysql_error());

	// gewählter Datensatz löschen
	if(!empty($_GET['del'])){
		$sql = "DELETE FROM gesammelt where id = ".$del."";
		$res = mysql_query($sql)or die (mysql_error(). "<br /> " . $sql);
		mysql_close($connection);
		//header("Location:./ausDb.php");
		//die();
	}

	// gewählter Datensatz +1
    if(!empty($_GET['plus'])){
        $sql = "UPDATE gesammelt SET menge = menge + 55 where id = ".$plus."";
        $res = mysql_query($sql)or die (mysql_error());
        mysql_close($connection);
        header("Location:./ausDb.php");
        die();
    }

    // gewählter Datensatz -1
    if(!empty($_GET['minus'])){
        $sql = "UPDATE gesammelt SET menge = menge - 1 where id = ".$minus."";
        $res = mysql_query($sql)or die (mysql_error());
        mysql_close($connection);
        header("Location:./ausDb.php");
        die();
    }

Wenn ich komplett aus dem Script aussteige und die cookies lösche, dann wird der Wert einmal richtig erhöht - aber nur einmal, danach habe ich wieder das Problem der Dopplung.
Ich weiß damit leider nichts anzufangen.

Ich hoffe, dass sich jemand von Euch die Mühe macht, das Ganze durchzusehen. Danke
 
Zuletzt bearbeitet:
Habe jetzt den Fehler ein wenig eingegrenzt.

Ich schalte die Weiterleitung aus und lasse ich mir den sql Befehl ausgeben.

Hier passt die Erhöhung des Wertes um 1. Das schreibt er auch so in die DB.

Sobald ich aber wieder auf das aufrufende Script komme (ob mit <a href> oder header ist egal), habe ich bei der nächsten Erhöhung wieder die Dopplung im Wert.

Mit der Session kann das auch nichts zu tun haben, da dieser ein alter Wert ist und mit der DB nichts zu tun hat.

Wenn ich am Code etwas änder, dann wird der Wert um eins erhöht, aber nur einmal.

Offensichtlich läuft das Script zweimal durch. Wie kann so etwas passieren?

Sehe schon bald den Wald vor lauter Bäumen nicht mehr. Bitte um Hilfe
 
Zuletzt bearbeitet:
Zurück