Используйте SELECT COUNT (*), чтобы получить количество строк. В противном случае вы вернете фактические данные, которые расточительны. Посмотрите примеры PHP и PDO, чтобы узнать, как получить доступ к возвращенным значениям запроса.

аю окно входа в систему, и когда я подсчитываю количество строк, затронутых оператором 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>

Ответы на вопрос(1)

Пытаться

<?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, Есть некоторые общие понятия, которые могут быть полезны вПодземное руководство по PHP и Oracle.

Наконец, используйте расширение OCI8, а не PDO_OCI. OCI8 лучше и имеет больше возможностей.

 RicardoBarros12 дек. 2017 г., 04:36
спасибо друг, но я не хочу ничего печатать, я просто хочу сохранить в переменной количество элементов, возвращаемых select. как я это сделал ?
 RicardoBarros13 дек. 2017 г., 01:15
Я не использовал его для этого поста, но если для другой проблемы у меня было хаха, друг в строке, вся строка с извлеченной информацией сохраняется, но если я хотел, чтобы каждый извлеченный столбец был сохранен в переменной? пример в $ a = attribute1, $ b = attribute2 ... как бы это было?
 Christopher Jones13 дек. 2017 г., 02:38
Используйте SELECT COUNT (*), чтобы получить количество строк. В противном случае вы вернете фактические данные, которые расточительны. Посмотрите примеры PHP и PDO, чтобы узнать, как получить доступ к возвращенным значениям запроса.

Ваш ответ на вопрос