Общая ошибка: 1008 OCIStmtExecute: ORA-01008: не все переменные связаны

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

Ошибка: SQLSTATE [HY000]: Общая ошибка: 1008 OCIStmtExecute: ORA-01008: не все переменные связаны (ext \ pdo_oci \ oci_statement.c: 159)

Вот проблема (я сделал это, потому что мне нужно подсчитать количество строк, когда я делаю 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 лучше и имеет больше возможностей.