Recipe 25.3. Reading from the Keyboard


25.3.1. Problem

You need to read in some typed user input.

25.3.2. Solution

Use fopen( ) with the special filename php://stdin:

print "Type your message. Type '.' on a line by itself when you're done.\n"; $fh = fopen('php://stdin','r') or die($php_errormsg); $last_line = false;  $message = ''; while (! $last_line) {     $next_line = fgets($fp,1024);     if (".\n" == $next_line) {       $last_line = true;     } else {       $message .= $next_line;     } } print "\nYour message is:\n$message\n";

If the Readline extension is installed, use readline( ):

$last_line = false; $message = ''; while (! $last_line) {     $next_line = readline();     if ('.' == $next_line) {         $last_line = true;     } else {         $message .= $next_line."\n";     } } print "\nYour message is:\n$message\n";

25.3.3. Discussion

Once you get a filehandle pointing to stdin with fopen( ), you can use all the standard file-reading functions to process input (fread( ) , fgets( ), etc.). The solution uses fgets( ), which returns input a line at a time. If you use fread( ), the input still needs to be newline terminated to make fread( ) return. For example, if you run:

$fh = fopen('php://stdin','r') or die($php_errormsg); $msg = fread($fh,4); print "[$msg]";

And type in tomato and then a newline, the output is [toma]. The fread( ) grabs only four characters from stdin, as directed, but still needs the newline as a signal to return from waiting for keyboard input.

The Readline extension provides an interface to the GNU Readline library. The readline( ) function returns a line at a time, without the ending newline. Readline allows Emacs- and vi-style line editing by users. You can also use it to keep a history of previously entered commands:

$command_count = 1; while (true) {     $line = readline("[$command_count]--> ");     readline_add_history($line);     if (is_readable($line)) {         print "$line is a readable file.\n";     }     $command_count++; }

This example displays a prompt with an incrementing count before each line. Since each line is added to the Readline history with readline_add_history( ) , pressing the up and down arrows at a prompt scrolls through the previously entered lines.

25.3.4. See Also

Documentation on fopen( ) at http://www.php.net/fopen, fgets( ) at http://www.php.net/fgets, fread( ) at http://www.php.net/fread, the Readline extension at http://www.php.net/readline, and the Readline library at http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html.




PHP Cookbook, 2nd Edition
PHP Cookbook: Solutions and Examples for PHP Programmers
ISBN: 0596101015
EAN: 2147483647
Year: 2006
Pages: 445

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net