Слишком много подключений; дБ подключить в функции - PullRequest
0 голосов
/ 10 февраля 2012

В настоящее время я обновляю свои знания PHP и натолкнулся на проблему при получении данных из моей базы данных.

Проблема, которая у меня есть, сама по себе может быть решена с помощью параметра max_connection (да, яискал вокруг), но я считаю, что это может быть обходной путь, так как я не хочу менять базовые настройки, если это не нужно.

У меня есть три "шага" в моей маленькой "лестнице"«;Моя главная задача - это лестница, каждая лестница имеет один (или более) шаг, а каждый шаг имеет один (или несколько) модулей.

Итак, я пытаюсь сделать функцию, которая извлекает все это и показываетих.Теперь каждая функция имеет связь с моей базой данных;где функция выполняет свой запрос и затем закрывается.Первым делом я решил закрыть базу данных между каждой функцией, что я и сделал, но поскольку я получаю свой код «все сразу», это не работает (см. Код).

Как мне поступитьо создании одного соединения с базой данных (возможно, в функции) и вызове его один раз, а затем извлечении всей информации без открытия новых соединений?

Я надеюсь, что у вас есть вся информация, необходимая для ответа на мои вопросы, и я надеюсь, что явыкладываю это способом переполнения стека.

Заранее спасибо.

PS: Не знаю, правильно ли я использовал этот инструмент кода, он выглядит структурированным, но у него нет бликов?

КОД:

    <?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 ]

1 голос
/ 10 февраля 2012

Вам нужно только один раз подключиться к базе данных и передать ее в качестве аргумента, например:

<?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();
0 голосов
/ 10 февраля 2012

Я бы сказал ... передайте переменную $ db, полученную в displayResult, в displayAssociateStep в качестве добавленного параметра. Тогда вам больше не нужно открывать / закрывать соединение в displayAssociatesStep. Это то, что вы хотите сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...