#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-запрос