Как перевести двойной цикл запроса в PDO? - PullRequest
0 голосов
/ 17 июня 2019

Мне нужно использовать PDO вместо mysqli. С одним запросом все просто, к сожалению я не справился с двойным циклом. Буду признателен за любую помощь.

Я пробовал что-то подобное, но это не работает:

try
{
    $sql = "SELECT * FROM table_1";     
    $stmt = $this->conn->prepare($sql);
    $stmt->execute();
    while($row = $stmt->fetch())
    {
        $id_1 = $row[0];
        $name = $row[1];
        print '<div><h2>'.$name.'</h2><ul id="'.$id.'">';
        $sql2 = "SELECT * FROM table_2 WHERE id=$id_1";
        $stmt = $this->conn->prepare($sql2);
        $stmt->execute();    
        while($row2 = $stmt->fetch())
        {
            $id_2 = $row2[0];
            $title = $row2[1];
            print '<li id="'.$id_2.'" ><h3>'.$title.'</h3></li>';
        }
        print '</ul>';
        print '</div>';
    }
    $stmt->closeCursor();
    print '</div>';
}
catch (\PDOException $e) {
    $result['status'] = false;
    $result['message'] = "Error: " . $e->getMessage();
    return $result;
}

Оригинальный код:

$sql = "SELECT * FROM table_1"; 
$result = mysqli_query($connect, $sql) or die(mysqli_error($connect));
if (mysqli_num_rows($result)){
    while($row = mysqli_fetch_row($result)) { 
        $id_1 = $row[0];
        $name = $row[1];
        print '<div><h2>'.$name.'</h2><ul id="'.$id.'">';
        $sql2 = "SELECT * FROM table_2 WHERE id=$id_1";
        $result2 = mysqli_query($connect, $sql2) or die(mysqli_error($connect));
        if (mysqli_num_rows($result2)){
            while($row2 = mysqli_fetch_row($result2)) { 
                $id_2 = $row2[0];
                $title = $row2[1];
                print '<li id="'.$id_2.'" ><h3>'.$title.'</h3></li>';
            }
        }
        print '</ul>';
        print '</div>';
    }
}

1 Ответ

1 голос
/ 17 июня 2019

Вам нужно использовать другую переменную для оператора внутри цикла. Вы также должны использовать параметризованный запрос, а не подставлять переменную. Вы можете подготовить этот оператор один раз, а затем выполнить его в цикле.

try
{
    $sql = "SELECT * FROM table_1";     
    $stmt = $this->conn->prepare($sql);
    $stmt->execute();
    $sql2 = "SELECT * FROM table_2 WHERE id = :id";
    $stmt2 = $this->conn->prepare($sql2);
    $stmt2->bindParam(':id', $id_1);
    while($row = $stmt->fetch())
    {
        $id_1 = $row[0];
        $name = $row[1];
        print '<div><h2>'.$name.'</h2><ul id="'.$id.'">';
        $stmt2->execute();   
        while($row2 = $stmt2->fetch())
        {
            $id_2 = $row2[0];
            $title = $row2[1];
            print '<li id="'.$id_2.'" ><h3>'.$title.'</h3></li>';
        }
        print '</ul>';
        print '</div>';
    }
    $stmt->closeCursor();
    print '</div>';
}
catch (\PDOException $e) {
    $result['status'] = false;
    $result['message'] = "Error: " . $e->getMessage();
    return $result;
}

Однако, как правило, лучше выполнять один запрос, объединяющий две таблицы, а не выполнять запросы в цикле.

try
{
    $sql = "SELECT t1.id AS id_1, t1.name, t2.id2 AS id_2, t2.title
            FROM table_1 AS t1
            LEFT JOIN table_2 AS t2 ON t1.id = t2.id
            ORDER BY id_1";
    $stmt = $this->conn->prepare($sql);
    $stmt->execute();
    $last_id1 = null;
    while($row = $stmt->fetch(PDO::FETCH_ASSOC))
    {
        $id_1 = $row['id_1'];
        if ($id_1 !== $last_id1) {
            $name = $row['name'];
            if ($last_id1 !== null) {
                print '</ul></div>';
            }
            print '<div><h2>'.$name.'</h2><ul id="'.$id.'">';
        }
        $id_2 = $row2['id_2'];
        $title = $row2['title'];
        if ($id_2 !== null) {
            print '<li id="'.$id_2.'" ><h3>'.$title.'</h3></li>';
        }
    }
    if ($last_id1) {
        print '</ul></div>';
    }
    $stmt->closeCursor();
    print '</div>';
}
catch (\PDOException $e) {
    $result['status'] = false;
    $result['message'] = "Error: " . $e->getMessage();
    return $result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...