php / postgres - вывод запроса не печатается в браузере - PullRequest
0 голосов
/ 04 июля 2011

Я пишу простую систему user / login в Php с помощью postgresql.

У меня есть функция, которая подтверждает существование имени пользователя / пароля, которая активируется, когда пользователь нажимает кнопку входа в систему.

 public function confirmUserPass($username, $password){

    $username=pg_escape_string($username);

    /* Verify that user is in database */

    $q = "SELECT password FROM users WHERE email = '$username'";
    $result = pg_query($this->link,$q);

    /* Do more operations */
}

Я хочу напечатать запрос, сохраненный в $ результатов, чтобы я мог видеть его в браузере. Когда я делаю это в phppgAdmin, используя SQL, он показывает вывод, но я не вижу его в браузере. Я попробовал echo и printf, но ничего не увидел в браузере. Я также пытался увидеть исходный вид из браузера, но он ничего не показывает. Может ли кто-нибудь помочь мне с этим?

Привет

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Из вашего кода: $result = pg_query($this->link,$q);

Как вы уже нашли, попытка отобразить содержимое $result из строки выше не даст вам ничего полезного.Это потому, что он не содержит данных, возвращаемых запросом;он просто содержит «дескриптор ресурса».

Чтобы получить реальные данные, вы должны вызвать вторую функцию после pg_query().Вам нужна функция pg_fetch_array().

pg_fetch_array() берет дескриптор ресурса, который вы дали в $result, и запрашивает у него следующий набор данных.

AЗапрос SQL может возвращать несколько результатов, поэтому обычно помещают pg_fetch_array() в цикл и продолжают вызывать его до тех пор, пока он не вернет false вместо массива данных.Однако в случае, подобном вашему, когда вы уверены, что он вернет только один результат, можно просто вызвать его один раз сразу после pg_query() без использования цикла.

Ваш код может выглядеть следующим образом:

$result = pg_query($this->link,$q);
$data = pg_fetch_array($result, NULL, PGSQL_ASSOC);

Как только вы наберете $data, вы получите фактические данные из БД.

Чтобы просмотреть отдельные поля в $data, вам нужно посмотретьв его элементах массива.Он должен иметь элемент массива, названный для каждого поля в запросе.В вашем случае ваш запрос содержит только одно поле, поэтому оно будет называться $data['password'].Если у вас есть больше полей в запросе, вы можете получить к ним доступ аналогичным образом.

Таким образом, ваша следующая строка кода может выглядеть примерно так:

echo "Password from DB was: ".$data['password'];

Если вы хотите увидетьнеобработанные данные можно отобразить в браузере с помощью функций print_r() или var_dump().Эти функции действительно полезны для тестирования и отладки.(подсказка: оберните эти вызовы в теги <pre>, чтобы они хорошо отображались в браузере)

Надеюсь, это поможет.

[РЕДАКТИРОВАТЬ: запоздалая мысль]

Кстати, немного не по теме, но я хотел бы отметить, что ваш код указывает, что ваша система может быть не полностью защищена (даже если вы правильно экранируете аргументы запроса).

Aдействительно безопасная система никогда не получит пароль из базы данных.После сохранения пароля его следует использовать только в условии WHERE при входе в систему, а не в запросе.

Типичный запрос будет выглядеть следующим образом:

SELECT count(*) n FROM users WHERE email = '$username' AND password = '$hashedpass'

В этом случае пароль будет храниться в БД как хешированное значение, а не как обычный текст, и предложение WHERE будет сравнивать его с хешированной версией пароля, введенного пользователем.

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

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

0 голосов
/ 04 июля 2011

Вы должны подключиться к базе данных, выполнить запрос, а затем получить результаты.попробуйте этот пример с php.net

<?php
public function confirmUserPass($username, $password){

    $username=pg_escape_string($username);

    // Connecting, selecting database
    $dbconn = pg_connect("host=localhost dbname=publishing user=www password=foo")
        or die('Could not connect: ' . pg_last_error());

    // Performing SQL query
    $query = "SELECT password FROM users WHERE email = '$username'";
    $result = pg_query($query) or die('Query failed: ' . pg_last_error());

    // Printing results in HTML
    echo "<table>\n";
    while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
        echo "\t<tr>\n";
        foreach ($line as $col_value) {
            echo "\t\t<td>$col_value</td>\n";
        }
        echo "\t</tr>\n";
    }
    echo "</table>\n";

    // Free resultset
    pg_free_result($result);

    // Closing connection
    pg_close($dbconn);
    ?>

}
?>

http://php.net/manual/en/book.pgsql.php

...