복붙노트

[SQL] SQLSRV 및 사용 PHP에서 저장 프로 시저를 실행하는 방법 "을?" 스타일의 매개 변수

SQL

SQLSRV 및 사용 PHP에서 저장 프로 시저를 실행하는 방법 "을?" 스타일의 매개 변수

나는 (제목에서)이 같은 보이지 여러 가지 다른 질문을 통해 봤는데. 그러나 내 경우는 조금 다른입니다.

다음 작업 (예 : I "성공"주어진 변수와 프로 시저를 실행 할 때 내가 무엇을 기대 내 데이터베이스 수행을 얻을 수) :

$sql = "MyDB.dbo.myProcedure {$var1}, {$var2}, {$var3}";
$result = sqlsrv_query($myConn, $sql);
if (!$result) {
    echo 'Your code is fail.';
}
else {
    echo 'Success!';
}

나는 매개 변수를 사용하여 SQL 문자열을 작성하여 (또는 가능성 감소) SQL 주입을 방지 할 수 있습니다. 예를 들면 :

$sql = "select * from aTable where col1 = ? AND col2 = ?";
$result = sqlsrv_query($myConn, $sql, array($var1, $var2));
//please note. This code WILL work!

내가 저장 프로 시저와 그렇게 할 때 실패합니다. 그것은 sqlsrv_errors (를 통해보고 된 오류없이), 데이터베이스에 아무 작업, 및 $ 결과 === 거짓 실패합니다.

명확하게하기 위해, 다음은 실패

$sql = "MyDB.dbo.myProcedure ?, ?, ?";
$result = sqlsrv_query($myConn, $sql, array($var1, $var2, $var3));

마찬가지로 준비 / 실행 문은 실패합니다 같은 방법으로 만들어 :

$sql = "MyDB.dbo.myProcedure ?, ?, ?";
$stmt = sqlsrv_prepare($myConn, $sql, array(&$var1, &$var2, &$var3));
foreach($someArray as $key => $var3) {
    if(sqlsrv_execute($stmt) === false) {
        echo 'mucho fail.';
    }
}
//this code also fails.

완성도를 위해, 나는 문제의 저장 프로 시저가 SQL 관리 Studio에서 직접 작동하는지 확인하고있는 경우는 제가 위에서 언급 한 방법을했다. 마찬가지로, 나는 (삽입과 같은 저장 프로 시저 대, 업데이트 선택) 어떤 원시 쿼리에 대한 매개 변수화 된 쿼리를 사용할 수 있음을 확인했다.

그래서, 내 질문은 내가 쿼리 문자열에 변수를 삽입 대 매개 변수화 된 쿼리를 사용하여 저장 프로 시저를 호출하는 방법입니까?

더 중요한 사실은 그렇게 잘하면 답이 작업이 허용뿐만 아니라 것입니다, / a를 준비 사용 실행하고자하고있다.

해결법

  1. ==============================

    1.php.net에 대한 사용자의 기여는 SQLSRV이-준비 사용하여 저장 프로 시저를 실행하는 방법에 대한 기록을 가지고있다.

    php.net에 대한 사용자의 기여는 SQLSRV이-준비 사용하여 저장 프로 시저를 실행하는 방법에 대한 기록을 가지고있다.

    여기에 미래에 php.net 사용자 기여에서 제거되는 경우가 나와 (이있다) 한 것입니다 :

    $procedure_params = array(
    array(&$myparams['Item_ID'], SQLSRV_PARAM_OUT),
    array(&$myparams['Item_Name'], SQLSRV_PARAM_OUT)
    );
    // EXEC the procedure, {call stp_Create_Item (@Item_ID = ?, @Item_Name = ?)} seems to fail with various errors in my experiments
    $sql = "EXEC stp_Create_Item @Item_ID = ?, @Item_Name = ?";
    $stmt = sqlsrv_prepare($conn, $sql, $procedure_params);
    

    다음은 매뉴얼의 페이지 http://php.net/manual/en/function.sqlsrv-prepare.php입니다

  2. ==============================

    2.이것은 @ chris85에 의해 대답에 후속이다.

    이것은 @ chris85에 의해 대답에 후속이다.

    그것은 문이 준비되면, 당신은 그것을 실행할 필요가 여기에 주목할 필요가있다 :

    $sql = "EXEC stp_Create_Item @Item_ID = ?, @Item_Name = ?";
    $stmt = sqlsrv_prepare($conn, $sql, $procedure_params);
    if (!sqlsrv_execute($stmt)) {
        echo "Your code is fail!";
        die;
    }
    while($row = sqlsrv_fetch_array($stmt)){
        //Stuff
    }
    

    sqlsrv_execute ()는 참 /의 거짓을 반환합니다. 저장 프로 시저에 의해 반환 된 데이터를 구문 분석하려면 당신은 sqlsrv_query에서 () 결과처럼 처리 할 수 ​​있습니다.

    당신이 sqlsrv_execute를 잊어 버린 경우에는 () 당신은 결과가 사용하기 전에 실행해야한다는 오류가 발생합니다.

  3. ==============================

    3.확인이 설정하거나 저장 프로 시저가 메시지가 반환되는 경우 당신은 항상 오류가 반환 받게됩니다.

    확인이 설정하거나 저장 프로 시저가 메시지가 반환되는 경우 당신은 항상 오류가 반환 받게됩니다.

    sqlsrv_configure('WarningsReturnAsErrors',0);
    
    //Full working code below
    
    $sql = "{call NameOfDatabase.NameOfOwner.StoredProcedureName(?,?)}";
    
    $params = array($param1, $param2); 
    
    if ($stmt = sqlsrv_prepare($conn, $sql, $params)) {
        echo "Statement prepared.<br><br>\n";  
    
    } else {  
        echo "Statement could not be prepared.\n";  
        die(print_r(sqlsrv_errors(), true));  
    } 
    
    if( sqlsrv_execute( $stmt ) === false ) {
    
        die( print_r( sqlsrv_errors(), true));
    
    }else{
    
        print_r(sqlsrv_fetch_array($stmt));
    
    }
    
  4. from https://stackoverflow.com/questions/31575135/how-to-execute-a-stored-procedure-in-php-using-sqlsrv-and-style-parameters by cc-by-sa and MIT license