美好的一天,我一直试图找出代码中的问题。我正在使用SQL_CALC_FOUND_ROWS和FOUND_ROWS()来检索我的数据库中的记录总数(使用PDO)。我的问题是FOUND_ROWS()总是返回0。
事情是,我之前已经开始工作,但我在这里和那里做了一些调整,现在它停止了工作。我不能因为我的爱而记住我可以删除的内容,这些内容很重要,似乎无法找到任何使用PDO这些功能的好文档。
到目前为止,我已尝试将其置于不同的循环中,尝试使用不同模式的fetch(),尝试以不同的顺序放置命令(即在while之前和while循环之后等)。我想我在这里错过了一些非常简单的东西,但我现在已经盯着这件事大约1或2个小时了,这让我很生气。
所以这是我的代码:
public function findBerichten($args)
{
//$offset zorg ervoor dat pagina 1 als record 0 in de database zoekt
$offset = ($args['huidigePagina'] - 1) * $args['itemsPerPagina'];
$sth = $this->db->DBH()->prepare("SELECT SQL_CALC_FOUND_ROWS
berichten.berichtID,
berichten.bericht,
berichten.naam,
berichten.mail
FROM `berichten`
ORDER BY berichten.datumToegevoegd DESC
LIMIT ?, ?");
$sth->bindParam(1, $offset, PDO::PARAM_INT);
$sth->bindParam(2, $args['itemsPerPagina'], PDO::PARAM_INT);
$sth->execute();
$sth->setFetchMode(PDO::FETCH_ASSOC);
$berichten = array();
while($row = $sth->fetch())
{
$bericht = new Bericht();
$bericht->setBerichtID(htmlentities(strip_tags($row['berichtID'])));
$bericht->setBericht(htmlentities(strip_tags($row['bericht'])));
$bericht->setNaam(htmlentities(strip_tags($row['naam'])));
$bericht->setMail(htmlentities(strip_tags($row['mail'])));
$berichten[] = $bericht;
}
$sth = $this->db->DBH()->prepare("SELECT FOUND_ROWS() as aantalBerichten");
$sth->execute();
$sth->setFetchMode(PDO::FETCH_ASSOC);
$this->aantalBerichten = $sth->fetch();
var_dump($this->aantalBerichten);
return $berichten;
}
的index.php
if($huidigePagina < 1)
{
//$huidigePagina is 1
$huidigePagina = 1;
}
//Als de huidige pagina groter is als het totaal aantal pagina's
if($huidigePagina > $totaalPaginas)
{
//$huidigePagina is gelijk aan het totaal aantal pagina's
$huidigePagina = $totaalPaginas;
}
$berichtDAO->findBerichten(array('huidigePagina'=>$huidigePagina, 'itemsPerPagina'=>10))
输出var_dump:array(1) { ["aantalBerichten"]=> string(1) "0" }
如果您有任何想法让我知道,因为我现在愿意尝试任何事情:) 这是希望这个问题不是太棒了!正如我所说,我认为我在这里很容易丢失一些东西。
修改
execute()函数是正确的等,当在if()语句中使用时,它仍然继续执行代码
也;我90%肯定这与代码的FOUND_ROWS()部分有关。
编辑2,包括db class和Bericht()类
Bericht班:
<?php
Class Bericht
{
private $db;
private $berichtID;
private $bericht;
private $naam;
private $mail;
public function __construct(Db $db)
{
$this->db = $db;
}
public function setBerichtID($berichtID)
{
$this->berichtID = $berichtID;
}
public function getBerichtID()
{
return $this->berichtID;
}
public function setBericht($bericht)
{
$this->bericht = $bericht;
}
public function getBericht()
{
return $this->bericht;
}
public function setNaam($naam)
{
$this->naam = $naam;
}
public function getNaam()
{
return $this->naam;
}
public function setMail($mail)
{
$this->mail = $mail;
}
public function getMail()
{
return $this->mail;
}
}
db class:
<?php
class Db
{
//bij het laden van Db
public function __construct()
{
//voer functie connect() uit
$this->connect();
}
//functie voor het verbinding maken met en het selecteren van een database
private function connect()
{
//$connection is connectie naar mysql database (met de opgegeven inlog waardes)
$connection = mysql_connect('localhost', 'user', 'pw');
//als er geen connectie gemaakt kan worden
if(!$connection)
{
//die (voer overige code niet meer uit) en echo string + de mysql error
die("Kan geen verbinding maken: " . mysql_error());
}
//selecteert de opgegeven database met de connectie ($connection)
mysql_select_db("db", $connection);
}
public function DBH()
{
try
{
$DBH = new PDO('mysql:host=localhost;dbname=db', 'user', 'pw');
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $DBH;
}
catch (PDOException $except)
{
echo $except->getMessage();
}
}
//function to retrieve records -- not important
public function getRecords($sth)
{
$rows = array();
if($sth->execute() == true)
{
$sth->setFetchMode(PDO::FETCH_OBJ);
while($row = $sth->fetch())
{
$rows[] = $row;
}
return $rows;
}
else
{
return false;
}
}
}
答案 0 :(得分:3)
不完全确定数据库类中发生了什么,所以对这个答案做了一些假设。
我认为这个 在你机器的一个阶段工作的代码类似,所以trace_mode不是答案。
我假设
$this->db->DBH()
是一个函数,它将在数据库查询中使用新的数据库处理程序。
第二次调用DBH的prepare函数时,它正在创建一个新的数据库处理程序,它不会先存储来自其他DBH调用的信息。
修复就是做
之类的事情$dbh = $this->db->DBH();
在函数的早期,然后用
替换prepare调用$dbh->prepare("(SQL)");
编辑:看起来至少我的DB-&gt; DBH()假设是正确的!
答案 1 :(得分:2)
您是否尝试在PHP中设置MySQL跟踪模式?
在PHP 5.2.6中,默认为On,可能会导致FOUND_ROWS()
您可以使用以下三种方法之一来完成此操作:
<强>的php.ini:强>
mysql.trace_mode = 0
<强> PHP:强>
ini_set("mysql.trace_mode", "0");
<强> htaccess的:强>
php_value mysql.trace_mode "0"
<强>可替换地:强>
我不确定SQL_CALC_FOUND_ROWS
是否正在传递给第二个PDO会话。您是否尝试将它们组合成一个查询并检索多个记录集?这很容易做到
答案 2 :(得分:-1)
您在SQL
中缺少SQL_CALC_FOUND_ROWS背后的逗号