PDO fetch возвращает только первый ряд

ОБНОВЛЕНИЕ 2: Я любезно попросил отметить этот вопрос как дубликат, поскольку он не является дубликатом другого вопроса, который после некоторого исследования я обнаружил проблему и дал эффективный ответ, который не дал тот, кто пометил мой вопрос как дубликат заявив, что код работал для него. Ну, это работает для него, но это не работает для меня. Я также прочитал много вопросов, где, когда кто-то тестирует код, и он работает для него, он просто помещает примечание в комментарии типа "Это работает для меня" или что-то подобное. И вместо того, чтобы пометить мой вопрос и позже опубликовать следующий комментарий:

"то, что вы должны были сделать, это отредактировать другой вопрос, а не делать репост с тем же кодом. Извините, но я не буду повторно открывать вопрос. Я вчера опубликовал несколько комментариев под вашим другим вопросом, но не стал отвечать так" Я закончил тем, что удалил их. Заявив, что с вашим кодом все в порядке, так как я его протестировал".

.. возможно, что он должен сделать, это просто совет в комментариях, и, скорее всего, я мог бы отредактировать оба моих вопроса вместо того, чтобы "спорить" и жаловаться только потому, что я хочу удалить свой вопрос, что сейчас невозможно, и если Я отправляю еще один вопрос, он тоже будет помечен как Дубликат. Это просто очень неудачно. Также я не вижу этого - выборка PDO возвращает только первую строку, так как дубликат этой PHP PDO Data_length всегда возвращает "0"

ОРИГИНАЛЬНЫЙ ВОПРОС: я использую следующий код для подключения к базе данных, получить Data_length индекс столбца и рассчитать размер базы данных на основе данных.

По какой-то причине PDO всегда будет возвращать "0", что является значением для Data_length Индекс в первом ряду. Что бы я ни делал, я получаю только индекс первых строк.

База данных MySQL, движок MyISAM.

Версия PHP: 5.5.38
Версия MySQL: 5.5.50

ОБНОВЛЕНИЕ 1: Ну, так как этот вопрос был помечен как дубликат этого, я был вынужден изменить исходный код. Ниже приведен новый исходный код, который отлично работает на одном хостинге, но по-прежнему возвращает только первую строку на другом.

// START GET DATABASE SIZE
    // Connect to database
    $conn = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);

    // Execute query
    $stmt = $conn->query('SHOW TABLE STATUS');

    // Get size from array
    $size = $stmt->fetch(PDO::FETCH_ASSOC)["Data_length"];

    // Set values to variables for use
    $decimals = 4;
    $mbytes = round($size/(1024*1024),$decimals);
    $kilobytes = round(($size / 1024) * 10);
    echo $kilobytes;
    // END GET DATABASE SIZE

Старый исходный код: я скопировал этот код из этого ответа, так как он был принят как работающий. Я не мог комментировать там, потому что мне не хватает репутации.

<!DOCTYPE html>
<head>
<title></title>
</head>
<body>

<?php
try {
    error_reporting(-1);
    $host_name  = "my_host";
    $database   = "my_db";
    $user_name  = "my_user";
    $password   = "my_pwd";
    $conn = new PDO("mysql:host=$host_name;dbname=$database", $user_name, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sth = $conn->query('SHOW TABLE STATUS');
    $dbSize = 0;
    $row = $sth->fetch(PDO::FETCH_ASSOC);
    $dbSize = $row["Data_length"];
    $decimals = 2;  
    $mbytes = round($dbSize/(1024*1024),$decimals);
    echo $dbSize . "\n" . $row["Data_length"];
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
?>
</body>
</html>

1 ответ

Решение

Добавьте цикл while,

while($row= $sth->fetch( PDO::FETCH_ASSOC )){ 
   echo $row['your_field_name'];
}

Или вы можете использовать fetchAll

$row= $sth->fetchAll();
print_r($row);
Другие вопросы по тегам