我在网上找到了这个标准类别和子类别输出递归函数:
function print_categ_list_product_page($parent = 0) {
global $mysqli;
$qry = "SELECT * FROM ami_categories WHERE ct_parent = '$parent'";
$sqlResult = $mysqli->query($qry);
if ($sqlResult->num_rows > 0) {
while ($row = $sqlResult->fetch_assoc()) {
echo'<ul style="padding-right: 10px;">';
echo'<li class="menu_list_1" ><a href="products/?ct=' . $row['ct_id'] . '">' . $row['ct_name'] . '</a>';
print_categ_list_product_page($row['ct_id']);
echo'</li>';
echo'</ul>';
}
}
}
绝不是我在php上不专业。所以最近我开始使用这个名为Prepared Statement的方法来调用查询,因为这样我可以避免SQL注入。一切都很好,除了我无法弄清楚以递归的方式进行这项工作。
function print_categories_2_0($parent = 0) {
global $mysqli;
$stmt = $mysqli->prepare("SELECT ct_id, ct_name FROM ami_categories WHERE ct_parent = ?");
$stmt->bind_param('s', $parent);
$stmt->execute();
$stmt->bind_result($id, $name);
while(mysqli_stmt_fetch($stmt)){ //fetch rows
echo'<ul style="padding-right: 10px;">';
echo'<li class="menu_list_1" ><a href="products/?ct=' . $id . '">' . $name . '</a>';
print_categories_2_0($id);
echo'</li>';
echo'</ul>';
}
$stmt->close();
}
这只是输出任何东西。经过一些研究后,我发现它不可能有递归的Prepared Statement函数,只是因为在准备新函数之前必须关闭连接。
所以我的问题是,有人可以帮我提出用预备语句输出这个类别/子类别列表的替代方法,而不使用递归函数。我在想:是否可以在SQL语句中使用INNER JOIN做类似的事情?
谢谢!
答案 0 :(得分:2)
首先,请不要使用global
。其次,准备好的陈述的真正力量在于不必一遍又一遍地准备陈述。所以你应该从mysqli_stmt
传递prepare()
对象作为参数。这样你就可以准备一次并反复执行。您也可能想要告诉它您期望整数i
而不是字符串s
$stmt = $mysqli->prepare("SELECT ct_id, ct_name FROM ami_categories WHERE ct_parent = ?");
print_categories_2_0($stmt); // Start the initial call
function print_categories_2_0(mysqli_stmt $stmt, $parent = 0) {
$stmt->reset();
$stmt->bind_param('i', $parent);
$stmt->execute();
$stmt->bind_result($id, $name);
$data = array();
// pull all the records out of the statement
while($stmt->fetch()) $data[] = array('id' => $id, 'name' => $name);
foreach($data as $row) { //fetch rows
echo'<ul style="padding-right: 10px;">';
echo'<li class="menu_list_1" ><a href="products/?ct=' . $row['id'] . '">' . $data['name'] . '</a>';
print_categories_2_0($stmt, $row['id']);
echo'</li>';
echo'</ul>';
}
}