Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL Prozeduren mit Rückgabewert als PDO

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQL Prozeduren mit Rückgabewert als PDO

    Hi Programmierer,

    ich habe mir hier im Forum schon so einige Threads zum Thema "Stored Procedures" durchgelesen, aber leider für mein Problem noch keine Lösung gefunden. Es geht darum, mit einem PDO eine mysql-procedure aufzurufen und den Rückgabewert auszugeben:

    Meine Prozedur hat folgenden Quellcode
    Code:
    CREATE PROCEDURE anzahl_tiere(OUT anzahl INT)
      SQL SECURITY INVOKER
      BEGIN
        SELECT COUNT(*) INTO anzahl FROM tiere;
      END|
    Als Delimiter habe ich die Pipe gewählt.

    Jetzt möchte ich den Inhalt von anzahl mit folgendem php-Skript abfragen

    PHP-Code:
    $db=new PDO("mysql:dbname...");

    $statement=$db->prepare("CALL anzahl_tiere(?)");
    $statement->bindParam(1,$return_value,PDO::PARAM_INT);
    $statement->execute();

    echo 
    'Anzahl der Tiere: '.$return_value
    Leider kriege ich damit keine Ausgabe hin. Eine Fehlermeldung dazu kommt auch nicht.

    Die Prozedur lässt sich mit folgendem sql-Code problemlos in phpMyAdmin ausführen
    Code:
    call anzahl_tiere(@anzahl);
    select @anzahl as anzahlTiere;
    Weiss jemand Rat?


  • #2
    Zitat von spaceship Beitrag anzeigen
    PHP-Code:
    $db=new PDO("mysql:dbname...");

    $statement=$db->prepare("CALL anzahl_tiere(?)");
    $statement->bindParam(1,$return_value,PDO::PARAM_INT);
    $statement->execute();

    echo 
    'Anzahl der Tiere: '.$return_value
    Fehlt eigentlich nur ein zusätzlicher PDO-Parameter im Zusammenhang mit Stored Procedures (siehe PDO::PARAM_INPUT_OUTPUT)

    Code:
    $statement->bindParam(1,$return_value,PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
    Grüße
    Thomas

    Kommentar


    • #3
      Moin Thomas,

      aber ich will ja garkeine Parameter an die Stored Procedure übergeben. Sie soll ohne
      Parameter ausgeführt werden, und produziert selber nur einen OUT Parameter.

      Kommentar


      • #4
        Zitat von thomas_w Beitrag anzeigen
        Code:
        $statement->bindParam(1,$return_value,PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
        Bei genauer Betrachtung schreibe ich auch von einem zusätzlichem bindParam() Parameter PDO::PARAM_INPUT_OUTPUT im Zusammenhang mit Stored Procedures.

        Grüße
        Thomas

        Kommentar


        • #5
          Hmmm, also deine Lösung bringt mich leider nicht wirklich weiter. Wenn ich die Zeile so
          abändere wie beschrieben passiert nach wie vor garnicht. Die $return_value Variable bleibt
          leer. Wozu brauche ich einen zusätzlichen Parameter und wo kann ich das nachlesen?
          (siehe PDO::PARAM_INPUT_OUTPUT)
          Ein Link zur entsprechenden Quelle wäre schön.

          Kommentar


          • #6
            Kein Problem...

            PHP: PDOStatement->bindParam - Manual

            Wenn es nicht funktioniert, kannst Du ja nochmal Dein aktuelles Skript zeigen, ich probiere es dann heute abend aus.

            Grüße
            Thomas

            Kommentar


            • #7
              Also mein aktuelles Skript sieht so aus
              PHP-Code:
              $pdo=new PDO("mysql:dbname=xxx;host=xxx","xxx","xxx");
                  
              $statement=$pdo->prepare("CALL anzahl_tiere(@anzahl)");
              $statement->execute();
              $statement=$pdo->prepare("SELECT @anzahl AS anzahl");
              $statement->execute();
                  
              $anzahl=$statement->fetch(PDO::FETCH_OBJ)->anzahl;
              echo 
              "Anzahl der Tiere: ".$anzahl
              Nachdem ich gelesen habe, das die PDO-Schnittstelle
              zwar mit prepare und bindParam Rückgabewerte (OUT und
              INOUT-Paramenter) verarbeiten kann, das aber noch
              nicht mit MySQL funktioniert, bin ich einen Schritt
              zurück gegangen. Das Skript funktioniert zwar, eine Lösung mit
              bindParam würde ich aber schöner finden.

              Kommentar


              • #8
                Da muss ich Dir leider recht geben, der OUT Parameter funktioniert bei mir mit PDO auch nicht. Dass muss ich mal recherchieren, wird aber noch dauern...

                Ich teste mit: MySQL 5.1.44 und PHP 5.2.13 unter Windows XP.

                Du hast ja vorab eine Lösung, wenn auch keine perfekte.

                Alternativ kannst Du ja mal CREATE FUNCTION anstatt CREATE PROCEDURE probieren.

                EDIT
                Sieht aus wie der hier beschriebene Bug.
                http://bugs.php.net/bug.php?id=46657&edit=1

                EDIT2
                scheint irgendwie an MySQL zu liegen. Bei meinen eigenen Projekten mit ORACLE habe ich dieses Problem nicht.


                Grüße
                Thomas

                Kommentar


                • #9
                  Probiert doch mal folgendes. Beide SQL-Befehle mit ";" getrennt abschicken. Habe ich eben noch gesehen, aber nicht selber ausprobiert.

                  Zitat von spaceship Beitrag anzeigen
                  Code:
                  	
                  $statement=$pdo->prepare("CALL anzahl_tiere(@anzahl); SELECT @anzahl AS anzahl");
                  $statement->execute();
                  	
                  $anzahl=$statement->fetch(PDO::FETCH_OBJ)->anzahl;
                  echo "Anzahl der Tiere: ".$anzahl;
                  dann ist das Ganze wenigsten wieder in einem Befehl zusammengefasst.

                  Eventuell hilft auch noch dieses als Ideenquelle

                  Code:
                  Assume sproc myproc( IN i int, OUT j int ):
                  
                  $mysqli = new mysqli(  "HOST", "USR", "PWD", "DBNAME" );
                  $ivalue=1;
                  $res = $mysqli->multi_query( "CALL myproc($ivalue,@x);SELECT @x" );
                  if( $res ) {
                    $results = 0;
                    do {
                      if ($result = $mysqli->store_result()) {
                        printf( "<b>Result #%u</b>:<br/>", ++$results );
                        while( $row = $result->fetch_row() ) {
                          foreach( $row as $cell ) echo $cell, "&nbsp;";
                        }
                        $result->close();
                        if( $mysqli->more_results() ) echo "<br/>";
                      }
                    } while( $mysqli->next_result() );
                  }
                  $mysqli->close();
                  Grüße
                  Thomas

                  Kommentar


                  • #10
                    PHP-Code:
                    $statement=$pdo->prepare("CALL anzahl_tiere(@anzahl); SELECT @anzahl AS anzahl");
                    $statement->execute(); 
                    Die Idee finde ich gut, klappt aber leider auch nicht. Das Ergebnis ist dann wieder leer.
                    Ich teste mit PHP 5.3.1 und MySQL 5.1.41 unter Win XP.

                    Wenn jemand eine Möglichkeit zum Multi-Query mit PDO kennt, bitte schreiben!

                    Auch der Versuch, die Paramenter im execute zu realisieren, war erfolglos
                    PHP-Code:
                    $statement=$pdo->prepare("CALL anzahl_mitarbeiter(?)");
                    $statement->execute(array('@anzahl'));
                    $statement=$pdo->prepare("SELECT ? AS anzahl");
                    $statement->execute(array('@anzahl')); 
                    Er stößt sich wohl hier an dem @-Zeichen ist meine Vermutung.

                    Ich machs erstmal "zu Fuß" mit meinem alten Skript. Wenn mir
                    in der nächsten Zeit noch was besseres gelingt, poste ich das hier.

                    Kommentar

                    Lädt...
                    X