我试图用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"。但是,我在表中看了很多次,用户不在那里。
答案 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()
获得正确答案。