# Wert mittels PHP um 1 erhöhen



## atlantyz (2. Juli 2008)

Hallo Leute,

ich habe heute eine Frage, bei dem viele von euch laut anfangen werden zu lachen. Aber ich komm echt net weiter.

Ich habe in MySql eine Tabelle, die Druckerbestände beinhaltet. Dort gibt es eine ID, als Auto_Increment Wert und eine InventarNr, die automatisch hochgezählt werden soll. Die InventarNr soll bei 30000 beginnen und pro neu angelegten Drucker um 1 erhöht werden.

Nun meine Frage: wie mache ich das? Es fängt schon damit an, dass ich es irgendwie nicht hinbekomme, den letzten eingetragenen Wert zu ermitteln, ihn um 1 zu erhöhen und dann in eine neue Zeile zu schreiben.

Ich habe absolut keinen Plan von SQL und hab auch nur ein "geliehenes Skript", welches ich anpassen wollte. Aber das mit dem Begin ab 30000 klappt bei meinem einfach nicht.

Bitte um Hilfe.


----------



## GoldenEye (2. Juli 2008)

atlantyz hat gesagt.:


> Hallo Leute,
> 
> ich habe heute eine Frage, bei dem viele von euch laut anfangen werden zu lachen. Aber ich komm echt net weiter.
> 
> ...



Du musst erstmal die höchste InventarNr auslesen. Dazu gibt es verschiedene Möglichkeiten. Die Einfachste wäre über MAX(InventarNr). Den Wert speicherst du in einer Variablen z.B. $maxinvent. Jetzt addierst du noch 1 drauf ($aktuellinvent = §maxinvent + 1) und dann kannste den Wert $aktuellinvent entsprechend bei deinem INSERT verwenden.

Es gibt einfachere Wege, indem du z.B. die Abfrage in den Eintrag integrierst, aber das wäre für dich wahrscheinlich zu schwer verständlich.


----------



## atlantyz (2. Juli 2008)

Okay, soweit kapier ich das. Aber wie ordne ich der Variablen nun die SQL-Abfrage zu?
Ich muss doch php erstma mitteilen, dass eine SQL-Abfrage kommt, oder? Und dann?

Ich glaub hier scheitere ich leider am Verständnis von PHP und SQL.

Hier der bisherige Code:


```
$datum=date("Y-m-d");
    $sql="INSERT INTO geraet VALUES ('','$e_hersteller','$e_modell','$e_typ','$e_standort','$e_benutzer','$e_serial','$e_anschluss','$e_ip','$e_printserver','$e_bemerkung','$e_kauf_am','$e_kauf_bei','$e_finanziert','$datum');";
    $res=send_sql ($db,$sql); 
    if (! $res) $fehler++;
    $iid=mysql_insert_id ($lk);

    }
```
Wenn ich das richtige verstehe, ist das mit dem $ die Variable. Und dort gibt es auch eine Variable sql, die dem PHP dann sagt, dass es auf die Datenbank zugreifen kann. Wie bekomm ich die und meine neue Variable aber unter einen Hut?

Etwa so?:

```
$sql=Max(inventarnr)
           $var=Max(inventarnr)
```

Bitte nicht auf ein Tutorial oder so verweisen, die bringen mich im Moment auch nicht weiter, ich hab schon ein Gutes gefunden, aber wie gesagt, es hapert ein bisschen am Verständnis (deswegen die geliehene Druckerabfrage zum üben)


----------



## shutdown (2. Juli 2008)

Definiere deine Spalte doch einfach als Autowert.
Du kannst angeben bei welcher Zahl er anfangen soll und welche Schritte gemacht werden sollen. Dann brauchst du dich um das erhöhen nicht selber kümmern.
phpMyAdmin sollte da weiterhelfen, falls du in dem Bereich noch keine Kenntnisse haben solltest.


----------



## atlantyz (2. Juli 2008)

Wenn ich ja in PHPmyadmin den Eintrag dafür gefunden hätte, wäre das alles kein Problem... aber ich finde einfach nicht, wo man das einstellen kann


----------



## GoldenEye (2. Juli 2008)

das ist totaler Unsinn.
MAX(InventNr) kannst du nur in einer Abfrage verwenden.


```
$sql = "SELECT MAX(InventNr) AS InventNr FROM xy";
$result = mysql_query($sql) OR die(mysql_error());
while($row = mysql_fetch_assoc($result)) {
$aktuellinvent = ".$row['InventNr']." + 1
}
```

Du kannst die query auch auf eine Zeile kürzen, aber so sind die Schritte verständlicher.
Kann sein, dass ich irgendwie "" vergessen hab oder so. Musste mal ausprobieren.


----------



## GoldenEye (2. Juli 2008)

shutdown hat gesagt.:


