Vera: dynamische Umwandlung string Zahl -> integer Zahl

Hallöchen,

ich habe ein Problem das für Euch sicher trivial erscheint, mir aber Kopfzerbrechen bereitet.

Mit einem INPUT (text) Element möchte ich einer Datei über die PHP Funktion chmod() neue Rechte- Attribute zuweisen. Das Problem hierbei ist das chmod() einen Integer Wert erwartet (z.B. 0777). Das INPUT Element liefert mir jedoch einen String Wert.

chmod("dateiname",$_POST[uebergabewert]);
funktioniert genausowenig wie
chmod("dateiname",(int)$_POST[uebergabewert]);

auch das funktioniert überhaupt nicht :-(
$strZahl = $_POST[uebergabewert];
chmod("dateiname",chr($strZahl[0]).chr($strZahl[1]).chr($strZahl[2]).chr($strZahl[3]));

Irgendwie schaffe ich das nicht, habe wohl den Kopf zu voll mit unerledigten Sachen. Nun die Frage an Euch, wie kann man dieses Rätsel lösen?

danke vielmals für jeden Lösungsvorschlag
Vera

  1. Hi there,

    Mit einem INPUT (text) Element möchte ich einer Datei über die PHP Funktion chmod() neue Rechte- Attribute zuweisen. Das Problem hierbei ist das chmod() einen Integer Wert erwartet (z.B. 0777).

    Eigentlich erwartet chmod eine Oktalzahl, wie auch an der Schreibweise erkennbar.

    Prinzipiell kann man (im Dezimalsystem) umwandeln, indem man einen String mit 1 multipliziert oder eine Zahl mit .'' concateniert.
    Dein chmod müsste mit '0777' aber in jedem Fall funktionieren, ich denke eher, Du hast nihct die Rechte, um das zu tun, oder bekommst Du eine Fehlermeldung?

    1. Danke für den Tip mit dem Multiplizieren mit 1, das merke ich mir für das nächste Mal. Natürlich habt Ihr Recht das eine Oktalzahl erwartet wird. Hatte ich bei dem Stress überlesen. Diese muss ich nun aus dem eingegebenen String errechnen. Das dürfte nun nicht mehr das Problem darstellen.

      ich bedanke mich nochmal
      immer eine passende Lösung wünsche ich
      Vera

      1. Hello,

        Danke für den Tip mit dem Multiplizieren mit 1, das merke ich mir für das nächste Mal. Natürlich habt Ihr Recht das eine Oktalzahl erwartet wird. Hatte ich bei dem Stress überlesen. Diese muss ich nun aus dem eingegebenen String errechnen. Das dürfte nun nicht mehr das Problem darstellen.

        Nein, das ist für PHP kein Problem, da es eine fertige Funktion dafür gibt:
        http://uk3.php.net/manual/de/function.decoct.php

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  2. Hallo,

    Das 0777 ist eine Oktalzahl, zu erkennen an der führenden 0

    Du musst also einen Integer wert basteln, der dieser Zahl entspricht:
    Hast du den String 0abc, so musst du folgende zahl bilden:
    a * 64 + b * 8 + c * 1, bei 0777(8) wäre das 511(10)

    mfg, Flo

    --
    sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:| c
    1. Auch Dir vielen Dank für die verständliche Erklärung. Manchmal ist der Wald vor lauter Bäumen nicht sichtbar... . Bei einer Eingabe von 0511 werden die Rechte erwartungsgemäss richtig gesetzt. Naja nun muss ich nur noch den String auseinander nehmen und nach Deiner Formel berechnen.

      danke vielmals für die schnelle Hilfe
      Vera

      1. Hi Vera,

        Naja nun muss ich nur noch den String auseinander nehmen und nach Deiner Formel berechnen.

        Oder berechnen lassen.

        viele Grüße
        der Bademeister

        1. Hello,

          Naja nun muss ich nur noch den String auseinander nehmen und nach Deiner Formel berechnen.

          Oder berechnen lassen.

          Nur, dass hier eher die umgekehrte Funktion benötigt wird.
          Durch die automatische Typumwandlung kann man aus dem String automatisch einen Integer machen. Die Darstellung als String entspricht für PHP aber standardmäßig einer Dezimalzahl. Diese muss dann noch in eine Oktalzahl gewandelt werden.

          http://uk3.php.net/manual/de/function.decoct.php

          Liebe Grüße aus Syburg bei Dortmund

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hi Tom,

            Nur, dass hier eher die umgekehrte Funktion benötigt wird. [...] Die Darstellung als String entspricht für PHP aber standardmäßig einer Dezimalzahl. Diese muss dann noch in eine Oktalzahl gewandelt werden.

            Nein. Ein String ist ein String und "entspricht" erstmal ueberhaupt keiner Zahl. Wie er ggf. als Zahl interpretiert wird, haengt vom Kontext ab.

            Durch die automatische Typumwandlung kann man aus dem String automatisch einen Integer machen.

            Die automtische Typumwandlung von String nach Integer wuerde einen String als Dezimalzahl interpretieren, aber sie kommt hier nirgendwo zum Einsatz.
            Die angegebenen Funktionen verlangen Strings als Parameter und interpretieren diese selbst. Die Funktion octdec() interpretiert den uebergebenen String als Oktalzahl, bei base_convert()  darf man selber eine Basis angeben.

            viele Gruesse,
            der Bademeister

            1. Hello,

              Nein. Ein String ist ein String und "entspricht" erstmal ueberhaupt keiner Zahl. Wie er ggf. als Zahl interpretiert wird, haengt vom Kontext ab.

              Und was Du bist, behalte ich für mich :-)

              siehe: http://www.php.net/manual/de/function.umask.php und lese auch die UCNs, dann sollte es klar werden, dass octdec() falsch ist und decoct() benötigt wird, um umask() oder mkdir() usw. zu benutzen.

              http://www.php.net/manual/de/function.decoct.php

              Liebe Grüße aus Syburg bei Dortmund

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Hi Tom

                Und was Du bist, behalte ich für mich :-)

                Ja, sei mal lieber vorsichtig, ich weiss ja dank Deiner Signatur, wo Du wohnst ;-)

                [...] dann sollte es klar werden, dass octdec() falsch ist und decoct() benötigt wird, um umask() oder mkdir() usw. zu benutzen.

                Also ich weiss immer noch nicht, was Du da mit decoct() anstellen willst. Ich wuerde es so sehen:

                Wir haben:
                einen String, dessen Inhalt ein oktales Integer-Literal ist

                Wir brauchen:
                Die Zahl, die von diesem Literal repraesentiert wird, als Integer (denn die Funktionen chmod() und auch umask() brauchen den mode jeweils als Integer). Die Funktion, die uns diese Zahl liefert, ist octdec().

                decoct() braucht ein Integer als Parameter und gibt Dir einen String zurueck. Mit ist weder klar, welche Zahl Du da uebergeben willst, noch, was Du mit dem Rueckgabewert anstellen moechtest. Die oktale Darstellung der Zahl haben wir doch von Anfang an, die muessen wir nicht mehr rausfinden.

                Viele Gruesse,
                der Bademeister

                1. Hello Bademeister,

                  Ja, sei mal lieber vorsichtig, ich weiss ja dank Deiner Signatur, wo Du wohnst ;-)

                  Dann komm doch mal vorbei :-)

                  ok, ok. Ich gebs zu. Das war mein Denkknoten...

                  Der Wert kommt ja schon als String an, und muss nun zum Integer gewandelt werden, aber eben _nicht_ automatisch, denn dann würde er als Dezimalstring nach Integer gewandelt werden.
                  Er soll aber als Oktalstring nach Integer gewandelt werden, also octdec().

                  Du hast also Recht!

                  Liebe Grüße aus Syburg bei Dortmund

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                  1. Hi Tom,

                    ich denk jetzt nochmal gerade laut:

                    Mir ist nämlich durch das Gespräch hier erstmals aufgefallen, wie denkbar blödsinnig die Namen der Funktionen octdec(), decoct() u.s.w. sind. Sie suggerieren, dass ein Integer in PHP irgendetwas mit der Dezimaldarstellung der Zahl zu tun hat, im Gegensatz zu anderen Darstellungen. Sie müssten octint(), intoct() u.s.w. heißen.

                    In Anwendungsfällen wie

                      
                    echo "Ich habe Schuhgröße " . octdec("53");  
                    
                    

                    geschieht natürlich letztlich schon eine Umwandlung von einer Oktal- in eine Dezimaldarstellung - aber eben nicht von octdec(), sondern von dem Produkt aus octdec() und der automatischen Typumwandlung.

                    Der Anwendugsfall dieses Threads ist eins von vielen Beispielen, in denen die Dezimaldarstellung einer Zahl von Anfang bis Ende komplett uninteressant ist. Wieso also der Name octdec()?

                    Aber was beklage ich mich, die Herren PHP-Entwickler werden es wohl nicht mehr umbenennen ;-)

                    viele Grüße,
                    der Bademeister

                    1. Hello,

                      Mir ist nämlich durch das Gespräch hier erstmals aufgefallen, wie denkbar blödsinnig die Namen der Funktionen octdec(), decoct() u.s.w. sind. Sie suggerieren, dass ein Integer in PHP irgendetwas mit der Dezimaldarstellung der Zahl zu tun hat, im Gegensatz zu anderen Darstellungen. Sie müssten octint(), intoct() u.s.w. heißen.

                      Genaugenommen wandelt octdec() eine als Oktalstring[1] vorliegende Zahl in eine binäre Größe, mit der der Prozessor umgehen/rechnen kann. Wenn die dann wieder für Menschen lesbar dargetellt wird, verwendet PHP automatisch die Wandlung von binär nach dezimal :-))

                      Das ist aber wohl bei allen Programmiersprachen außer Assembler so, dass Zahlen von den Ausgabefunktionen eben automatisch darstellbar gemacht werden.

                      [1] als Abkürzung für "Zahlendarstellung einer Oktalzahl"
                      (oder wie müsste man das sonst genau bezeichnen?)

                      Liebe Grüße aus Syburg bei Dortmund

                      Tom vom Berg

                      --
                      Nur selber lernen macht schlau
                      http://bergpost.annerschbarrich.de