20.3. Reading from the Keyboard
Problem
You need to read in some typed user input.
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";
Discussion
Once you get a file handle 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 ...
Get PHP Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.