"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

PHP String zu Integer addieren

alexsb 28.04.2002 - 17:32 854 10
Posts

alexsb

hmm
Avatar
Registered: Jun 2001
Location: near Graz
Posts: 1566
Folgendes:

Ich lasse eine schleife Laufen die die varieble $x immer um eins erhöht, bis diese die Größe $y erreicht also:

for ($x = "1"; $x <= $y; $x++)

Jetzt gebe ich das ganze in eine Sql query:

$sql="INSERT INTO table (x) VALUES ($x)";

mysql_query($sql);

ich möchte aber das beim Letzten Durchlauf (in diesem Fall den 17ten) $x nicht 16 ist sonder 16C

Das Frag ich mit if ab, also:

if ($x < $y)
{
blabla
}
else if ($x == $y)
{
$x = $x+"c";
}

Das geht aber nicht!
ich kann zu Integer Variablen keine Strings dazuzählen, wie kann ich das lösen?

bernhard

Little Overclocker
Registered: Feb 2001
Location: NÖ
Posts: 51
> for ($x = "1"; $x <= $y; $x++)

$x muß/sollte hier kein String sein.

>ich möchte aber das beim Letzten Durchlauf [...]

Dieser Spezialfall sollte dann aber nicht innerhalb der Schleife behandelt werden, denn der nachfolgende Test "16c"<=$y ist nicht das, was ich unter sauberem Programmieren verstehe.

Simpler Vorschlag:
Code:
for ($x=1;$x<$y;$x++) {
  do_something($x);
}
$x.="c";
do_something($x);

alexsb

hmm
Avatar
Registered: Jun 2001
Location: near Graz
Posts: 1566
for ($PortNummer = "1"; $PortNummer <= $Anzahl; $PortNummer++)
{
if ($Portnummer < $Anzahl)
{
$sqlinsert2="INSERT INTO t_porthub (rHubNr, PortNummer, rArtHubNr, ZielPort, Länge, Bemerkung, ZielRaum, ZielNV, ZielPanel) VALUES ('$rHubNr','$PortNummer','$arthub','-','-','-','-','-','-')";
}
else if ($PortNummer == $Anzahl)
{
$PortNummer = $PortNummer - "1" + "c";
$sqlinsert2="INSERT INTO t_portpatch (rPatchNr, PortNummer, rArtPatchNr, ZielSteckRaum, ZielPatchRaum, Länge, Dämpfung, Bemerkung, ZielSteckNV, ZielSteckPort, ZielPatchDose, ZielSteckPanel, ZielPatchPanel, ZielPatchNv, ZielPatchPort) VALUES ('$rPatchNr','$PortNummer','$artpatch','-','-','-','-','-','-','-','-','-','-','-','-')";
echo "Hieristsie:".$PortNummer;
$PortNummer = $PortNummer + "1" - "c";
} */
echo $sqlinsert2;
echo "<br>";
echo $PortNummer;
echo "<br>";
echo $sqlinsert2;
mysql_query($sqlinsert2);
}

So hab i mir das gedacht! Also das der Vergleich net hinhaut des war mir klar!
Werds aber mal so probieren

alexsb

hmm
Avatar
Registered: Jun 2001
Location: near Graz
Posts: 1566
ok, die obige war g.f. (GrundFalsch), hier kommt jetzt eine Version bei der ich nicht verstehe warum er nicht ins else if geht?


for ($PortNummer = "1"; $PortNummer <= $Anzahl; $PortNummer++)
{
if ($Portnummer < $Anzahl)
{
$sqlinsert2="INSERT INTO t_porthub (rHubNr, PortNummer, rArtHubNr, ZielPort, Länge, Bemerkung, ZielRaum, ZielNV, ZielPanel) VALUES ('$rHubNr','$PortNummer','$arthub','-','-','-','-','-','-')";
}
else if ($PortNummer == $Anzahl)
{
$PortNummerersatz = $PortNummer;
$PortNummer = $PortNummer - 1;
$PortNummer."c";
$sqlinsert2="INSERT INTO t_portpatch (rPatchNr, PortNummer, rArtPatchNr, ZielSteckRaum, ZielPatchRaum, Länge, Dämpfung, Bemerkung, ZielSteckNV, ZielSteckPort, ZielPatchDose, ZielSteckPanel, ZielPatchPanel, ZielPatchNv, ZielPatchPort) VALUES ('$rPatchNr','$PortNummer','$artpatch','-','-','-','-','-','-','-','-','-','-','-','-')";
echo "Hieristsie:".$PortNummer;
$PortNummer = $PortNummerersatz;
}
echo $sqlinsert2;
echo "<br>";
echo $PortNummer;
echo "<br>";
echo $sqlinsert2;
mysql_query($sqlinsert2);
}

