2016-11-23 39 views
2

我有3个相同的片段要求用户通过命令行输入。第一个查询被询问给用户和第三个查询,但由于某些原因,第二个代码段虽然代码相同,但输出不正确。下面是输出:通过命令行跳过输入的用户与PHP的交互

enter image description here

正如你可以看到它跳过content 2并直通内容3.任何想法是什么问题呢?

只要我点击内容1的y,代码就会直接运行到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 /同时建议它可以让我输入了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"; 
    } 


    ?> 

enter image description here

莫非因为输入一些空格或者其捕获新行?对不起,我只是一味地猜测说实话......

----- ----- UPDATE

如果statment在迫使回音,我可以得到我的代码,通过把一个额外的工作只打印一次。它是一个黑客,但如果任何人都可以想出更好的解决方案,请让我知道!

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"; 
    } 
+0

代码工作在我的机器上。你可能没有输入'y',没有任何额外的字符或什么都没有:) –

+0

hmmmm输入y的内容1后,问题直接到内容3,所以我没有机会输入内容2 :( – NeverPhased

+0

什么是你的?PHP版本 –

回答

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!"; 
} 
+0

请参见上面我的更新出于某种原因,它现在重复我对输入的请求...... – NeverPhased

+0

请,以完成新的代码 –

+0

更新请检查赞赏 – NeverPhased