PHP Prepared语句(递归函数),你可以解决这个问题吗?

时间:2016-07-30 13:52:41

标签: php mysql recursion

我在网上找到了这个标准类别和子类别输出递归函数:

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做类似的事情?

谢谢!

1 个答案:

答案 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>';
    }
}