sqlsrv und output Parameter, hile benötigt.

04/13/2014 13:52 paddelx3#1
Hallu :3

ich bin derzeit nen bissel mit SP's am rumhantieren. Als Server verwend ich den MS SQL Server 2008.

Was ich vor hatte: Das Login via Prozedur checken die einen rückgabewert liefert den ich dann im Script weiter auswerten kann.

SQL der SP:

Code:
/****** Object:  StoredProcedure [dbo].[usp_login]    Script Date: 04/13/2014 13:44:49 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[usp_login]
	@role varchar(30),
	@password varchar(50),
	@ip varchar(20),
	@state nvarchar OUTPUT
as
	SELECT 
		@state = COUNT(*) FROM dbo.ROLE_TBL 
	WHERE 
		role = @role AND password = @password
GO
Mein PHP Code enthält noch die IP des Benutzers, jedoch muss ich ja erst mal das eigentliche Login an sich zum Laufen bringen bevor ich etwas loggen kann. Die Prozedur gibt mir in meinen Managment Studio für das Output Field 1 oder 0 aus, also klappt die obrige Prozedur jedoch erhalte ich in PHP immer bei nen dump int(0) und errors werden mir auch nicht zurück gegeben.

PHP Code:
PHP Code:
    public function chkLogin($role$password) {
        
// Datenbank auf WEBSIT_DBF ändern
        
sqlsrv_query($this->db"USE WEBSITE_DBF;");
        
        
// Login Prozedur setzen
        
$sql "EXEC dbo.usp_login ?,?,?,?";
        
        
// SQL Parameter einbinden
        
$param = array(
            array(
$roleSQLSRV_PARAM_IN),
            array(
$passwordSQLSRV_PARAM_IN),
            array(
$_SERVER['REMOTE_ADDR'], SQLSRV_PARAM_IN),
            array(
$output=0SQLSRV_PARAM_OUT)
        );
        
        
// SQL Prozedur ausführen
        
$stmnt sqlsrv_query($this->db$sql$param);
        
        
// Fehler ausgeben lassen 
        
if( $stmnt === false ) {
            die( 
print_rsqlsrv_errors(), true));
        }
        
                
// Von der Prozedur den Output Wert zurückgeben.
        
return $output;
    } 
Ich arbeite erst seit kruzen mit den sqlsrv_ treibern und mit Prozeduren, kA ob ich irgendwo einen gravierenden Fehler habe, aber laut Dokumentation ist das so richtig.

lg und danke im vorraus für jede hilfe / jeden tipp.
04/14/2014 13:42 Shawak#2
Kenne mich nicht wirklich mit sqlsrv aus, aber hat es einen Grund das output = 0 gesetzt wird und das auch erst in der Array?

Du könntest mal folgendes ausprobieren:
Code:
    public function chkLogin($role, $password) { 
        // Datenbank auf WEBSIT_DBF ändern 
        sqlsrv_query($this->db, "USE WEBSITE_DBF;"); 
         
        // Login Prozedur setzen 
        $sql = "EXEC dbo.usp_login ?,?,?,?"; 
         
        $output = 0;

        // SQL Parameter einbinden 
        $param = array( 
            array($role, SQLSRV_PARAM_IN), 
            array($password, SQLSRV_PARAM_IN), 
            array($_SERVER['REMOTE_ADDR'], SQLSRV_PARAM_IN), 
            array($output, SQLSRV_PARAM_OUT) 
        ); 
         
        // SQL Prozedur ausführen 
        $stmnt = sqlsrv_query($this->db, $sql, $param); 
         
        // Fehler ausgeben lassen  
        if( $stmnt === false ) { 
            die( print_r( sqlsrv_errors(), true)); 
        } 
         
                // Von der Prozedur den Output Wert zurückgeben. 
        return $output; 
    }
Lg ;)
04/16/2014 15:11 paddelx3#3
Quote:
Originally Posted by Shawak View Post
Kenne mich nicht wirklich mit sqlsrv aus, aber hat es einen Grund das output = 0 gesetzt wird und das auch erst in der Array?

Du könntest mal folgendes ausprobieren:
Code:
    public function chkLogin($role, $password) { 
        // Datenbank auf WEBSIT_DBF ändern 
        sqlsrv_query($this->db, "USE WEBSITE_DBF;"); 
         
        // Login Prozedur setzen 
        $sql = "EXEC dbo.usp_login ?,?,?,?"; 
         
        $output = 0;

        // SQL Parameter einbinden 
        $param = array( 
            array($role, SQLSRV_PARAM_IN), 
            array($password, SQLSRV_PARAM_IN), 
            array($_SERVER['REMOTE_ADDR'], SQLSRV_PARAM_IN), 
            array($output, SQLSRV_PARAM_OUT) 
        ); 
         
        // SQL Prozedur ausführen 
        $stmnt = sqlsrv_query($this->db, $sql, $param); 
         
        // Fehler ausgeben lassen  
        if( $stmnt === false ) { 
            die( print_r( sqlsrv_errors(), true)); 
        } 
         
                // Von der Prozedur den Output Wert zurückgeben. 
        return $output; 
    }
Lg ;)
Im Code an sich war kein Fehler. :p
Die Prozedur war bissl komisch, mit nen Erzwingen ( T-sql Befehl RETURN ) des Anweisungsblock klappt nu alles, trotzdem danke Shawak :p

mfg