note 24411 added to features.commandline

From: 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

« previous php.notes (#35071) next »