[SQL] SQLSRV 및 사용 PHP에서 저장 프로 시저를 실행하는 방법 "을?" 스타일의 매개 변수
SQLSQLSRV 및 사용 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.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.이것은 @ 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.확인이 설정하거나 저장 프로 시저가 메시지가 반환되는 경우 당신은 항상 오류가 반환 받게됩니다.
확인이 설정하거나 저장 프로 시저가 메시지가 반환되는 경우 당신은 항상 오류가 반환 받게됩니다.
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)); }
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
'SQL' 카테고리의 다른 글
[SQL] SQL은 where 절에 열 별칭을 인식하지 (0) | 2020.06.14 |
---|---|
[SQL] 문자열로 안전 SQL 문 만들기 (0) | 2020.06.14 |
[SQL] 선택 (2008 SQL 서버)에서 두 테이블을 결합 (0) | 2020.06.14 |
[SQL] 오라클 - 업데이트에 가입 - 비 키 보존 테이블을 (0) | 2020.06.14 |
[SQL] 동일한 값의 연속 그룹 행 타임 스팬을 이용하여 (0) | 2020.06.14 |