hawaii: PDO / MSSQL / Stored Procedure

Hallo an alle,

ich versuche aus PHP eine Stored Procedure auf einem Mssql 2008 Server anzusteuern (IIS 5.1). Leider führt das Ganze zu keinem Erfolg, wobei ich schon sämtliche Tutorials die es so gibt durchhab. Prepared Statements an sich funktionieren, so dass ich langsam echt am verzweifeln bin.

Steuer ich die Stored Procedure aus dem Management Studio des Mssql an, so funktioniert die Procedure auch problemlos.

Ich poste hier mal meinen PHP Code vll bin ich ja auch wirklich einfach zu blöd ;)

Ausserdem erhalte ich folgende Fehlermeldung:

Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY000]: General error: 10007 Falsche Syntax in der Nähe von 'blabla'. [10007] (severity 5) [(null)] in create_bu_tables.php on line 20

Wenn ich mir die jeweilige Variable zum binden ausgeben lass, dann sieht das für mich alles ok aus.

  
$stmt = $db->prepare('CALL butablecheck (?)');  
$stmt->bindParam(1, $bu_name);  
for($j=0;$j<=$groesse_arr-1;$j++) {  
    $bu_name = $result[$j][0];  
    echo $bu_name.'</br>';  
    $stmt->execute();  

Die Stored Procedure sieht folgendermaßen aus:

  
DROP PROCEDURE butablecheck;  
  
CREATE PROCEDURE butablecheck @tablename Varchar(255)  
  
AS  
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tablename)  
BEGIN  
Declare @SQLStatement nvarchar(4000)  
SET @SQLStatement = 'create table ' + @tablename + '(timestamp DATETIME DEFAULT GETDATE() NOT NULL,  
        month INT NOT NULL,year INT NOT NULL  
        ,"1" VARCHAR(255),"2" VARCHAR(255))'  
  
Exec (@SQLStatement)  
END  

Bin auf jeden Fall für jeden Tipp dankbar!

