Как я могу отобразить & ldquo; results & rdquo; от php-скрипта и поставить другой скрипт PHP? [Дубликат]

Здесь компиляция наиболее распространенных способов достижения этого :

  • Отправка данных внутри намерения
  • Статические поля
  • HashMap WeakReferences
  • Персистентные объекты (sqlite, общие настройки, файл и т. Д.)

TL; DR: существует два способа совместного использования данных: передача данные в дополнительных целях или сохранить их где-то в другом месте. Если данные являются примитивами, строками или определенными пользователем объектами: отправьте его как часть дополнительных намерений (пользовательские объекты должны реализовать Parcelable). Если передающие сложные объекты сохраняют экземпляр в одноэлементном месте где-то еще и получают доступ к ним из запущенного действия.

Некоторые примеры того, как и почему реализовать каждый подход:

Отправка данных внутри намерений

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("some_key", value);
intent.putExtra("some_other_key", "a value");
startActivity(intent);

Во втором действии:

Bundle bundle = getIntent().getExtras();
int value = bundle.getInt("some_key");
String value2 = bundle.getString("some_other_key");

Используйте этот метод, если вы передаете примитивные данные или строки. Вы также можете передавать объекты, которые реализуют Serializable.

Хотя вы соблазнительны, вы должны подумать дважды, прежде чем использовать Serializable: он подвержен ошибкам и ужасно медленный. Так что вообще: держитесь подальше от Serializable, если это возможно. Если вы хотите передать сложные пользовательские объекты, взгляните на интерфейс Parcelable.

Совместное использование данных, не сохраняющихся на диске

. Можно обмениваться данными между действиями, сохраняя их в памяти учитывая, что в большинстве случаев оба действия выполняются в одном и том же процессе.

Примечание: иногда, когда пользователь покидает вашу деятельность (не покидая ее), Android может решить убить ваше приложение. В таком сценарии у меня были случаи, когда андроид пытается запустить последнее действие, используя намерение, представленное до того, как приложение было убито. В этом случае данные, хранящиеся в одноэлементном (либо вашем, либо Application), исчезнут, и могут произойти плохие вещи. Чтобы избежать таких случаев, вы либо сохраняете объекты на диске, либо проверяете данные, прежде чем использовать их, чтобы убедиться, что они действительны.

Использовать одноэлементный класс

Имейте класс для хранения данных:

public class DataHolder {
  private String data;
  public String getData() {return data;}
  public void setData(String data) {this.data = data;}

  private static final DataHolder holder = new DataHolder();
  public static DataHolder getInstance() {return holder;}
}

Из запущенной деятельности:

String data = DataHolder.getInstance().getData();

Использовать одноопное приложение

Синтаксис приложения - это экземпляр android.app.Application, который создается, когда приложение запускается. Вы можете предоставить пользовательский вариант, расширив Application:

import android.app.Application;
public class MyApplication extends Application {
  private String data;
  public String getData() {return data;}
  public void setData(String data) {this.data = data;}
}

Перед запуском деятельности:

MyApplication app = (MyApplication) getApplicationContext();
app.setData(someData);

Затем из запущенной активности:

MyApplication app = (MyApplication) getApplicationContext();
String data = app.getData();

Статические поля

Идея в основном такая же, как синглтон, но в этом случае вы предоставляете статический доступ к данным:

public class DataHolder {
  private static String data;
  public static String getData() {return data;}
  public static String setData(String data) {DataHolder.data = data;}
}

Из запущенной деятельности:

String data = DataHolder.getData();

HashMap WeakReferences

То же самое, но позволяет сборщику мусора удалять объекты без ссылок (например, когда пользователь завершает работу):

public class DataHolder {
  Map> data = new HashMap>();

  void save(String id, Object object) {
    data.put(id, new WeakReference(object));
  }

  Object retrieve(String id) {
    WeakReference objectWeakReference = data.get(id);
    return objectWeakReference.get();
  }
}

Перед запуском деятельности:

DataHolder.getInstance().save(someId, someObject);

Из запущенной деятельности:

DataHolder.getInstance().retrieve(someId);

Возможно, вам может понадобиться передать идентификатор объекта с помощью дополнительных настроек намерения. Все зависит от вашей конкретной проблемы.

Персистировать объекты на диске

Идея состоит в том, чтобы сохранить данные на диске перед запуском другого действия.

Преимущества: вы можете запустить активность из других мест, и если данные уже сохранены, это должно работать нормально.

Недостатки: это громоздко и требует больше времени для реализации. Требуется больше кода и, следовательно, больше шансов ввести ошибки.

Некоторые способы сохранения объектов включают в себя:

5
задан Matt 3 May 2011 в 20:14
поделиться

9 ответов

