Хранимая процедура PHP и oracle


У меня возникли некоторые проблемы с разработкой того, как использовать PHP и вызывать хранимую процедуру oracle.

Выполнение следующей команды непосредственно в SQL developer дает мне необходимые результаты:

 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();

Похоже, у меня возникли некоторые проблемы с выводом входных данных, поэтому $result может видеть, что для этого есть переменная.

Спасибо,

Author: WAQAS SHABIR, 2016-03-06

2 answers

Сначала вам нужно убедиться, что ваша хранимая процедура верна, и она возвращает ожидаемый результат:

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);

Затем используйте логику кода, чтобы проверить, соответствует ли результат имени пользователя и роли, например, Master, и вы знаете отдыхай!

if ($result == $username && $role == 'Master' ) {
        echo ("<SCRIPT LANGUAGE='JavaScript'>
        window.alert('Logged Succesfully!')
        window.location.href='master.php'
        </SCRIPT>");
           $_SESSION['attractionlogin'] = $username;
        exit();
    } 
 0
Author: Louis N, 2016-03-12 21:55:21

Вы должны связать переменные перед вызовом 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);

Смотрите Пример #11 Параметры привязки для хранимой процедуры PL/SQL в руководстве.

Также обратите внимание, что ваш вызов переменной OUT (:bind4) неверен; четвертый параметр должен быть maxlength. В приведенном выше коде я включил его, но вы должны установить его в зависимости от размера возвращаемых данных! Из руководства:

Вы должны указать maxlength при использовании OUT-привязки, чтобы PHP выделял достаточно памяти для хранения возвращаемого значения.

 1
Author: timclutton, 2016-03-07 10:00:55