bernhard

Little Overclocker
Registered: Feb 2001
Location: NÖ
Posts: 51
> if ($Portnummer < $Anzahl)

Variablennamen sind in PHP case sensitive!
Ex falso quodlibet.

> $PortNummer."c";

Diese Zeile ist wirkungslos.

> $PortNummerersatz = $PortNummer;

Diese Herumschupferei mit anschaun zu müssen, tut weh. Warum willst Du zwanghaft die Zählvariable verbiegen? Ein $tempNummer=($PortNummer-1)."c"; reicht.

Wie schon zuvor erwähnt, kann das Anwenden von comparison operators auf strings kuriose bis schlimme Folgen haben. _Bitte_ verwende einen numerischen Datentyp.

Code:
<?
  $Anzahl=17;
  for($PortNummer=1;$PortNummer<=$Anzahl;$PortNummer++) {
    if($Portnummer<$Anzahl) {
      $query="INSERT INTO foo (bar) VALUES ($PortNummer);
    } else {
      $tempNummer=($PortNummer-1)."c";
      $query="INSERT INTO foo (bar) VALUES ($tempNummer);
    }
    mysql_query($query);
  }
?>

alexsb

hmm
Avatar
Registered: Jun 2001
Location: near Graz
Posts: 1566
OK!

Danke!

Vir@s

Code Monkey
Registered: Nov 2000
Location: Wien
Posts: 730
Zitat von bernhard
Diese Herumschupferei mit anschaun zu müssen, tut weh. Warum willst Du zwanghaft die Zählvariable verbiegen?
[/code]

Deshalb wird es auch in den meisten OpenSource Programmen so gemacht - und das verändern einer Zählvariable dient dazu um die Schleife dynamisch zu verändern.

Geb dir zwar Recht, dass es hier nicht wirklich nötig ist, allerdings ist der Gedanke selbst nicht so abwegig.

bernhard

Little Overclocker
Registered: Feb 2001
Location: NÖ
Posts: 51
> und das verändern einer Zählvariable dient dazu um die Schleife dynamisch zu verändern.

s/dynamisch zu verändern/schwer debug- und lesbar zu machen/

Ich behaupte kühn, daß man in 99% der Fälle mit den statements continue und break das Auslangen finden kann, obwohl sogar diese bereits Anfänge von Spaghetti code darstellen.

Vir@s

Code Monkey
Registered: Nov 2000
Location: Wien
Posts: 730
Natürlich ist es möglich - und ich verwendete sowieso meistens nur break - allerdings ist es nicht so weit hergeholt, wenn man die Schleife so verändert in dem man die Zählvariable verändert.

Natürlich ist das wieder eine pot. Fehlerquelle.

bernhard

Little Overclocker
Registered: Feb 2001
Location: NÖ
Posts: 51
> allerdings ist es nicht so weit hergeholt, wenn man die Schleife so verändert in dem man die Zählvariable verändert.

Obwohl es - und ich kann das nur nochmals betonen - alles andere als guter Stil ist, ist es nicht abwegig, doch das stand auch nie in Frage.

Im konkreten Fall wird die Zählvariable ja nur temporär verbogen, um nachher wieder durch ein "backup" zurückgesetzt zu werden. _Das_ ist unnötig (außer man will den Variablennamen unbedingt beibehalten).

Vir@s

Code Monkey
Registered: Nov 2000
Location: Wien
Posts: 730
Jep - bestreite ich auch ned - würd es auch nicht so machen :)

Hatte nur den Eindruck du meinst, dass dies ein vollkommender Blödsinn ist.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz