简单的PDO查询适用于dev服务器,但不适用于生产。为什么?

时间:2013-07-26 06:03:32

标签: php pdo

我有以下PDO查询在开发服务器上正常工作但在实时服务器上返回空结果集。

两个服务器上都存在相同的数据库副本,httpd或mysql日志中没有错误消息。也没有任何PDO例外。

<?
class DB {

  public function __construct() {

    global $dbh;

    try {
      $dbh  = new PDO('mysql:host=localhost;dbname=snomweb_main', 'snomdb_user', '6pjOjYpcRpEZFdsu');
      $dbh  ->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    }
    catch(PDOException $e) {
      echo $e->getMessage();
    }
  }

  public function getFAQCats2Array() {

    global $dbh;

    try {
      $q = '
                                SELECT
                                        `id`        AS ci,
                                        `name`      AS n
                                FROM
                                        `faqcat`;
                        ';

      $s = $dbh->query($q);

      // initialise an array for the results
      $A = array();

      if ($s->execute()) {
        while ($r = $s->fetch(PDO::FETCH_ASSOC)) {
          $A[] = $r;
        }
      }
      $s = null;
      return $A;
    }

    catch(PDOException $e) {
      echo  "Something went wrong fetching the list of FAQ categories from the database.\n";
      file_put_contents(
                        $_SERVER['DOCUMENT_ROOT']."/PDOErrors.txt",
                        "\n\n\n\n".$e->__toString(), FILE_APPEND);
    }
  }
}

(文件中还有其他功能,但为了简单起见我删除了它们)

这个方法的调用如下:

<?
require_once '../inc/classes/db.class.php';
$DB = new DB();

$cArr   = $DB->getFAQCats2Array();
$qArr   = $DB->getFAQQuestions2Array();

foreach ($cArr AS $c) { // do this for each group ?>

<h3><?=$c['n']?></h3>

<div>

    <? foreach ($qArr AS $q) { // do this for each question in group

        if ($q['ci'] === $c['ci']) {
    ?>

    <a href="faq-answers.php?i=<?=$q['qi']?>" title=""><?=$q['q']?></a><br>

    <?
        } // end 'if'

    } //  /do this for each question in group
    ?>


</div>

<? } //  /do this for each group ?>

该代码正在构建一个jQuery手风琴,它在开发环境中完成并完美运行,但在实时服务器上,它返回一个空数组,而不是包含9个FAQ类别。

生产服务器在其他网站上使用PDO,并运行MySQL Server版本:5.0.37-standard。

开发服务器正在运行MySQL Server版本:5.5.31-0ubuntu0.12.04.2-log - (Ubuntu)。

排序规则均为utf8_general_ci。两者都使用InnoDB表。

1 个答案:

答案 0 :(得分:1)

当您执行$pdo->query($sql_statement)时,返回值是有效的PDOStatement,您可以直接迭代以获取结果,而不需要执行$s->execute()句。

所以只需删除它:)