note 24411 added to features.commandline
| From: | zager@php.net | Date: | Thu, 15 Aug 2002 15:15:27 +0000 |
| Subject: | note 24411 added to features.commandline | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-35071@lists.php.net to get a copy of this message | ||
Under Solaris (at least 2.6) I have some problems with reading stdin. Original pbms report may be
found here:
http://groups.google.com/groups?
q=Re:+%5BPHP%5D+Q+on+php://stdin+--+an+answer!&hl=en&lr=&ie=UTF-
8&oe=UTF-8&selm=3C74AF57.6090704%40Sun.COM&rnum=1
At a first glance the only solution for it is 'fgetcsv'
#!/usr/local/bin/php -q
<?php
set_magic_quotes_runtime(0);
$fd=fopen("php://stdin","r");
if (!$fd)
exit;
while (!feof ($fd))
{
$s = fgetcsv($fd,128,"\n");
if ($s==false)
continue;
echo $s[0]."\n";
}
?>
But... keep reading....
>>> I wrote
Hello,
Sometimes I hate PHP... ;)
Right today I was trapped by some strange bug in my code with reading stdin using fgetcsv.
After a not small investigation I found that strings like "foo\nboo\ndoo"goo\n (take note
of double quatation sign in it)
interpreted by fgetcsv like:
1->foo\nboo\ndoo
2->goo
since double quotation mark has a special meaning and get stripped off of the input stream.
Indeed, according to PHP manual:
[quote]
array fgetcsv ( int fp, int length [, string delimiter [, string enclosure]])
[skip]
another delimiter with the optional third parameter.
_The_enclosure_character_is_double_quote_,_unless_
it_is_specified_.
[skip]
_enclosure_is_added_from_PHP 4.3.0. !!!!!!
[/quote]
Means no chance for us prior to 4.3.0 :(
But file() works just fine !!!! Of course by the price of memory, so be careful with large files.
set_magic_quotes_runtime(0); // important, do not forget it !!!
$s=file("php://stdin");
for ($i=0,$n=sizeof($s);$i<$n;$i++)
{
do_something_useful(rtrim($s[$i]));
}
Conclusion:
1. If you have no double quotation mark in your data use fgetcsv
2. From 4.3.0 use fgetcsv($fd,"\n",""); // I hope it will help
3. If you data is not huge use file("php://stdin");
Hope now it's cleared for 100% (to myself ;)
Good luck!
Dim
PS. Don't forget that it's only Solaris specific problem. Under Linux just use usual
fgets()...
--
http://www.php.net/manual/en/features.commandline.php
http://master.php.net/manage/user-notes.php?action=edit+24411
http://master.php.net/manage/user-notes.php?action=delete+24411
http://master.php.net/manage/user-notes.php?action=reject+24411