2012-08-17 82 views
0

我在查看数据库中的表是否已经有一行。如果有一行,那么PHP将重定向到一个不同的页面。如果没有一排,它会留在那里。这里是我有的代码:用PDO抓取行

$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 
} 

头不工作,所以我使用的JavaScript。不过,我怀疑这是个问题。

+0

:'''标题( “位置:”);''' – Luceos 2012-08-17 13:05:27

+0

一个人叫'退出'在调用'header'之后,它才能正常工作。您是否尝试查看源代码并查看它是通过一个分支还是另一个分支?你确定设置了'$ uid'吗?你确定数据库中的数据是否有你假设的记录数? – troelskn 2012-08-17 13:10:02

+0

我修复了标题问题。我总是忘记退出必须被称为后。 $ uid是从用户会话中设置的。 表中目前只有一行。我试图让这段代码去做的是认识到那里有那一行,因为如果它是那么他们不能在那个页面上,当试图去那里得到重定向。 – 2012-08-17 13:14:08

回答

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

+0

这不适合我。你能想到我可能做错了什么吗? – 2012-08-17 12:25:10

+0

可能是您重定向的方式。你能否显示if-block的完整代码。 – troelskn 2012-08-17 12:48:12

+0

包含在编辑中。 – 2012-08-17 12:55:11

2

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

但是,关于这一点,从文档:

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

您需要fetch在执行后的行:在PHP你可以重定向

$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); 
}