Я нахожусь на сервере, где я ограничен PHP 5.2.6, что означает, что str_getcsv не доступен мне. Я использую, вместо этого fgetcsv, который требует "Указателя правильного файла на файл, успешно открытый fopen (), popen (), или fsockopen ()". воздействовать на.
Мой вопрос - это: существует ли способ получить доступ к строке как к дескриптору файла?
Моя другая опция состоит в том, чтобы выписать строку к текстовому файлу и затем получить доступ к ней через fopen()
и затем используйте fgetcsv
, но я надеюсь, что существует способ сделать это непосредственно, как в жемчуге.
Если вы посмотрите примечания пользователя на странице руководства для str_getcsv
, вы найдете это примечание от daniel , который предлагает эту функцию (цитата) :
<?php
if (!function_exists('str_getcsv')) {
function str_getcsv($input, $delimiter = ",", $enclosure = '"', $escape = "\\") {
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');
fputs($fp, $input);
rewind($fp);
$data = fgetcsv($fp, 1000, $delimiter, $enclosure); // $escape only got added in 5.3.0
fclose($fp);
return $data;
}
}
?>
Кажется, она делает именно то, что вы просили: она использует поток, который указывает на временный дескриптор файла в памяти, для использования fgetcsv
на нем.
См. Потоки ввода / вывода PHP для документации, среди прочего, об оболочке потока php: // temp
.
Конечно, вы должны проверить, работает ли он у вас нормально, но, по крайней мере, это должно дать вам представление о том, как этого добиться; -)
Чтобы ответить на ваш общий вопрос, да, вы можете рассматривать переменную как файловый поток.
http://www.php.net/manual/en/function.stream-context-create.php
Ниже приводится копия нескольких разных комментариев к руководству по PHP (так что я не могу поручиться о том, насколько он готов к производству):
<?php
class VariableStream {
private $position;
private $varname;
public function stream_open($path, $mode, $options, &$opened_path) {
$url = parse_url($path);
$this->varname = $url["host"];
$this->position = 0;
return true;
}
public function stream_read($count) {
$p=&$this->position;
$ret = substr($GLOBALS[$this->varname], $p, $count);
$p += strlen($ret);
return $ret;
}
public function stream_write($data){
$v=&$GLOBALS[$this->varname];
$l=strlen($data);
$p=&$this->position;
$v = substr($v, 0, $p) . $data . substr($v, $p += $l);
return $l;
}
public function stream_tell() {
return $this->position;
}
public function stream_eof() {
return $this->position >= strlen($GLOBALS[$this->varname]);
}
public function stream_seek($offset, $whence) {
$l=strlen(&$GLOBALS[$this->varname]);
$p=&$this->position;
switch ($whence) {
case SEEK_SET: $newPos = $offset; break;
case SEEK_CUR: $newPos = $p + $offset; break;
case SEEK_END: $newPos = $l + $offset; break;
default: return false;
}
$ret = ($newPos >=0 && $newPos <=$l);
if ($ret) $p=$newPos;
return $ret;
}
}
stream_wrapper_register("var", "VariableStream");
$csv = "foo,bar\ntest,1,2,3\n";
$row = 1;
if (($handle = fopen("var://csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
echo "<p> $num fields in line $row: <br /></p>\n";
$row++;
for ($c=0; $c < $num; $c++) {
echo $data[$c] . "<br />\n";
}
}
fclose($handle);
}
?>
Конечно, для вашего конкретного примера есть более простые методы потока, которые можно использовать.
firefox "http://www.google.com/" &
Это работает для меня просто прекрасно. Попробуйте использовать кавычки и полный URL-адрес.
-121--4012983-В документации Grails описан способ получения услуги в сервлете. Это может быть полезно, если вы можете получить те же объекты в вашем контексте:
ApplicationContext ctx = (ApplicationContext)ApplicationHolder.getApplication().getMainContext();
CountryServiceInt service = (CountryServiceInt) ctx.getBean("countryService");
String str = service.sayHello(request.getParameter.("name"));
-121--3035729- Вы можете использовать дескрипторы потока, такие как php ://memory для достижения того, что вы хотите. Просто откройте, напишите, перемотайте, и вы должны иметь возможность использовать fgetcsv.
Событие onsubmit в форме тэга
При использовании jQuery оно выглядит следующим образом:
$("#yourformtagid").submit(function () {
...
}
-121--2585266- Нет ничего плохого в маршруте. Только не забудьте определить его в конце, после определения всех остальных маршрутов. Я бы также рекомендовал использовать маршруты RESTful и только если вы хотите, чтобы лучше искать URL использовать именованные маршруты. Не используйте map.connect
. Вот несколько хороших прочтений о маршрутах Rails .
Вот как это может выглядеть:
map.resources :questions, :path_prefix => '/:username' do |question|
question.resources :answers
end
map.resources :users
map.user '/:username', :controller => 'users', :action => 'show'
Просто черновик вы можете продлить.
-121--2823049- К сожалению, это невозможно. Нельзя рассматривать последовательность как поток из файла. Вам действительно придется сначала записать последовательность в файл, а затем открыть этот файл с помощью fopen
.
И теперь, со всей очевидностью, Вы рассматривали возможность модернизации?