> Definiere deine Spalte doch einfach als Autowert.
> Du kannst angeben bei welcher Zahl er anfangen soll und welche Schritte gemacht werden sollen. Dann brauchst du dich um das erhöhen nicht selber kümmern.
> phpMyAdmin sollte da weiterhelfen, falls du in dem Bereich noch keine Kenntnisse haben solltest.



Stimmt. Nicht dran gedacht.
Ich würds aber trotzdem mit nem Script machen, da es dann keine Problem beim löschen / editieren gibt.


----------



## Loomis (2. Juli 2008)

> Hinweis: Es kann nur eine AUTO_INCREMENT-Spalte pro Tabelle geben. Diese muss indiziert sein und darf keinen Standardwert haben.


http://dev.mysql.com/doc/refman/5.1/de/create-table.html


----------



## shutdown (2. Juli 2008)

> Ich würds aber trotzdem mit nem Script machen, da es dann keine Problem beim löschen / editieren gibt.



Welche Probleme sollte es denn da geben?

Zum Einwand von Loomes:


> Dort gibt es eine ID, als Auto_Increment Wert und eine InventarNr,



Da hat er ganz recht, zweimal Auto_increment geht nicht. Aber du solltest dir vielleicht dein Tabellendesign nochmal anschauen. Was ist denn schon eindeutiger als eine InventarNr? Damit ist die ein super PrimaryKey und du kannst deine alte id wegwerfen und den Auto_Increment für deine Inventarnummer verwenden.


----------



## GoldenEye (2. Juli 2008)

shutdown hat gesagt.:


> Welche Probleme sollte es denn da geben?



Die Frage ist wofür es genutzt wird. Zur Identifikation ist es perfekt (is ja standart ID auf Autoincrement zu setzten)
Für alles weitere nicht, da das auto_increment nicht berücksichtigt, ob z.B. der letzte Drucker wieder gelöscht wurde.

Es ist schwer eine richtige Lösung zu nennen, wenn man nicht weiß für was es gut sein soll.


----------



## shutdown (2. Juli 2008)

Eine Inventarnummer sollte eigentlich immer eindeutig sein. Auch in die Vergangenheit.
Das heißt, dass gelöschte Einträge und damit freigewordene Inventarnummern gar nicht mehr verwendet werden dürften, was dem auto_increment entspricht, der einfach weiterzählt. Mit Max() kannst du im Übrigen auch nur anschließen, Lücken, die durch Löschen entstanden sind, musst du durch ein ein klein wenig aufwendigeres Skript suchen (nicht viel aufwendiger, aber ein bisschen).


----------



## Loomis (2. Juli 2008)

Wenn du das unbedingt so machen willst, wie du vorhast (ich finde ja eine Id reicht aus), könntest du folgendes versuchen (ungetestet):

```
$sql = 'INSERT INTO `tabelle` (`id`) VALUES(NULL)';
mysql_query( $sql );

$id = mysql_insert_id();
$invId = ( 30000 + $id );

$sql2 = 'UPDATE `tabelle` SET `inventarId` = ' .$invId. ' WHERE `id` = ' .$id;
mysql_query( $sql2 );
```


----------



## atlantyz (3. Juli 2008)

Also, ich wollte ja auch einfach, dass er Auto_increment bei der Inventarnr macht und halt einfach bei 30000 anfängt damit. Wir haben eine PC Inventur, bei der genau das passiert (die fängt bei 1000 an). 

Aber: mein Kollege hat gemeint, es wäre "unsauber" nur eine Nummer zu nehmen. Nach langem hin und her hat er halt gesagt, ich soll die ID hochzählen lassen und die Inventarnr selbst hochzählen, FALLS wir die Inventarnr. mal wieder vergeben sollten, wenn ein Drucker weg ist.

Ich persönlich finde den Aufwand eine Tabelle mit Lücken zu pflegen aber umständlicher. Dann muss sich ja ständig einer hinsetzen, gucken welche Zahlen frei sind und dafür neue Etiketten ausdrucken usw.

Deswegen würde ich gern die ID als Inventarnr nehmen und die bei 30000 beginnen lassen und dann Auto_increment machen.


----------



## shutdown (3. Juli 2008)

```
select t1.id +1
from tabelle t1, outer(tabelle t2)
where t1.id +1 = t2.id
AND t2.id is null
```

Ist jetzt Informix-Syntax, vielleicht erbarmt sich jemand und schreibt den Join für Informix.
Dieses Skript (ungetestet) sollte dir Lücken in deinen Werten automatisch liefern (wenn du die Lücken dann verwendest, ändert sich auch die Ausgabe des Skriptes).

Wie gesagt, eine Inventarnummer sollte eigentlich immer eindeutig sein. Darum enthält sie meistens auch Angaben zu Jahr und Monat der Anschaffung. Ich würde von einer Wiederverwendung daher abraten.


