MySQL вывод не форматируется при выполнении через php - PullRequest
5 голосов
/ 18 марта 2020

Я пытаюсь получить отформатированный вывод из mysql, как обычно показывается при выполнении из оболочки. Это обсуждается здесь и здесь , но это не работает для меня.

Когда я запускаю это в своей оболочке, например:

mysql -e "select language_id, name, image from `language`;" my_database

Я получаю ожидаемый вывод:

+-------------+-----------+--------+
| language_id | name      | image  |
+-------------+-----------+--------+
|           1 | English   | gb.png |
|           2 | Français  | fr.png |
+-------------+-----------+--------+

Но когда я делаю то же самое из php cli:

passthru('mysql -e "select language_id, name, image from `language`;" my_database');

Он получается без форматирования:

language_id name    image
1   English gb.png
2   Français    fr.png

Я пробовал passthru, system, exec и shell_exec, но все они возвращают один и тот же неотформатированный вывод. Почему выходные данные отличаются от php?

Ответы [ 4 ]

6 голосов
/ 25 марта 2020

Когда вы запускаете strace по команде mysql, вы видите строки

ioctl(0, TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0

, которые являются системными вызовами для проверки свойств терминала stdin и stdout (см. tty_ioctl(4)).

Это означает, что mysql проверяет, выводится ли он на терминал / tty или в канал и ведет себя по-разному в зависимости от этого. Поскольку все команды, PHP предложения, основаны на разветвлении процесса и передаче вывода обратно в PHP, вы не сможете заставить mysql вести себя так, как будто он был запущен в реальном терминале.

Примечание : Вы можете воспроизвести это поведение в своей оболочке, вызвав

mysql -e "select language_id, name, image from `language`;" my_database | tee
2 голосов
/ 25 марта 2020

Измените команду на:

passthru('mysql -t -e "select language_id, name, image from `language`;" my_database');

Переключатель -t или --table вызывает табличное отображение результатов.

0 голосов
/ 26 марта 2020
$ mysql -r -u root -e 'select now()'
+---------------------+
| now()               |
+---------------------+
| 2020-03-25 16:44:06 |
+---------------------+

-r также может быть написано --raw.

См. Также --batch и --silent. Весь список: man mysql.

Что касается "почему" ... PHP -> shell -> mysql слишком искажено. (Конечно, это быстро и грязно, но ...) При использовании PHP вы должны подключиться к базе данных и отформатировать вывод, используя PHP.

0 голосов
/ 18 марта 2020

Что выглядит отформатированным, так это приложение cli. Php будет получать необработанные результаты из вашей таблицы. вам придется выполнить форматирование.

Один из способов сделать это (если вы хотите отобразить его в браузере):

//assume $row as your fetch result as an array and $results as tour result set

<table>
    <tr>
        <th>language_id</th>
        <th>name</th>
        <th>image</th>
    </tr>
    <?php while ($row = $results->fetch()) { ?>
        <tr>
            <td><?php echo $row['language_id'] ?></td>
            <td><?php echo $row['name'] ?></td>
            <td><?php echo $row['image'] ?></td>
        </tr>
    <?php } ?>
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...