postgres中的num_rows总是返回1

时间:2014-05-15 21:12:08

标签: sql postgresql

我试图用Postgres做SELECT COUNT(*)

我需要的是:抓住受查询影响的行。这是一个学校系统。如果学生没有注册,请做一些事情(如果)。

我尝试了什么:

$query = pg_query("SELECT COUNT(*) FROM inscritossimulado
            WHERE codigo_da_escola = '".$CodEscola."'
            AND codigo_do_simulado = '".$simulado."'
            AND codigo_do_aluno = '".$aluno."'");

if(pg_num_rows($query) == 0)
{
    echo "Error you're not registered!";
}
else
{
    echo "Hello!";
}

注意:相关学生未注册,但结果始终为1而非0。

出于某种原因,当我"显示"查询,结果是:"资源ID#21"。但是,我在表中看了很多次,用户不在那里。

2 个答案:

答案 0 :(得分:3)

实际上,根本不计算。你不需要计数。只需检查是否存在,证明单行符合条件:

$query = pg_query(
  'SELECT 1
   FROM   inscritossimulado
   WHERE  codigo_da_escola = $$' . $CodEscola . '$$
   AND    codigo_do_simulado = $$' . $simulado. '$$
   AND    codigo_do_aluno = $$' . $aluno . '$$
   LIMIT  1');

如果找到则返回 1行,否则无行。 在SQL代码中使用dollar-quoting,因此我们可以在PHP中使用更安全,更快速的单引号(我猜)。

aggregate function count()的问题(除了更贵)是总是返回一行 - 如果没有行符合条件,则值为0

仍然很臭。不要使用字符串连接,这是 SQL注入的开放式邀请。而是使用准备好的陈述......查看PDO ...

答案 1 :(得分:2)

您正在计算答案中的行数,并且您的查询始终返回一行。

您的查询说:返回一行,给出符合我条件的学生人数。如果没有人匹配,您将返回值为0的行。如果您有7个人匹配,则会返回一行,其值为7

如果您将查询更改为select * from ...,您将从pg_num_rows()获得正确答案。