2016-11-23 36 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