用PDO抓住行

时间:2012-08-17 12:13:22

标签: php web count pdo rows

我正在尝试查看数据库中的表中是否已有行。如果有一行,那么php将重定向到另一个页面。如果没有一行,它会留在那里。这是我的代码:

$sched_ex = $db->prepare("SELECT COUNT(1) FROM sched WHERE uid = '$uid'");
$sched_ex->execute();

if($sched_ex == 0) { ... } else { redirect }

我是PDO的新手,不知道我需要做些什么才能让它正常工作。

编辑:

$sched_ex = $db->prepare("SELECT COUNT(1) FROM sched WHERE uid = :uid");
$sched_ex->execute(array(':uid' => $uid));

if($sched_ex->fetchColumn() == 0) { a lot of html }
else {
?>
<script langauge="javascript">
    window.location="../"
</script>
<?php
}

Header无法正常工作,所以我使用了JavaScript。不过,我怀疑这是个问题。

2 个答案:

答案 0 :(得分:4)

首先,使用绑定参数来保护自己免受注入攻击:

$sched_ex = $db->prepare("SELECT COUNT(1) FROM sched WHERE uid = :uid");
$sched_ex->execute(array(':uid' => $uid));

其次,关于你的问题:

if($sched_ex->fetchColumn() == 0) { ... } else { redirect }

(参见:http://www.php.net/manual/en/pdostatement.fetchcolumn.php

答案 1 :(得分:2)

您可以使用rowcount函数找出有多少行(如果查询返回任何内容),那么您将需要实际获取数据。

但是在那个说明中,来自文档:

对于大多数数据库,PDOStatement :: rowCount()不返回受SELECT语句影响的行数。相反,使用PDO :: query()发出一个SELECT COUNT(*)语句,其语句与预期的SELECT语句相同,然后使用PDOStatement :: fetchColumn()来检索将返回的行数。然后,您的应用程序可以执行正确的操作。

执行后需要fetch行:

$dbh = new PDO($this->mySQLAccessData->hostname, $this->mySQLAccessData->username, $this->mySQLAccessData->password);
$stmt = $dbh->query($sql);
$stmt->setFetchMode(PDO::FETCH_INTO, new kpiData);
$dataCount=0;
foreach($stmt as $kpiData)
{
    $arrKPIData[$dataCount]['year']=$kpiData->year;
    $arrKPIData[$dataCount]['month']=$kpiData->month;
    $dataCount++;
    unset($stmt);
}