Как вложить 2 оператора SQL с циклом foreach друг в друга - PullRequest
0 голосов
/ 24 января 2019

Хорошо, я пытаюсь с первым запросом получить все имена компьютеров из таблицы psComputers. Теперь мне нужно во втором запросе переменную из первого запроса перебрать все записи, которые назначены соответствующему компьютеру в таблице psTest. Интересно, возможно ли вообще такое?

Таблица psComputer содержит ID, name
Таблица psTest содержит ID, computername, category, value

index.php

$statement = $pdo->prepare("SELECT * FROM psComputers ");
$statement->execute();
$result = $statement->fetchAll();
if ($statement->rowCount() > 0) {
    foreach ($statement->fetchAll() as $row) {
        $id = $row['ID'];
        $name = $row['name'];

        $statement2 = $pdo->prepare("SELECT * FROM psTest WHERE computerName = $name");
        $statement2->execute();
        $result2 = $statement2->fetchAll();
        if ($statement2->rowCount() > 0) {
            foreach ($statement2->fetchAll() as $row2) {
                $id2 = $row2['ID'];
                $computerName = $row2['computerName'];
                $category = $row2['category'];
                $value = $row2['value'];
            }
        }
    }
} 

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вам нужны кавычки около $name во втором запросе, так как это строка.

$statement2 = $pdo->prepare("SELECT * FROM psTest WHERE computerName = '$name'");

Но так как вы используете подготовленный запрос, вы должны использовать параметр вместо замены переменной.

Вы также не должны звонить $statement->fetchAll() дважды. Первый вызов прочитает все строки, а второму не останется ничего прочитать (он не сбрасывает курсор).

$statement = $pdo->prepare("SELECT * FROM psComputers ");
$statement->execute();
$result = $statement->fetchAll();
if (count($result) > 0) {
    $statement2 = $pdo->prepare("SELECT * FROM psTest WHERE computerName = :name");
    $statement2->bindParam(':name', $name);
    foreach ($result as $row) {
        $id = $row['ID'];
        $name = $row['name'];
        $statement2->execute();
        $result2 = $statement2->fetchAll();
        if (count($result2) > 0) {
            foreach ($result2 as $row2) {
                $id2 = $row2['ID'];
                $computerName = $row2['computerName'];
                $category = $row2['category'];
                $value = $row2['value'];
            }
        }
    }
} 

Но еще лучше объединить два запроса:

$statement = $pdo->prepare("
    SELECT c.id AS computerID, c.name AS computerName, t.id AS testID, t.category, t.value
    FROM psComputers AS c
    JOIN psTest AS t ON c.name = t.computerName
    ORDER BY c.id");
0 голосов
/ 24 января 2019

Несколько замечаний:

  1. При использовании строк в запросах они должны быть заключены в кавычки.
  2. Вы уже готовите оператор - вместо этого свяжите значение и примечаниевыше становится неактуальным.
  3. Вы можете использовать JOIN вместо выполнения запроса в цикле.Это также удалит переменную в названии, делая обе заметки выше неактуальными!(Вы должны принять к сведению оба, но они становятся неактуальными для рассматриваемого кода).

Редко рекомендуется запускать запрос в цикле.

$statement = $pdo->prepare("SELECT pt.* 
                            FROM psTest pt 
                            JOIN psComputers pc ON pt.computerName=pc.name");
$statement->execute();
$result = $statement->fetchAll();
if (count($result)) {
    foreach ($result as $row) {
        $id2 = $row['ID'];
        $computerName = $row['computerName'];
        $category = $row['category'];
        $value = $row['value'];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...