2016-03-06 192 views
2

我有一點麻煩工作如何使用PHP,並調用Oracle存儲過程。PHP與Oracle存儲過程

直接在SQL開發人員運行以下命令給我我需要的結果:

variable O_username varchar2; 
EXECUTE LOGINADMIN('John','John', 'Attractions', :O_username); 

    print O_username; 

但是在PHP我有麻煩我需要的結果。這是我的PHP代碼。

include 'connection.php'; 


$username = ($_POST['uname']); 
    $password = ($_POST['pass']); 
    $role = ($_POST['admin_role']); 
$query = "EXECUTE LOGINADMIN(:bind1,:bind2, :bind3, :bind4); 
"; 
oci_bind_by_name($stmt, ":bind1", $username); 
oci_bind_by_name($stmt, ":bind2", $password); 
oci_bind_by_name($stmt, ":bind3", $role); 
oci_bind_by_name($stmt, ":bind4", $result, 50); 

$stmt = oci_parse($conn, $query); 
oci_execute($stmt); 
while ($row=oci_fetch_row($stmt)) 

$count = oci_num_rows($stmt); 
ECHO $stmt; 
ECHO $result; 

echo OCI_RESULT ($stmt); 
if ($count > 0 && $role == 'Attractions') { 
     echo ("<SCRIPT LANGUAGE='JavaScript'> 
     window.alert('Logged Succesfully!') 
     window.location.href='attractionshome.php' 
     </SCRIPT>"); 
      $_SESSION['attractionlogin'] = $username; 
     exit(); 

它看起來像我有一些麻煩得到輸入,所以$結果可以看到有一個變量。

謝謝你,

回答

0

首先,您需要確保您的存儲過程是正確的,並返回預期的結果:

create or replace PROCEDURE loginadmin 
(
v_username IN STAFF.USERNAME%TYPE, 
v_password IN STAFF.PASSWORD%TYPE, 
v_admin_role IN ADMIN.ADMIN_ROLE%TYPE, 
O_Username OUT STAFF.USERNAME%TYPE 
) 
AS 
    BEGIN 
    SELECT STAFF.USERNAME INTO O_Username 
    FROM STAFF 
    INNER JOIN ADMIN 
    ON STAFF.NINO = ADMIN.NINO 
    WHERE STAFF.USERNAME = v_username AND STAFF.PASSWORD = v_password and ADMIN.ADMIN_ROLE = v_admin_role; 
END; 
/

然後執行它來測試它的結果!

variable O_Username varchar2; 
execute loginadmin ('testUsername', 'testPassword', 'testRole', :O_Username); 
print O_Username; 

然後在你的php代碼中,確保你包含了@tim指明的長度。 (在我的例子中是40)。 然後嘗試用一個開始執行存儲過程!

include 'connection.php'; 
$username = $_POST['uname']; 
$password = $_POST['pass']; 
$role = $_POST['admin_role']; 
$query = 'begin loginadmin (:bind1,:bind2, :bind3, :bind4); end;'; 

$stmt = oci_parse($conn, $query); 
oci_bind_by_name($stmt, ':bind1', $username); 
oci_bind_by_name($stmt, ':bind2', $password); 
oci_bind_by_name($stmt, ':bind3', $role); 
oci_bind_by_name($stmt, ':bind4', $result, 40); 
oci_execute($stmt); 

然後讓你的代碼邏輯來檢查,如果結果一致的用戶名和角色是例如法師和你都知道了!

if ($result == $username && $role == 'Master') { 
     echo ("<SCRIPT LANGUAGE='JavaScript'> 
     window.alert('Logged Succesfully!') 
     window.location.href='master.php' 
     </SCRIPT>"); 
      $_SESSION['attractionlogin'] = $username; 
     exit(); 
    } 
1

您必須調用oci_execute之前綁定變量

$stmt = oci_parse($conn, $query); 
oci_bind_by_name($stmt, ":bind1", $username); 
oci_bind_by_name($stmt, ":bind2", $password); 
oci_bind_by_name($stmt, ":bind3", $role); 
oci_bind_by_name($stmt, ":bind4", $result, $maxlength, SQLT_CHR); 
oci_execute($stmt); 

Example #11 Binding parameters for a PL/SQL stored procedure的說明書中無。

另外請注意,您的OUT變量調用(:bind4)不正確;第四個參數應該是maxlength。在上面的代碼中,我已經包含了它,但是您必須根據要返回的數據大小來設置它。從手冊中:

使用OUT綁定時必須指定maxlength,以便PHP分配足夠的內存來容納返回的值。

+0

你好感謝你的幫助非常感謝。但是我已經將綁定下面的oci_execute。還添加了$ maxlength。但是我略微不清楚應該爲$ maxlength定義什麼。你能否提供一個例子?正在返回的數據類型是nvarchar2大小50. –

+0

@WAQASSHABIR來自示例I鏈接的註釋:_「第二個過程參數是一個OUT綁定。默認類型將是一個字符串類型,因此綁定長度爲40意味着至多將返回40位數字。「_。如果返回字段的大小爲50,我會說的'$ maxlength'使用50(但你要測試這個當然)。 – timclutton

+0

嗨蒂姆,仍然沒有運氣我已經更新了我的代碼。感謝 –