Хранимая процедура 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 может видеть, что для этого есть переменная.
Спасибо,
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();
}
Вы должны связать переменные перед вызовом 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 выделял достаточно памяти для хранения возвращаемого значения.