【问题标题】:User interaction with PHP via command line skipping an input用户通过命令行跳过输入与 PHP 交互
【发布时间】:2016-11-23 19:37:51
【问题描述】:

我有 3 个相同的 sn-ps,它们通过命令行要求用户输入。向用户询问第一个查询和第三个查询,但由于某种原因,第二个 sn-p 未正确输出,尽管其代码相同。下面是输出:

如您所见,它跳过 content 2 并直接运行到内容 3。您知道出了什么问题吗?

只要我点击 y 获取内容 1,代码就会直接运行到 Would you like to print content 3

<?php

echo "\n\033[1;35m~~~~~~ CONTENT 1 ~~~~~~\033[0m\n\n";

echo "\033[1;37mWould you like to print content 1? (y/n) - ";
$stdin = fopen('php://stdin', 'r');
$response = fgetc($stdin);
    if ($response == 'y') {
      echo "\033[0m";
      echo "Content 1 print success!";
    }

echo "\n\033[1;35m~~~~~~ CONTENT 2 ~~~~~~\033[0m\n\n"; 

echo "\033[1;37mWould you like to print content 2? (y/n) - ";
$stdin = fopen('php://stdin', 'r');
$response = fgetc($stdin);
    if ($response == 'y') {
      echo "\033[0m";
      echo "Content 2 print success!";

    }

echo "\n\033[1;35m~~~~~~ CONTENT 3 ~~~~~~\033[0m\n\n"; 

echo "\033[1;37mWould you like to print content 3? (y/n) - ";
$stdin = fopen('php://stdin', 'r');
$response = fgetc($stdin);
            if ($response == 'y') {
              echo "\033[0m";
              echo "Content 3 print success!\n";
            }
echo "\033[0m";

?>

使用 do / while 建议它允许我输入 3 次,但这次对于内容 2 和 3,输入请求是重复的!

看这里:

    <?

    echo "\n\033[1;35m~~~~~~ CONTENT 1 ~~~~~~\033[0m\n\n";

    do {
        echo "\033[1;37mWould you like to print content 1? (y/n) - ";
        $stdin = fopen('php://stdin', 'r');

        $response = fgetc($stdin);
    } while (!in_array($response, ['y','n']));
    if ($response == 'y') {
      echo "\033[0m";
      echo "Content 1 print success!";
    }

    echo "\n\033[1;35m~~~~~~ CONTENT 2 ~~~~~~\033[0m\n\n";

    do {
        echo "\033[1;37mWould you like to print content 2? (y/n) - ";
        $stdin = fopen('php://stdin', 'r');

        $response = fgetc($stdin);
    } while (!in_array($response, ['y','n']));
    if ($response == 'y') {
      echo "\033[0m";
      echo "Content 2 print success!";
    }

    echo "\n\033[1;35m~~~~~~ CONTENT 3 ~~~~~~\033[0m\n\n";

    do {
        echo "\033[1;37mWould you like to print content 3? (y/n) - ";
        $stdin = fopen('php://stdin', 'r');

        $response = fgetc($stdin);
    } while (!in_array($response, ['y','n']));
    if ($response == 'y') {
      echo "\033[0m";
      echo "Content 3 print success!\n";
    }


    ?>

可能是因为输入有一些空白或捕获换行符吗?对不起,我只是盲目地猜测说实话......

----- 更新 -----

我可以通过添加一个额外的 if 语句来强制 echo 只打印一次来让我的代码工作。这是一个 hack,但如果有人能提出更好的解决方案,请告诉我!

    echo "\n\033[1;35m~~~~~~ CONTENT 3 ~~~~~~\n\n";
    $x = "1";
    do {
        if ($x==1){
          echo "\033[1;37mWould you like to print content 2? (y/n) - \033[0m\n";
          $x = $x+1;

        }
        $stdin = fopen('php://stdin', 'r');

        $response = fgetc($stdin);
    } while (!in_array($response, ['y','n']));
    if ($response == 'y') {
      echo "\033[0m";
      echo "Content 3 print success!\n";
    }

【问题讨论】:

  • 代码在我的机器上运行。你可能没有输入y 没有任何额外的字符或根本没有:)
  • hmmmm 在为内容 1 输入 y 后,问题直接转到内容 3,所以我没有机会为内容 2 输入 :(
  • 你的 PHP 版本是多少?
  • PHP 版本:5.6.99

标签: php command-line-interface stdin fopen


【解决方案1】:

您的代码在这里有效。无论如何,如果您想获得有效的输入,请使用此do/while,只接受 Y 或 N 作为输入:

echo "\n\033[1;35m~~~~~~ CONTENT 1 ~~~~~~\033[0m\n\n";

do {
    echo "\033[1;37mWould you like to print content 1? (y/n) - ";
    $stdin = fopen('php://stdin', 'r');

    $response = fgetc($stdin);
} while (!in_array($response, ['y','n']));
if ($response == 'y') {
  echo "\033[0m";
  echo "Content 1 print success!";
}

【讨论】:

  • 请看我上面的更新。由于某种原因,它现在重复了我的输入请求......
  • 完成。请检查。赞赏!
  • 我这里没有任何问题。在 windows 命令提示符和 linux 上都进行了测试。您在哪个工具上运行此代码?
  • 我的设置是带有 iterm2 的 Mac 最新操作系统!
  • 这可能是 PHP 在 MacOS 和 Windows/Linux 中的不同行为。 fgetc 函数。尝试在echo "\n\033[1;37mWould you like to print content 2? (y/n) - "; 和/或\r\n 之前添加\n
猜你喜欢
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多