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

  • spaceship
    hat ein Thema erstellt MySQL Prozeduren mit Rückgabewert als PDO.

    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?

  • spaceship
    antwortet
    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.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:


  • spaceship
    antwortet
    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.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:


  • spaceship
    antwortet
    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.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:


  • spaceship
    antwortet
    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.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:

Lädt...
X