PHP登录脚本始终返回“0”;“登录失败”;

PHP登录脚本始终返回“0”;“登录失败”;,php,postgresql,login,pdo,Php,Postgresql,Login,Pdo,我必须让用户能够登录作业。起初,我觉得这个脚本很简单,可以正常工作,但每次我尝试使用现有帐户登录时,都会显示“登录失败”消息。我不知道我的错误在哪里。这是一个PostgreSQL数据库,我将在下面附上它的图片 <?php require 'databaseaccess.php'; try { $conn = new PDO('pgsql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USERNAME,DB_PASSWORD); } catch (

我必须让用户能够登录作业。起初,我觉得这个脚本很简单,可以正常工作,但每次我尝试使用现有帐户登录时,都会显示“登录失败”消息。我不知道我的错误在哪里。这是一个PostgreSQL数据库,我将在下面附上它的图片

<?php

require 'databaseaccess.php';
try {
$conn = new PDO('pgsql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USERNAME,DB_PASSWORD);
} catch (PDOException $e) {
print "Error: " . $e->getMessage() . "\n";
phpinfo();
die();
}

$username = $_POST['username'];
$password = $_POST['password'];
$tablename = "users";

// sql-injection counter
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);

$qry = $conn->prepare("SELECT * FROM $tablename WHERE userid = :username and userpass = :password");
$qry->bindParam(':username', $username, PDO::PARAM_STR, 16);
$qry->bindParam(':password', $password, PDO::PARAM_STR, 16);
$qry->execute();
$result = pg_query($qry);
$count = pg_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row

if ($count == 1) {

    $_SESSION['loggedin'] = true;
    $_SESSION['username'] = $username;
    header("location:logingelukt.php");
} elseif ($count = -1) {
    echo "there has been an error";
} else{
    print $count;
    echo "login failed";
}
?>

我连接到数据库没有问题,所以这不是问题,只是它总是将
$count
视为非零。另一个奇怪之处是,
print$count
命令没有输出任何内容。我在页面之外使用我用postgresql创建的帐户,它只是
admin:admin
。另外,我确信表单传递了正确的变量


编辑:在使用var_dump($result)之后,正如kingalligator建议的那样,$result似乎确实是空的,因此是空的。我将尝试使用fetch()而不是pg_query()。

您是否确认您正在从查询返回数据?试试这个:

var_dump($result);

以确保从查询中返回数据。您仍然可以成功地连接到数据库,但查询却不返回任何结果。

您可能应该在WHERE子句中检查您的列userid。我不知道表列,但奇怪的是“userid”中有用户的名称:

"SELECT * FROM $tablename WHERE userid = :username and userpass = :password"

可能是它导致了问题。

我认为问题在于您混合了PDO和pg_uu函数

替换:

$result = pg_query($qry);
$count = pg_num_rows($result);
与:


PDO函数引用可以在这里找到:

注意
elseif($count=-1)
是一个赋值。这是一种比较吗?另外,
stripslashes
mysql\u real\u escape\u string
也不需要,因为它们是参数化的。但这并没有改变任何事情。我也试过对sql保护进行注释,但也没有用。@Caramiriel将其作为您指出主要问题的答案发布mistake@dianuj当前位置这不是主要错误,因此它不是真正的答案。我怀疑混合使用PDO和PG_*是这里的问题,但我没有足够的PHP经验来证实这一点。我认为在查询中使用
count()
和使用
$qry->fetch()
将是这里使用的选项。如果您使用PDO绑定进行查询,则不需要使用mysql\u real\u escape\u字符串。PDO在保护你方面会比你自己做的更好。我知道这不会解决你的问题,只是很高兴知道我是这样做的。不,我是这样做的,回想起来,它应该是用户名,所以我可能会更改列名,但这也不是问题。
rowCount()
这里似乎不是这样。它表示insert/delete/update查询中受影响的行。@Caramiriel。。。哎呀。。。我知道。。。fixedAlso,count显示数组中的项数(表示一行的列)。我认为
$result->fetch(PDO::fetch_NUM)count()
的code>。能否确认?
fetchAll()
将以数组的形式返回所有行,而不是一行
count()
将给出正确的计数…现在我要试试,我不知道你不能混合它们。
$result = $qry->fetchAll();
$count  = count($result);