Grüße,
hawaii

  1. Hallo,

    Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY000]: General error: 10007 Falsche Syntax in der Nähe von 'blabla'. [10007] (severity 5) [(null)] in create_bu_tables.php on line 20

    Naja, ist ja offensichtlich, dein SQL ist syntaktisch fehlerhaft. (Punkt).

    • dein hier geposteter Code enthält kein 'blabla'
    • CALL ist soweit mir bekannt kein gültiger Befehl unter MS SQL, wenn du eine Stored Procedure ausführen willst, dann heisst das EXEC

    Wenn ich mir die jeweilige Variable zum binden ausgeben lass, dann sieht das für mich alles ok aus.

    • schön, dass es für dich okay aussieht, dann ist ja alles in Butter
    • schade, dass es doch nicht funzt und du "uns" den Variablen-Dump vorenthältst, so können "wir" natürlich äussert gezielt helfen

    DROP PROCEDURE butablecheck;

    Einfach so DROP PROC aufrufen

    • gehört nicht zur Prozedur
    • geht schief wenn es noch keine Prozedur gibt, du solltest das also ähnlich elegant lösen wie mit der Tabelle

    SET @SQLStatement = 'create table ' + @tablename + '(timestamp DATETIME DEFAULT GETDATE() NOT NULL,
            month INT NOT NULL,year INT NOT NULL

    soweit so gut ...

    • year und month sind reservierte Worte, du solltest sie in [] packen

    ,"1" VARCHAR(255),"2" VARCHAR(255))'

    und was soll das sein?

    • " ist keine Begrenzung für Zeichenketten, dafür gibt es '
    • " ist keine Begrenzung für Objektnamen, dafür gibt es []

    Ciao, Frank

    1. Hallo,

      Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY000]: General error: 10007 Falsche Syntax in der Nähe von 'blabla'. [10007] (severity 5) [(null)] in create_bu_tables.php on line 20

      Naja, ist ja offensichtlich, dein SQL ist syntaktisch fehlerhaft. (Punkt).

      Danke für den Hinweis, ja kämpfe gerade noch etwas :)

      • dein hier geposteter Code enthält kein 'blabla'
      • CALL ist soweit mir bekannt kein gültiger Befehl unter MS SQL, wenn du eine Stored Procedure ausführen willst, dann heisst das EXEC

      Das blabla hab ich nur hineingeschrieben, in Wirklichkeit steht da der Wert der Variablen $bu_name.

      Wenn ich mir die jeweilige Variable zum binden ausgeben lass, dann sieht das für mich alles ok aus.

      • schön, dass es für dich okay aussieht, dann ist ja alles in Butter
      • schade, dass es doch nicht funzt und du "uns" den Variablen-Dump vorenthältst, so können "wir" natürlich äussert gezielt helfen

      Werde den Dump morgen nachreichen. Mit in Ordnung meinte ich, dass die Ausgabe auch dem entspricht was hinter der Variablen $bu_name steckt.

      DROP PROCEDURE butablecheck;

      Einfach so DROP PROC aufrufen

      • gehört nicht zur Prozedur
      • geht schief wenn es noch keine Prozedur gibt, du solltest das also ähnlich elegant lösen wie mit der Tabelle

      SET @SQLStatement = 'create table ' + @tablename + '(timestamp DATETIME DEFAULT GETDATE() NOT NULL,
              month INT NOT NULL,year INT NOT NULL

      soweit so gut ...

      Danke schau ich mir an und überleg mir was.

      • year und month sind reservierte Worte, du solltest sie in [] packen

      ,"1" VARCHAR(255),"2" VARCHAR(255))'

      und was soll das sein?

      • " ist keine Begrenzung für Zeichenketten, dafür gibt es '
      • " ist keine Begrenzung für Objektnamen, dafür gibt es []

      Da is mir wohl ein Fehler unterlaufen, das war keine Absicht. Wahrscheinlich einer meiner verzweifelten Hilfsversuche ;)

      Danke für deine bisherigen Anregungen, werde morgen mal die Fehler beheben, welche du mir aufgezeigt hast.

      Grüßle,
      hawaii

      1. Absichtliche Fehler = Sabotage ;-)

        Das mit dem EXEC statt CALL hast du aber nicht überlesen?

        Cheers, Frank

        1. Absichtliche Fehler = Sabotage ;-)

          Das mit dem EXEC statt CALL hast du aber nicht überlesen?

          Cheers, Frank

          Hehe, nein das mit dem EXEC war mir einfach so nicht bewusst ;) Aber schon wieder was dazu gelernt. Leider hat das wie du vielleicht in den anderen Antworten sehen kannst nicht den gewünschten Erfolg gebracht....

          Trotzdem danke!

          Grüßle

  2. Hi!

    ich versuche aus PHP eine Stored Procedure auf einem Mssql 2008 Server anzusteuern (IIS 5.1).

    Den Handbuchhinweis zum MSSQL-Treiber von PDO kennst du? Hast du auch den ODBC-Treiber versucht? Oder mit welchem arbeitest du eigentlich?

    Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY000]: General error: 10007 Falsche Syntax in der Nähe von 'blabla'. [10007] (severity 5) [(null)] in create_bu_tables.php on line 20

    'blabla' kommt in deiner folgenden Beschreibung gar nicht vor. Bitte überprüfe, ob du nicht in Wirklichkeit was anderes ausführst als du denkst oder gibt hier keine falschen Informationen.

    Üblicherweise beklagen sich die Datenbankfunktionen bei einem im DBMS aufgetretenen Fehler nicht mit einer PHP-Meldung. DBMS-Fehler muss man gesondert abfragen. Dass du eine PHP-Meldung bekommst, deutet für mich darauf hin, dass PDO sich über einen Fehler beklagt und noch gar nicht dazu kam, das DBMS anzusprechen.

    Lo!

    1. Hi!

      ich versuche aus PHP eine Stored Procedure auf einem Mssql 2008 Server anzusteuern (IIS 5.1).

      Den Handbuchhinweis zum MSSQL-Treiber von PDO kennst du? Hast du auch den ODBC-Treiber versucht? Oder mit welchem arbeitest du eigentlich?

      Ich verwende momentan den mssql Treiber welcher bei PDO dabei ist, installiert ist die PHP Version 5.2.11. Danke für den Hinweis, geht es dabei um den PHP Treiber, welchen MS herausgibt?

      Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY000]: General error: 10007 Falsche Syntax in der Nähe von 'blabla'. [10007] (severity 5) [(null)] in create_bu_tables.php on line 20

      'blabla' kommt in deiner folgenden Beschreibung gar nicht vor. Bitte überprüfe, ob du nicht in Wirklichkeit was anderes ausführst als du denkst oder gibt hier keine falschen Informationen.

      Das blabla hab ich nur hineingeschrieben, in Wirklichkeit steht da der Wert der Variablen $bu_name.

      Üblicherweise beklagen sich die Datenbankfunktionen bei einem im DBMS aufgetretenen Fehler nicht mit einer PHP-Meldung. DBMS-Fehler muss man gesondert abfragen. Dass du eine PHP-Meldung bekommst, deutet für mich darauf hin, dass PDO sich über einen Fehler beklagt und noch gar nicht dazu kam, das DBMS anzusprechen.

      Lo!

      Danke für deine Hinweise, werde das morgen noch mal alles überprüfen.

      Grüßle,
      hawaii

      1. Hi!

        Den Handbuchhinweis zum MSSQL-Treiber von PDO kennst du? Hast du auch den ODBC-Treiber versucht? Oder mit welchem arbeitest du eigentlich?
        Ich verwende momentan den mssql Treiber welcher bei PDO dabei ist, installiert ist die PHP Version 5.2.11. Danke für den Hinweis, geht es dabei um den PHP Treiber, welchen MS herausgibt?

        PDO hat zwei Treiber, über die man mit dem MSSQL-Server reden kann. Ich entnehme deiner Aussage nun, dass du den PDO_DBLIB mit dem DSN-Prefix "mssql:" verwendest. Der ist laut Handbuch im Status "experimentell". Versuch doch mal den PDO_ODBC mit dem DSN-Prefix "odbc:" zu verwenden. Aber mach das erst als zweiten Versuch, probier vorher das Folgende:

        Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY000]: General error: 10007 Falsche Syntax in der Nähe von 'blabla'. [10007] (severity 5) [(null)] in create_bu_tables.php on line 20
        'blabla' kommt in deiner folgenden Beschreibung gar nicht vor. Bitte überprüfe, ob du nicht in Wirklichkeit was anderes ausführst als du denkst oder gibt hier keine falschen Informationen.
        Das blabla hab ich nur hineingeschrieben, in Wirklichkeit steht da der Wert der Variablen $bu_name.

        Es wäre jetzt wichtig, genau auf die Anführungszeichen zu achten. Denn ...

        Üblicherweise beklagen sich die Datenbankfunktionen bei einem im DBMS aufgetretenen Fehler nicht mit einer PHP-Meldung. DBMS-Fehler muss man gesondert abfragen. Dass du eine PHP-Meldung bekommst, deutet für mich darauf hin, dass PDO sich über einen Fehler beklagt und noch gar nicht dazu kam, das DBMS anzusprechen.

        ... ich vermute, dass der PDO-Treiber die Prepared Statements nur simuliert und das SQL-Statement in Wirklichkeit beim Execute selbst zusammenbaut und dann komplett absendet. Dazu muss er für das Quotieren und Maskieren selbst sorgen. Es könnte nun aufgrund des Experimentell-Status sein, dass da was fehlerhaft arbeitet.

        Oder aber es liegt an Franks Vermutung, dass CALL kein gültiger Aufruf ist, stattdessen EXECUTE zu verwenden ist und der PDO-Treiber darüber gestolpert ist.

        Lo!

        1. Hi!

          Den Handbuchhinweis zum MSSQL-Treiber von PDO kennst du? Hast du auch den ODBC-Treiber versucht? Oder mit welchem arbeitest du eigentlich?
          Ich verwende momentan den mssql Treiber welcher bei PDO dabei ist, installiert ist die PHP Version 5.2.11. Danke für den Hinweis, geht es dabei um den PHP Treiber, welchen MS herausgibt?

          PDO hat zwei Treiber, über die man mit dem MSSQL-Server reden kann. Ich entnehme deiner Aussage nun, dass du den PDO_DBLIB mit dem DSN-Prefix "mssql:" verwendest. Der ist laut Handbuch im Status "experimentell". Versuch doch mal den PDO_ODBC mit dem DSN-Prefix "odbc:" zu verwenden. Aber mach das erst als zweiten Versuch, probier vorher das Folgende:

          Hab jetzt den Zugriff per ODBC versucht, dann bekomm ich folgende Fehlermeldung:

          Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42000]: Syntax error or access violation: 102 [Microsoft][ODBC SQL Server Driver][SQL Server]Falsche Syntax in der Nähe von '@P1'. (SQLExecute[102] at ext\pdo_odbc\odbc_stmt.c:133)

          Ich hab allerdings keine Ahnung was '@P1' sein soll :(

          Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY000]: General error: 10007 Falsche Syntax in der Nähe von 'blabla'. [10007] (severity 5) [(null)] in create_bu_tables.php on line 20
          'blabla' kommt in deiner folgenden Beschreibung gar nicht vor. Bitte überprüfe, ob du nicht in Wirklichkeit was anderes ausführst als du denkst oder gibt hier keine falschen Informationen.
          Das blabla hab ich nur hineingeschrieben, in Wirklichkeit steht da der Wert der Variablen $bu_name.

          Es wäre jetzt wichtig, genau auf die Anführungszeichen zu achten. Denn ...

          Üblicherweise beklagen sich die Datenbankfunktionen bei einem im DBMS aufgetretenen Fehler nicht mit einer PHP-Meldung. DBMS-Fehler muss man gesondert abfragen. Dass du eine PHP-Meldung bekommst, deutet für mich darauf hin, dass PDO sich über einen Fehler beklagt und noch gar nicht dazu kam, das DBMS anzusprechen.

          ... ich vermute, dass der PDO-Treiber die Prepared Statements nur simuliert und das SQL-Statement in Wirklichkeit beim Execute selbst zusammenbaut und dann komplett absendet. Dazu muss er für das Quotieren und Maskieren selbst sorgen. Es könnte nun aufgrund des Experimentell-Status sein, dass da was fehlerhaft arbeitet.

          Oder aber es liegt an Franks Vermutung, dass CALL kein gültiger Aufruf ist, stattdessen EXECUTE zu verwenden ist und der PDO-Treiber darüber gestolpert ist.

          Lo!

          Hab jetzt sowohl CALL als auch EXEC bzw. EXECUTE zum aufrufen der stored procedure verwendet, was allerdings immer zur gleichen Fehlermeldung führt.

          Hast du vielleicht noch eine Idee?

          1. So, habe mein Problem glaub ein Stück weit identifiziert. So wie es scheint mach ich beim binden des Parameters irgendwas falsch. Nachdem ich sonst alles behoben hab, was Ihr beschrieben hattet und den Treiber auf ODBC umgestellt hab, hab ich nun folgende Situation.

            Führe ich folgendes aus:

              
            $bu_name = 'test';  
            $sql = 'EXEC butablecheck test';  
            $stmt = $db->prepare($sql);  
            $stmt->bindParam(1, $bu_name);  
            $stmt->execute();  
            
            

            Läuft die Stored Procedure und ich erhalte einen Table mit dem Namen test.

            Führe ich hingegen folgendes aus:

              
            $bu_name = 'test';  
            $groesse_arr = count($result);  
            $stmt = $db->prepare('EXEC butablecheck (?)');  
            $stmt->bindParam(1, $bu_name);  
            for($j=0;$j<=$groesse_arr-1;$j++) {  
                $bu_name = $result[$j][0];  
                $stmt->execute();  
            }  
            
            

            Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42000]: Syntax error or access violation: 102 [Microsoft][ODBC SQL Server Driver][SQL Server]Falsche Syntax in der Nähe von '@tablename'. (SQLExecute[102] at ext\pdo_odbc\odbc_stmt.c:133)

            Der Fehler verweist auf $stmt->execute();

            Das kann doch jetzt nichts mehr so wildes sein, oder?

            1. Hi!

              $bu_name = 'test';

              $sql = 'EXEC butablecheck test';
              $stmt = $db->prepare($sql);
              $stmt->bindParam(1, $bu_name);
              $stmt->execute();

                
              Sehr gut, das Reduzieren des Codes auf das Wesentliche hilft, sich ohne störendes Beiwerk auf den Fehler zu konzentrieren. Und siehe da, weg ist er. Das Problem steckt also im Beiwerk. - Jedoch, zu früh gefreut. Ich vermisse in deinem $sql-String den Platzhalter, an dessen Stelle später der gebundene Wert eingefügt werden soll. $bu\_name kommt hier also gar nicht zum Einsatz, was aber essentiel für deine gewünschte Funktionalität ist und somit in einem Nachbau wirksam vorhanden sein muss.  
                
              
              > for($j=0;$j<=$groesse\_arr-1;$j++) {  
              >     $bu\_name = $result[$j][0];  
                
              Bitte mal an der Stelle den Inhalt von $bu\_name und $result[$j][0] mit var\_dump() ausgeben.  
                
              
              > Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42000]: Syntax error or access violation: 102 [Microsoft][ODBC SQL Server Driver][SQL Server]Falsche Syntax in der Nähe von '@tablename'. (SQLExecute[102] at ext\pdo\_odbc\odbc\_stmt.c:133)  
                
              Ich muss mich vermutlich revidieren, was die Fehlermeldungsquelle angeht. PHP spricht kein deutsch, schon gar nicht fängt es erst englisch an fährt dann deutsch fort. Die Meldung "Falsche Syntax ..." kommt also doch vom MS SQL Server.  
                
              
              > Das kann doch jetzt nichts mehr so wildes sein, oder?  
                
              Ich bin jedenfalls erst einmal mit meinem Latein am Ende.  
                
                
              Lo!
              
              1. Hi!

                $bu_name = 'test';

                $sql = 'EXEC butablecheck test';
                $stmt = $db->prepare($sql);
                $stmt->bindParam(1, $bu_name);
                $stmt->execute();

                
                >   
                > Sehr gut, das Reduzieren des Codes auf das Wesentliche hilft, sich ohne störendes Beiwerk auf den Fehler zu konzentrieren. Und siehe da, weg ist er. Das Problem steckt also im Beiwerk. - Jedoch, zu früh gefreut. Ich vermisse in deinem $sql-String den Platzhalter, an dessen Stelle später der gebundene Wert eingefügt werden soll. $bu\_name kommt hier also gar nicht zum Einsatz, was aber essentiel für deine gewünschte Funktionalität ist und somit in einem Nachbau wirksam vorhanden sein muss.  
                  
                Hab das noch mal angepasst.  
                  
                $bu\_name = 'test';  
                var\_dump($bu\_name);  
                $sql = 'EXEC butablecheck (?)';  
                $stmt = $db->prepare($sql);  
                $stmt->bindParam(1, $bu\_name);  
                $stmt->execute();  
                  
                Erzeugt folgendes:  
                string(4) "test"  
                  
                Und dann auch den Fehler:  
                Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42000]: Syntax error or access violation: 102 [Microsoft][ODBC SQL Server Driver][SQL Server]Falsche Syntax in der Nähe von '@tablename'. (SQLExecute[102] at ext\pdo\_odbc\odbc\_stmt.c:133)  
                  
                
                >   
                > > for($j=0;$j<=$groesse\_arr-1;$j++) {  
                > >     $bu\_name = $result[$j][0];  
                >   
                > Bitte mal an der Stelle den Inhalt von $bu\_name und $result[$j][0] mit var\_dump() ausgeben.  
                >   
                  
                $bu\_name = 'test';  
                $groesse\_arr = count($result);  
                $sql = 'EXEC butablecheck (?)';  
                $stmt = $db->prepare($sql);  
                $stmt->bindParam(1, $bu\_name);  
                for($j=0;$j<=$groesse\_arr-1;$j++) {  
                    $bu\_name = $result[$j][0];  
                    var\_dump($result[$j][0]);  
                    var\_dump($bu\_name);  
                    $stmt->execute();  
                }  
                  
                erzeugt:  
                  
                string(15) "A\_Auckland"  
                string(15) "A\_Auckland"  
                Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42000]: Syntax error or access violation: 102 [Microsoft][ODBC SQL Server Driver][SQL Server]Falsche Syntax in der Nähe von '@tablename'. (SQLExecute[102] at ext\pdo\_odbc\odbc\_stmt.c:133)  
                  
                Also von demher scheint es wirklich an der Übergabe des Parameters zu liegen. Weil wenn ich statt mit Platzhalter einen Namen für den Table direkt angeb, dann wird es sauber ausgeführt. Ich weiss nur nicht was ich hier falsch mach, weil wenn ich diese vorgehensweise in einem normalen prepared Statement nutze, dann funktioniert es auch.  
                  
                Vielleicht hat ja noch jemand eine Idee.  
                  
                Grüße,  
                hawaii
                
                1. Hallo,

                  bin jetzt kein Spezialist was PDO angeht ...

                  $bu_name = 'test';
                  $groesse_arr = count($result);
                  $sql = 'EXEC butablecheck (?)';
                  $stmt = $db->prepare($sql);
                  $stmt->bindParam(1, $bu_name);
                  for($j=0;$j<=$groesse_arr-1;$j++) {
                      $bu_name = $result[$j][0];
                      var_dump($result[$j][0]);
                      var_dump($bu_name);
                      $stmt->execute();
                  }

                  die Parameternotation "(?)" erscheint mir gewagt ... ein einfaches ? ohne die Klammern sollte es auch tun. Kannst du bindParam auch mit einem Variablennamen, z.b. @P1 machen. @P1 ist unter MS SQL die gängige notation für Parameter.

                  Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42000]: Syntax error or access violation: 102 [Microsoft][ODBC SQL Server Driver][SQL Server]Falsche Syntax in der Nähe von '@tablename'. (SQLExecute[102] at ext\pdo_odbc\odbc_stmt.c:133)

                  Da dein "EXEC butablecheck" nichts von einem Parameter @tablename hält, kann es entweder daran liegen, dass

                  • in der Prozedur die Verwendung von @tablename syntaktisch inkorrekt ist
                  • oder du den Aufruf der Prozedur mit mit dem Parameternamen machen musst ... also so z.b.

                  EXEC butablecheck @tablename = ?
                  ->bindParam(1, $bu_name)

                  wobei ich mir frage ... müsste der erste Parameter nicht mit Index 0 referenziert sein ... fängt nicht alles immer irgendwie bei 0 an?

                  Der deutsche Teil der Fehlermeldung kommt vom ODBC Treiber (Betriebssystemsprache) bzw vom MS SQL Server selbst ...

                  Cheers, Frank

                  1. Hi!

                    ->bindParam(1, $bu_name)
                    wobei ich mir frage ... müsste der erste Parameter nicht mit Index 0 referenziert sein ... fängt nicht alles immer irgendwie bei 0 an?

                    Nein, das ist schon richtig so, die Dokumentation sagt, dass bindParam() bei nummerierten Argumenten mit 1 zu zählen beginnt.

                    Lo!

                    1. Ich dank euch beiden für eure Hilfe und Geduld, so langsam weiss ich nicht mehr weiter....
                      Egal in welche Doku oder Tutorial ich zum Thema PDO Aufruf einer Stored Procedure ich schau, ist genau das beschrieben was ich versuch....

                      Ich hab mir nun zum testen noch einmal eine kleine procedure geschrieben, welche einfach nur einen Wert in eine Datenbanktable schreibt:

                        
                      CREATE PROCEDURE blubb  
                      @bla varchar (255)  
                      AS  
                      BEGIN  
                      INSERT INTO test (laber) VALUES (@bla)  
                      END  
                      
                      

                      Für ich sie direkt auf dem SQL Server aus, funktioniert das Ganze und der Wert der Variablen @bla wird in den table test und die spalte laber geschrieben.

                      Rufe ich das Ganze per PHP auf und übergebe einen Wert direkt, dann wird dieser auch korrekt in den Table geschrieben:

                        
                      $sql = 'EXEC blubb test';  
                      $stmt = $db->prepare($sql);  
                      $stmt->execute();  
                      $stmt->debugDumpParams();  
                      
                      

                      Ruf ich aber das Ganze per PHP mit dem Platzhalter auf, dann kommt wieder der Bekannte Fehler:

                        
                      $sql = 'EXEC blubb (?)';  
                      $stmt = $db->prepare($sql);  
                      $bu_name = 'test';  
                      $stmt->bindParam(1, $bu_name);  
                      $stmt->execute();  
                      $stmt->debugDumpParams();  
                      
                      

                      Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42000]: Syntax error or access violation: 102 [Microsoft][ODBC SQL Server Driver][SQL Server]Falsche Syntax in der Nähe von '@bla'. (SQLExecute[102] at ext\pdo_odbc\odbc_stmt.c:133)
                      SQL: [14] EXEC blubb (?) Params: 1 Key: Position #0: paramno=0 name=[0] "" is_param=1 param_type=2

                      Der Aufruf der Prozedur scheint zu funktionieren und auch die Prozedur selber funktioniert ja, denn sonst würde es mit der direkten Übergabe ja auch nicht funktionieren.

                      Habt Ihr vielleicht noch eine Idee wie ich auf dem MSSQL Server prüfen kann, was tatsächlich bei der letzten Methode beim Server ankommt, weil eigentlich kann es ja nur noch irgendwie ein falscher Datentyp sein oder sowas......

                      Grüßle,
                      hawaii

                      1. Hi!

                        Ich dank euch beiden für eure Hilfe und Geduld, so langsam weiss ich nicht mehr weiter....

                        Tut mir leid, denn mir geht es jetzt genauso wie dir.

                        Ruf ich aber das Ganze per PHP mit dem Platzhalter auf, dann kommt wieder der Bekannte Fehler:
                        $sql = 'EXEC blubb (?)';

                        Hast du es mal mit benannten Platzhaltern probiert?

                        Lo!

                        1. Ruf ich aber das Ganze per PHP mit dem Platzhalter auf, dann kommt wieder der Bekannte Fehler:
                          $sql = 'EXEC blubb (?)';

                          Hast du es mal mit benannten Platzhaltern probiert?

                          Lo!

                          Du meinst so?

                            
                          $bu_name = 'test';  
                          $sql = 'EXEC blubb (:name)';  
                          $stmt = $db->prepare($sql);  
                          $stmt->bindParam(':name',$bu_name);  
                          $stmt->execute();  
                          $stmt->debugDumpParams();  
                          
                          

                          Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42000]: Syntax error or access violation: 102 [Microsoft][ODBC SQL Server Driver][SQL Server]Falsche Syntax in der Nähe von '@bla'. (SQLExecute[102] at ext\pdo_odbc\odbc_stmt.c:133)
                          SQL: [18] EXEC blubb (:name) Params: 1 Key: Name: [5] :name paramno=0 name=[5] ":name" is_param=1 param_type=2

                          Leider das gleiche Ergebnis....

                          Wieso muss ich nur MSSQL benutzen.....hatte das Ganze unter MYSQL am laufen und es hat funktioniert.......

                          1. Hi!

                            Leider das gleiche Ergebnis....

                            Dann hätte ich nur noch als Vorschlag, statt PDO es mit den mssql_*- oder den odbc_*-Funktionen zu versuchen.

                            Lo!

                            1. Hi!

                              Leider das gleiche Ergebnis....

                              Dann hätte ich nur noch als Vorschlag, statt PDO es mit den mssql_*- oder den odbc_*-Funktionen zu versuchen.

                              Lo!

                              Also nach weiteren Versuchen hab ich es aufgegeben Stored Procedures mit PDO zu verwenden. Hab das Ganze dann mit mssql_* versucht und siehe da....es funktioniert :))

                                
                              $db = getDBStored();  
                              $groesse_arr = count($result);  
                              for($i=0;$i<=$groesse_arr-1;$i++) {  
                                  $bu_name = $result[$i][0];  
                                  $query = mssql_init('butablecheck', $db);  
                                  mssql_bind($query, '@tablename', $bu_name, SQLVARCHAR);  
                                  $res = mssql_execute($query);  
                              
                              

                              Jetzt mach ich halt meine prepared statements über PDO und wenn ich stored procedures aufrufen will, dann benutz ich mssql_*. Find ich zwar irgendwie nicht so schön, aber irgendwie scheint bei PDO irgendwas bei der Parameterübergabe schief zu gehen.

                              Grüßle,
                              hawaii

                      2. Hallo,

                        was hast du denn für eine Edition/Version vom SQL Server?

                        Standard*, Enterprise*, Workgroup*, Developer*, Express

                        * diese bekommen ein Tool names "Profiler" mitgeliefert, mit dem du low-level auf der DB nachschauen kannst, was da so reinkommt ...

                        Du hast nicht geschrieben, dass du es mal mit "EXEC storedproc @bla=?" probiert hast?

                        Cheers, Frank