【发布时间】: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