我目前正在更新我的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> </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;
}
?>
答案 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"> </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中打开/关闭连接。 这是你想要做的吗?