cutenigi: Speichern funktioniert nicht

Hallo miteinander

mssql2000 und php4.

Habe folgenden Code:

function getsaveres($sn,$zahl) {
    if($this->write) {
           $qsn= $sn+$zahl;
      for($i=$sn+1;$i<$qsn+1;$i++) {
   echo $i;
   $query .= "INSERT INTO tblhistorie (Serienummer, Spezielles) VALUES ($i, 9)";
   }
      $this->errMsg = odbc_errormsg($this->db);
      if($result) return true;
      else return false;
    }
    $this->errMsg = "keine schreibe rechte";
    return false;
  }

In die Fore Schleife geht er, aber leider funkt die Speicherung nicht!

Wenn ich die Insertanweisung im SQL selber versuche, dann geht sie!

Kann mir jemand sagen warum es nicht geht??

Gruss

Martin

  1. Du hast zwei Probleme:

    1.) hängst du falsch zusammen
          bei dir sieht query ungefähr so aus
             INSERT INTO tb (s1, s2) VALUES (1,2)INSERT INTO ...

    2.) führst du die query nicht aus

    kleines beispiel

    $server = "localhost";
    $login = "Jeder";
    $pass = "auch";

    $verbindung = mysql_connect($server,$login,$pass);
    $abfrage = "select * from tabelle";
    $erg = mysql_db_query($dbname,$abfrage,$verbindung);

    usw.

    1. Die verbindung zur Db stelle ich hier her:

      function SQL($userid,$user_module,$dsn,$user,$pass) {
          $this->db = odbc_connect($dsn,$user,$pass);
          $this->rights = $user_module['name'];
          $this->read = $user_module['read']==1?true:false;
          $this->write = $user_module['write']==1?true:false;
          $this->change = $user_module['change']==1?true:false;
          $this->user = $userid;
        }

      zum speichern führe ich normalerweise solch ähnlichen Code aus:
          if($sql->setNewUnbefuellt($Trode)) {
            $errorMsg = "<DIV class='ok'>{$_LANG['formular wurde gespeichert']}</DIV>";
            unset($Trode);unset ($el_t); unset ($el_m);unset ($el_j);
            $error = false;
          }
          else {
            $Trode['Serienummer'] = $actdat['id'];
            $errorMsg = "<DIV class='error'>{$_LANG['fehler']}: " . $_LANG[$sql->errMsg] . "</DIV>";
           }

      mit diesem Code gehe ich dann zur Funktion, die so ist:
        function setNewUnbefuellt($Trode) {
          if($this->write==true) {
            $query = "INSERT INTO tblhistorie (";
            $keys = array_keys($Trode);
            for($i=0;$i<count($keys);$i++) {
              $query .= "[" . $keys[$i] . "], ";
            }
            $query .= "Ausgangsuser, Ausgangsdatum) VALUES (";
            for($i=0;$i<count($keys);$i++) {
              if($keys[$i]=='Bemerkungen' || $keys[$i]=='Ellipsoid1' || $keys[$i]=='Artikelnummer' || $keys[$i]=='Spezielles' )
                $query .= "'" . $Trode[$keys[$i]] . "', ";
              else
                $query .= $Trode[$keys[$i]] . ", ";
            }
      //      $query .= $this->user . ", '" . date("Y-d-m",time()) . "')"; //ISO
            $query .= $this->user . ", '" . date("Y-m-d",time()) . "')"; //USA
            $result = odbc_exec($this->db, $query) or die("Query failed");
            return true;
          }
          else {
            $this->errMsg = "keine schreib rechte für diesen user";
            return false;
          }
        }

      Aber alles was ich jetz in diese Hinsicht mache, funkt nicht!

      gruss

      Martin

  2. Servus,

    Ergänzend zu Armins Posting:
    Du kannst nicht mehrere Statements in einer Query (also *_query('INSERT ...; INSERT ...; [etc.]')) absetzen. (Das "geht" zwar in den meisten Datenbank-Frontends, aber nur, weil dort die Query intern zerpflueckt und die Statements einzeln abgesetzt werden.)

    Abgesehen davon ist es eh hochgradig unperformant, Daten der selben Struktur einzeln einzufügen. Besser so:
    INSERT INTO tblhistorie
      (Serienummer, Spezielles)
    VALUES (
      (1, 9),
      (2, 9)
      [,etc]
    );

    Gruss
    Patrick

    --
    sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
    1. Servus,

      da ist ein Klammern-Pärchen zu viel reingerutscht ;) So sollte es lauten:

      VALUES
        (1, 9),
        (2, 9)
        [,etc]
      ;

      Gruss
      Patrick

      --
      sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
      1. Geht das auch, wenn ich mit jeder einzelnen Query eine Zeile füllen muss?

        gruss Martin

        1. Servus,

          (1, 9),
            (2, 9)
            [,etc]
          Geht das auch, wenn ich mit jeder einzelnen Query eine Zeile füllen muss?

          Jede Zeile im obigen Auszug des Statements entspricht einem Datensatz (also einer "Zeile" in der Datenbank).

          Gruss
          Patrick

          --
          sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
          1. also müsste ich für jede Zeile, eine (1,9) etc setzen.

            Da aber über Zahl definiert wird, wieviel dass es sind, kann ich ja nicht einfach, bis 10 machen, es könnten ja auch 20 oder nur 5 sein!

            und schau mal meine bisherige Vorgehensweise an, vielleicht, finden wir ja auch da eine Lösung!

            gruss Martin

            1. Servus,

              was hindert dich daran, nur diesen Teil des Statements mit einer Schleife zu erzeugen?

              Gruss
              Patrick

              --
              sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|