Выборка PDO возвращает только первую строку

#php #mysql #pdo

#php #mysql #pdo

Вопрос:

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

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

Базой данных является MySQL, движок MyISAM.

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

Вот исходный код.

 <!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. Потому fetch что всегда возвращает одну строку. Попробуйте время от времени читать руководство….

2. Вам нужно прочитать руководство ^^^^, но для начала, возможно ->fetchAll() , поможет вам с этой конкретной проблемой

3. @Fred, этот вопрос не совсем дублирует другой. Другой неверен, поскольку в нем указано, что Data_length возвращает «0». Этот вопрос отличается. Пожалуйста, снова откройте эту, чтобы я мог удалить другую.

4. @nospor, на самом деле я уже это сделал, также я уже пробую fetchAll и т. Д. Это не тот подход, который мне нужен. Кроме того, я уже прочитал кучу других вопросов о том, как получить размер базы данных, и все они подходят к этому более или менее таким образом. Также этот код взят из другого вопроса, проверенного как правильный ответ:/ . Я только что добавил обработку ошибок и свои учетные данные.

5. Извините, но я не вижу никакой разницы в коде для обоих вопросов.

Ответ №1:

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

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

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

 $rows = $sth->fetchAll();
print_r($rows);
  

Комментарии:

1. спасибо за предложение, но я уже пробовал что-то подобное. Однако, если вы посмотрите на мой исходный код, вы увидите, что я пытаюсь просто рассчитать размер базы данных, и, как я делал это раньше, таким же образом, очень редко, что сейчас это не работает.

2. Я выбираю это как правильный ответ, потому что он в целом соответствует вопросу, даже если это не совсем то, что мне было нужно. Однако я нашел обходной путь, и теперь все работает нормально. Пришлось использовать другой SQL-запрос, но в конце концов я достиг своей цели

3. Почему должна while() возвращаться только одна строка? (Я конвертирую подготовленные инструкции mysqli в PDO)

4. @Ignus … ну, у меня была такая же проблема, как вы можете видеть, в моем предыдущем комментарии я просто решил это с помощью запроса, я не помню, как сейчас, это похоже на 6y l8tr xD Измените свой SQL-запрос