太多联系; db连接函数

时间:2012-02-10 16:21:28

标签: php html mysqli

我目前正在更新我的PHP知识,我在从数据库中抓取数据时偶然发现了一个问题。

我本身可能遇到的问题可能是使用max_connection设置进行排序(是的,我已经搜索过了),但我相信它可能是一种解决办法,因为我不想更改基本设置,如果不是那么需要。

我的小“阶梯”中有三个“步骤”; 我的主要是梯子,每个梯子都有一个(或多个)步骤,每个步骤都有一个(或多个)模块。

所以我要做的是一个检索所有这些并显示它们的函数。现在,每个函数都与我的数据库建立了连接;函数运行其查询然后关闭的位置。我的第一个线索是关闭每个函数之间的数据库,我做了 - 但是因为我“一次性”检索我的代码,所以这不起作用(参见代码)。

我如何进行一次数据库连接(可能在函数中)并调用一次,然后检索所有信息,而不打开新连接?

我希望你能回答我的问题所需的所有信息,我希望我能以堆栈溢出的方式发布这个信息。

提前谢谢。

P.S:Dunno如果我使用这个代码工具,它看起来很结构,但它没有亮点?

CODE:

    <?php

    echo displayResult();

    function displayResult() {

        $db = new mysqli ('localhost', 'website', 'dog', 'nplus');
        $sql = 'SELECT * FROM ladders';
        $result = $db->query($sql);

        $r = '';

        $r .= '<table>';

        while ($row = $result->fetch_object()) {

            $r .= '<tr>'; 
            $r .= '<td>' . htmlspecialchars($row->ladderID) . '</td>';


    $r .= '<td>' . htmlspecialchars($row->ladderName) . '</td>';
        $r .= '<td>' . htmlspecialchars($row->created) . '</td>';
        $r .= displayAssociateStep($row->ladderID);
        $r .= '<tr><td>&nbsp</td></tr>';

    }

    $r .= '</table>';

    $db->close();

    return $r;
}

function displayAssociateStep($ladderID) {

    $r = '';

    $db = new mysqli ('localhost', 'website', 'dog', 'nplus');
    $sql = 'SELECT * FROM steps WHERE ladderID = '. $ladderID ;
    $result = $db->query($sql);

    $r = '';

    while ($row = $result->fetch_object()) {

        $r .= '<tr>';
        $r .= '<td></td>'; 
        $r .= '<td></td>';
        $r .= '<td>' . htmlspecialchars($row->stepName) . '</td>';
        $r .= '<td>' . htmlspecialchars($row->created) . '</td>';
        $r .= '</tr>';

    }

    $db->close();

    return $r;

}



?>

2 个答案:

答案 0 :(得分:1)

您只需连接一次数据库,并将其作为参数传递,如下所示:

<?php

  function displayResult($db) {

    $sql = "
      SELECT *
      FROM ladders
    ";
    $result = $db->query($sql);

    // ADD ERROR CHECKING HERE
    // What happens if the query fails?

    $r = '<table>';
    while ($row = $result->fetch_object()) {
      $r .= '<tr>'; 
      $r .= '<td>' . htmlspecialchars($row->ladderID) . '</td>';
      $r .= '<td>' . htmlspecialchars($row->ladderName) . '</td>';
      $r .= '<td>' . htmlspecialchars($row->created) . '</td>';
      $r .= '</tr>';
      $r .= displayAssociateStep($db, $row->ladderID);
      $r .= '<tr><td colspan="3">&nbsp;</td></tr>';
    }
    $r .= '</table>';

    return $r;

  }

  function displayAssociateStep($db, $ladderID) {

    // Are you 100% certain $ladderID is always safe to use in a query?
    // Does it need escaping?
    $sql = "
      SELECT *
      FROM steps
      WHERE ladderID = $ladderID
    ";
    $result = $db->query($sql);

    // ADD ERROR CHECKING HERE
    // What happens if the query fails?

    $r = '';

    while ($row = $result->fetch_object()) {
      $r .= '<tr>';
      $r .= '<td></td>'; 
      $r .= '<td>' . htmlspecialchars($row->stepName) . '</td>';
      $r .= '<td>' . htmlspecialchars($row->created) . '</td>';
      $r .= '</tr>';
    }

    return $r;

  }

  // Connect once
  $db = new mysqli ('localhost', 'website', 'dog', 'nplus');

  // Pass the connection in as an argument      
  echo displayResult($db);

  // Close the connection
  $db->close();

答案 1 :(得分:0)

我想说...将你在displayResult中获得的$ db变量传递给displayAssociateStep,作为一个附加参数。然后您不再需要在displayAssociatesStep中打开/关闭连接。 这是你想要做的吗?