----------



## atlantyz (3. Juli 2008)

Ich hab mich jetzt entschieden, nur eine Nummer zu nehmen. Leider funktioniert das Hinzufügen von Druckern noch nicht so wriklich. Also hab ich einfach so mal einen Drucker direkt über phpMyadmin in die Tabelle eingefügt und mit ihm rumexperimentiert. An einer Stelle bekomme ich die Fehermeldung:

Unknown column 'id' in 'field list'

Mir ist klar, dass das bedeutet, dass er das Feld id nicht kennt. Also hab ich nochmals in meine Tabelle nachgeschaut. Dort ist alles okay.


```
Feld  	Typ   	Null  	Standard   	Kommentare
id 	int(10) 	Nein  	  	 
hersteller 	varchar(15) 	Nein  	  	 
modell 	text 	Nein  	  	 
typ 	text 	Nein  	  	 
standort 	varchar(30) 	Ja  	NULL  	 
benutzer 	varchar(30) 	Ja  	NULL  	 
serial 	varchar(20) 	Ja  	NULL  	 
anschluss 	varchar(10) 	Nein  	  	 
ip 	varchar(15) 	Ja  	NULL  	 
printserver 	varchar(1) 	Nein  	N  	 
bemerkung 	text 	Ja  	NULL  	 
kauf_am 	date 	Ja  	NULL  	 
kauf_bei 	varchar(25) 	Ja  	NULL  	 
finanziert 	varchar(25) 	Ja  	NULL  	 
stand 	date 	Nein
```

Man kann das jetzt nicht so gut erkennen, aber den Eintrag id gibt es definitiv (auch kleingeschrieben). Hier nochmal mein Code dazu:


```
<html>
<head>
  <title>Auflistung der Drucker</title>
  <LINK href="global/css/inc.layout.css" rel="stylesheet" type="text/css">
</head>
<body>
  <h1>Liste der Drucker</h1>
  <?
    require ("db_tools.php");

    function head_out() {
      echo "<table border=0 cellpadding=2 cellspacing=2>\n";
      echo "<tr bgcolor=#F0D8D0>\n";
      echo "  <th>Inventar-Nr.</th>\n  <th>Standort</th>\n  <th>Name</th>\n  <th>Benutzer</th>\n  <th>Printserver</th>\n  <th>Details</th>\n  <th>Löschen</th>\n  <th>Ändern</th>\n";
      echo "</tr>\n";
    }

    function row_out($obj) {
      echo "<tr bgcolor=#E8E8E8>\n";
      echo "  <td>$obj[id]</td>\n";
      echo "  <td>$obj[standort]</td>\n";
      echo "  <td>$obj[modell]</td>\n";
      echo "  <td>$obj[benutzer]</td>\n";
      echo "  <td>$obj[printserver]</td>\n";
      echo "  <td valign=middle><nobr><form action=\"details.php\" method=\"POST\"><input type=hidden name=\"id\" value=\"$obj[id]\"><input type=submit value=\"Details\"></form></td>\n";
      echo "  <td valign=middle><nobr><form action=\"delete_request.php\" method=\"POST\"><input type=hidden name=\"druckernr\" value=\"$obj[id]\"><input type=submit value=\"Löschen\"></form></td>\n";
      echo "  <td valign=middle><nobr><form action=\"update_drucker.php\" method=\"POST\"><input type=hidden name=\"druckernr\" value=\"$obj[id]\"><input type=submit value=\"Ändern\"></form></td>\n";
      echo "</tr>\n";
    }

    function end_out() {
      echo "</table>\n<br>\n";
    } 

    $lk=xconnect();
    $db="inventur-drucker";
    $sql="SELECT id, standort, modell, benutzer, printserver geraet ORDER BY id";
    echo "<table>\n<tr>\n<td>\n";
    echo "<form action=\"new_drucker.php\" method=\"POST\"><input type=submit value=\"Neuen Drucker erfassen\"></form>\n";
    echo "</td>\n<td>\n";
    echo "<form action=\"index.php\" method=\"POST\"><input type=submit value=\"Neue Suche\"></form>\n";
    echo "</td>\n</tr>\n</table>\n";
    head_out();
    $res=send_sql ($db,$sql);
    while ($arr=mysql_fetch_array($res,MYSQL_ASSOC)) {
      row_out($arr);
    }
    end_out();
    echo "<table>\n<tr>\n  <td>\n";
    echo "  <form action=\"new_drucker.php\" method=\"POST\"><input type=submit value=\"Neuen Drucker erfassen\"></form>\n";
    echo "  </td>\n  <td>\n";
    echo "  <form action=\"index.php\" method=\"POST\"><input type=submit value=\"Neue Suche\"></form>\n";
    echo "  </td>\n</tr>\n</table>\n";
  ?>
</body>
</html>
```


----------

