我正在使用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,但我在浏览器上看不到任何东西。我也尝试从浏览器中查看视图源,但它没有显示任何内容。 有人可以帮我吗?
此致
答案 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);
?>
}
?>