Ответ. Для этого вы можете использовать функцию буферизации / управления PHP Output / control . Вот некоторая простая функция, которая получает вывод скрипта и возвращает его:

Код:

Используемые вещи: ob_start() ob_get_clean() is_readable()

function getScriptOutput($path, $print = FALSE)
{
    ob_start();

    if( is_readable($path) && $path )
    {
        include $path;
    }
    else
    {
        return FALSE;
    }

    if( $print == FALSE )
        return ob_get_clean();
    else
        echo ob_get_clean();
}

Использование:

$path = '../photos_page.php';
$html = getScriptOutput($path);

if( $html === FALSE)
{
    # Action when fails
}
else
{
    echo $html;
}
10
ответ дан Gabriel Nahmias 18 August 2018 в 13:05
поделиться
  • 1
    Спасибо, ваш код работает. однако мой код настолько не-классный, что я решил просто включить () его из основного файла index.php. – Matt 3 May 2011 в 22:30

Для этого вы должны использовать file_get_contents("http://yourdomain.com/path/to/photos_page.php").


НО: Если бы я был вами, я бы сделал это следующим образом:

photos_page.php

<?php

function get_photos_html() {
    $html = // generate html
    return $html;
}

?>

main_file.php

<?php

include('../photos_page.php');

$html = get_photos_html();

?>
1
ответ дан akashivskyy 18 August 2018 в 13:05
поделиться
  • 1
    Нет, он хочет, чтобы выводил сценарий . – user 3 May 2011 в 20:19
  • 2
    Но file_get_contents возвращает результат! – akashivskyy 3 May 2011 в 20:20
  • 3
    @Kashiv: Если я не ошибаюсь, эта функция возвращает вывод только в том случае, если вы извлекаете страницу php через веб-сервер. file_get_contents("../photos_page.php") не будет работать. В этом случае вы будете извлекать файл локально. Нужно что-то вроде file_get_contents("http://www.domain.com/photos_page.php") – Dutchie432 3 May 2011 в 20:21
  • 4
    О, да, ты прав! – akashivskyy 3 May 2011 в 20:23
  • 5
    Это неоправданно создает веб-запрос, который использует гораздо больше ресурсов, чем просто использование выходного буфера. – webbiedave 3 May 2011 в 20:30

Это должно сделать трюк:

ob_start();
require('../photos_page.php');
$html = ob_get_contents();
ob_end_clean();
2
ответ дан Chris Eberle 18 August 2018 в 13:05
поделиться

Если ваш photos_page.php работает следующим образом:

<?php
    // very basic code
    $img = "/path/to/my/image.jpg";
    echo '<img src="' . $img . '">' . PHP_EOL;
?>

Тогда вы могли бы использовать:

$html = file_get_contents('http://mysite.com/photos_page.php');

Но на самом деле вам следует переписать код, чтобы вы не Это нужно сделать так.

0
ответ дан drudge 18 August 2018 в 13:05
поделиться

Вы хотите попробовать file_get_contents

$html = file_get_contents("http://www.yourwebsite.com/pages/photos_page.php");

//this will not work since it won't run through web server
//$html = file_get_contents("../photos_page.php");
2
ответ дан Dutchie432 18 August 2018 в 13:05
поделиться
0
ответ дан jsgoupil 18 August 2018 в 13:05
поделиться

Я предполагаю, что вы опубликовали псевдокод.

Код, который вы написали ранее и который не сработал, не должен использоваться снова. Я бы переписал нужные вам части и создал некоторые функции или даже класс, который вы можете использовать, чтобы получить все, что вам нужно.

0
ответ дан Lukas Knuth 18 August 2018 в 13:05
поделиться

Буферизация вывода будет содержать выводимый текст в памяти вместо фактического вывода его в ответ.

Сначала создайте буфер, вызвав функцию ob_start(). Когда вы закончите сохранение вывода в буфере, вызовите ob_get_clean(), чтобы вернуть содержимое буфера и очистить буфер.

ob_start();
include "../photos_page.php";
$html = ob_get_clean();
1
ответ дан Michael 18 August 2018 в 13:05
поделиться

Вы можете использовать буферизацию вывода . Это поместит весь вывод, который обычно отправляется клиенту, в буфер, который вы затем можете извлечь:

ob_start();
include '../photos_page.php';
$html = ob_get_contents();
ob_end_clean();

. Если вы хотите, вы можете поместить эту функцию в функцию, чтобы она работала как вы описали:

function parse_my_script($path)
{
    ob_start();
    include $path;
    $html = ob_get_contents();
    ob_end_clean();
    return $html;
}

Это, конечно, предполагает, что ваш включенный файл не требует использования глобальных переменных.

Для получения дополнительной информации проверьте все выходные данные функции управления:

http://www.php.net/manual/en/ref.outcontrol.php

1
ответ дан webbiedave 18 August 2018 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: