Пропустить foreach l oop, когда ответ пуст, используя запросы PDO в php - PullRequest
0 голосов
/ 29 апреля 2020

Мне нужно получить доступ к БД, чтобы хранить информацию, полученную из запроса, в виде массива, и получить sh больше данных, полученных из внешних источников, чтобы, наконец, сохранить обновленный массив с помощью API. Суть моего запроса заключается в идентификаторе каждого клиента, который ранее был получен из API, с использованием идентификатора, который я запускаю, чтобы узнать, есть ли информация в БД, однако не у каждого клиента есть данные, хранящиеся в БД, и с тех пор Я, к сожалению, работаю непосредственно над производством, боюсь проверить, что произойдет, если я попытаюсь набрать sh пустой $newData из-за боязни испортить (поэтому я не использую array_push() в Тестовый код, который я опубликую ниже, но var_dump($newData). Я пробовал несколько вещей, чтобы пропустить l oop, когда это так, и в настоящее время я использую другой var_dump($msg) для тестирования, но я не могу чтобы установить правильные условия, чтобы сообщение никогда не появлялось.

Это мой запрос и код, который обновляет вышеупомянутый массив:

$stmt = $conn->prepare('SELECT a.`zone`, b.`source_customer_billing_zone_id`, b.`source_external_subscriber_id`, SUM((CEIL(b.`duration`))/60) AS minutos, SUM((b.`source_customer_cost`)/100) AS total 
                                FROM `billing`.billing_zones a INNER JOIN cdr b 
                                ON a.`id` = b.`source_customer_billing_zone_id` 
                                WHERE source_external_subscriber_id = :source_external_subscriber_id
                                GROUP BY b.`source_external_subscriber_id`, a.`zone` 
                                ORDER BY  total desc');
        $stmt->execute(array('source_external_subscriber_id' => $source_external_subscriber_id));


        foreach ($stmt as $row) {

            $newData = [
                'name' => $row['zone'],
                'sku' => $row['source_customer_billing_zone_id'],
                'units' => $row['minutos'],
                'subtotal' => $row['total'],
                'tax' => 21,
                'account' => $account
            ];

            array_push($invoice['products'], $newData);
}

$invoice - это массив, который я создаю из API, к которому я должен прикрепить информацию о БД. Всякий раз, когда $source_external_subscriber_id имеет записи в БД, он прекрасно работает, но если идентификатор отсутствует, я не знаю, как пропустить l oop для этого идентификатора. . * 1 012 *

В данный момент я попробовал несколько вещей, но ни одна из них не работает, так как $msg никогда не отображается:

/* 1 */
foreach ($stmt as $row) {
    if (!empty($row) && $row != "") {

        $newData = [
            'name' => $row['zone'],
            'sku' => $row['source_customer_billing_zone_id'],
            'units' => $row['minutos'],
            'subtotal' => $row['total'],
            'tax' => 21
        ];

        var_dump($newData);

    }else{

        $msg = "There are no entries";
        var_dump($msg);
    }

}



/* 2 */
if (!empty($stmt)) {

    foreach ($stmt as $row) {


        $newData = [
            'name' => $row['zone'],
            'sku' => $row['source_customer_billing_zone_id'],
            'units' => $row['minutos'],
            'subtotal' => $row['total'],
            'tax' => 21
        ];

        var_dump($newData);
    }
}else{
    $msg = "There are no entries";
    var_dump($msg);
}



/* 3 */
if (!is_array($stmt)) {

    $msg = "There are no entries";
    var_dump($msg); 

}else{
    foreach ($stmt as $row) {
        $newData = [
            'name' => $row['zone'],
            'sku' => $row['source_customer_billing_zone_id'],
            'units' => $row['minutos'],
            'subtotal' => $row['total'],
            'tax' => 21
        ];

        var_dump($newData);
    }
}

-UPDATE-

При попытке третье решение, о котором я подумал, оно всегда отображает $msg, потому что на самом деле это не массив: когда я выкидываю переменную, появляется запрос. Я понятия не имею, как это сделать. Спасибо всем за помощь!

1 Ответ

1 голос
/ 29 апреля 2020

Вы можете использовать PDOStatement rowCount, чтобы выяснить, есть ли какие-либо совпадения перед его повторением:

if ($stmt->rowCount()) {
    foreach (...) {

    }
else
{
    print("Display error message here");
}

Другой вариант - не выполнять итерацию непосредственно над оператором, а извлечь Сначала строки, а затем решить, что делать:

$rows = $stmt->fetchAll();

if ($rows)
{
    foreach ($rows as $row)
    {
        ..
    }
}
else
{
    // display error message
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...