Php 联系太多;函数中的db connect
我目前正在更新我的PHP知识,在从数据库中获取数据时遇到了一个问题 我自己的问题可能是通过max_连接设置来解决的(是的,我已经搜索过了),但我相信这可能是一个解决办法,因为如果不需要的话,我不想更改基本设置 我的小“梯子”上有三个“台阶”; 我的主要是一个梯子,每个梯子有一个(或多个)台阶,每个台阶有一个(或多个)模块 所以我要做的是一个函数,它检索所有这些并显示它们。现在,每个函数都连接到我的数据库;函数运行其查询,然后关闭。我的第一条线索是关闭每个函数之间的数据库,我做到了——但由于我“一次”检索我的代码,这不起作用(请参阅代码) 我如何建立一个数据库连接(可能在函数中)并调用一次,然后检索所有信息,而不打开新的连接 我希望你有回答我的问题所需的所有信息,我希望我以堆栈溢出的方式发布这些信息 先谢谢你 附言:不知道如果我正确使用这个代码工具,它看起来是结构化的,但没有突出显示 代码:Php 联系太多;函数中的db connect,php,html,mysqli,Php,Html,Mysqli,我目前正在更新我的PHP知识,在从数据库中获取数据时遇到了一个问题 我自己的问题可能是通过max_连接设置来解决的(是的,我已经搜索过了),但我相信这可能是一个解决办法,因为如果不需要的话,我不想更改基本设置 我的小“梯子”上有三个“台阶”; 我的主要是一个梯子,每个梯子有一个(或多个)台阶,每个台阶有一个(或多个)模块 所以我要做的是一个函数,它检索所有这些并显示它们。现在,每个函数都连接到我的数据库;函数运行其查询,然后关闭。我的第一条线索是关闭每个函数之间的数据库,我做到了——但由于我“一
只需连接数据库一次,并将其作为参数传递,如下所示:
<?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();
我想说。。。将displayResult中的$db变量作为添加的参数传递给DisplayAssociateTestEP。这样,您就不再需要在DisplayAssociateStep中打开/关闭连接。
这是您想要做的吗?在使用函数之前创建$db对象怎么样?您创建它,将其作为参数传递给函数(或使其成为全局的,以便它们可以访问),使用函数,然后关闭它?这样,你只有一个到数据库的连接。这就解决了它!此外,还有更好、更简洁的代码和跨距。谢谢!:)不用担心——尽管我刚刚意识到它产生的HTML并不完全正确。我认为您需要添加$r.=''代码>在$r.=displayAssociateStep($db,$row->ladderID)之后代码>否则,将有大量未关闭的表行。大多数浏览器都会自动纠正这个问题,但如果你不解决它,你可能会发现你得到了意想不到的结果。您还需要将colspan=“4”
添加到最后一行的
。我已经用更正编辑了我的代码。另一个小修正-实际上您只生成了3列,而不是4列-如果您想看到表结构中的任何错误,请将style=“border:1px solid\000000”
添加到
中。请记住,确保每一行中的单元格数量相等,并正确关闭所有单元格,否则可能无法正确显示。谢谢各位。我甚至在我的问题上得到奖励。明亮的
<?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();