Я делаю окно входа в систему, и когда я рассчитываю количество строк, на которые влияет инструкция SELECT для проверки учетной записи и пароля, у меня есть проблема.
Ошибка: SQLSTATE [HY000]: Общая ошибка: 1008 OCIStmtExecute: ORA-01008: не все переменные связаны (ext \ pdo_oci \ oci_statement.c: 159)
- Вызов неопределенной функции oci_connect, php_oci8_12c.dll, windows 8.1, php5.6.6
- Вызов неопределенной функции oci_connect, php_oci8_11g.dll, windows 10, php5.6.24
- Ошибка при запуске: Не удалось загрузить ресурс: net :: ERR_CONNECTION_RESET
- как обновить LOB с помощью PHP в oracle? (OCI_INVALID_HANDLE)
- php oci8 ext не загружается Невозможно загрузить динамическую библиотеку
Вот проблема (я сделал это, потому что мне нужно подсчитать количество строк, когда я делаю SELECT. Все это для входа.)
Я нашел этот фрагмент кода на официальной странице PHP: ссылка на страницу PHP (пример № 2)
$resultado = $base->query($sql); if ($resultado) { /* Comprobar el número de filas que coinciden con la sentencia SELECT */ if ($resultado->fetchColumn() > 0) { /* Ejecutar la sentencia SELECT real y trabajar con los resultados */ echo "<h2>Adelante!!</h2>"; } /* No coincide ningua fila -- hacer algo en consecuencia */ else { print "Ninguna fila coincide con la consulta."; } }
КОД:
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <?php try { $base = new PDO('oci:dbname=localhost', 'hr', 'hr'); $base->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql= "SELECT * FROM DEPARTMENTS WHERE DEPARTMENT_ID=:login AND MANAGER_ID=:password"; $resultado = $base->prepare($sql); $login = htmlentities(addslashes($_POST["login"])); $password = htmlentities(addslashes($_POST["password"])); $resultado->bindValue(":login", $login); $resultado->bindValue(":password", $password); $resultado->execute(); $resultado = $base->query($sql); if ($resultado) { if ($resultado->fetchColumn() > 0) { echo "<h2>Adelante!!</h2>"; } else { print "Ninguna fila coincide con la consulta."; } } } catch(Exception $e) { die("Error: " .$e->getMessage()); } ?> </body> </html>
Пытаться
<?php $did = 70; $mid = 204; try { $base = new PDO('oci:dbname=localhost', 'hr', 'hr'); $base->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql= "SELECT * FROM DEPARTMENTS WHERE DEPARTMENT_ID = :did AND MANAGER_ID = :mid"; $resultado = $base->prepare($sql); $resultado->bindParam(":did", $did); $resultado->bindParam(":mid", $mid); $resultado->execute(); while ($row = $resultado->fetch(PDO::FETCH_ASSOC)) { foreach ($row as $item) { echo "$item "; } echo "\n"; } } catch(Exception $e) { die("Error: " .$e->getMessage()); } ?>
Главное – не использовать query (), поскольку вы уже вызываете prepare () и execute (). Именно запрос () предоставлял ORA-1008, поскольку он не имел значений для переменных связывания.
Другое дело – не использовать addlashes и т. Д. С переменными связывания Oracle. Данные привязки всегда отделены от кода и должны быть оставлены в качестве пользователя.
Также обратите внимание, что я использовал bindParam .
Проверьте примеры и тесты PDO и PDO_OCI в документе и на GitHub . Существуют некоторые общие концепции, которые могут быть полезны в Underground PHP и Oracle Manual .
Наконец, используйте расширение OCI8, а не PDO_OCI. OCI8 лучше и имеет больше возможностей.