php / postgres - 查询输出无法在浏览器上打印

时间:2011-07-04 19:08:23

标签: php postgresql printf echo

我正在使用postgresql在Php中编写一个简单的用户/登录系统。

我有一个函数可以确认用户名/密码是否存在,当用户按下“登录”按钮时会激活该用户名/密码。

 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 */
}

我想打印存储在$ results中的查询,以便我可以在浏览器中看到它。当我使用SQL在phppgAdmin中执行它时,它向我显示输出但我无法在浏览器上看到它。我试过echo和printf,但我在浏览器上看不到任何东西。我也尝试从浏览器中查看视图源,但它没有显示任何内容。 有人可以帮我吗?

此致

2 个答案:

答案 0 :(得分:1)

从您的代码:$result = pg_query($this->link,$q);

正如您已经发现的那样,尝试从上面的行显示$result的内容不会给您带来任何有用的信息。这是因为它不包含查询返回的数据;它只包含一个“资源句柄”。

为了获得实际数据,您必须在pg_query()之后调用第二个函数。您需要的功能是pg_fetch_array()

pg_fetch_array()获取您在$result中提供的资源句柄,并询问其下一组数据。

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>标记中,以便它们在浏览器中很好地显示)

希望有所帮助。

[编辑:经过深思熟虑]

顺便说一下,稍微偏离主题,但我想指出你的代码表明你的系统可能不完全安全(即使你正确地转义了查询参数)。

真正安全的系统永远不会从数据库中获取密码。一旦存储了密码,它只应在登录时用于WHERE子句,而不是在查询中提取。

典型的查询如下所示:

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

在这种情况下,密码将作为散列值而不是纯文本存储在DB中,WHERE子句会将其与用户输入的密码的散列版本进行比较。

这个想法是,这使我们可以避免在系统中的任何位置以纯文本形式访问密码,这样可以降低黑客攻击的风险,即使有人设法访问数据库也是如此。

当然,这并非万无一失,当涉及到这种安全性时,它肯定不是全部,但它肯定会比你现在的方式更好。

答案 1 :(得分:0)

您必须连接到数据库,执行查询,然后获取结果 从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