PHP - $ .POST Дважды через два файла - PullRequest
1 голос
/ 23 ноября 2011

Сокращенная цель: передать переменную через $ .POST в файл PHP (get.php), а для get.php в $ .POST снова переменную в db.php.

Моя проблема

Я пытаюсь следовать шаблону проектирования модель-представление-контроллер в своем PHP-коде.

У меня будет три страницы:

  1. index.php - GUI (в основном теги HTML и DIV)
  2. get.php - Скрытый php, который передает код через AJAX + POST для div в index.php
  3. db.php - Часть соединения с базой данных

объяснение изображения http://oi44.tinypic.com/339sz6f.jpg Как правило, я хочу получить ответ через два запроса POST

Пока у меня есть index.php POSTING для get.php и запрашивающий определенные данные, которые возвращаются через и обновляются через AJAX и jQuery для анимации.

Вот фрагмент кода:

function get(div,id,opt_username) { 
$.post('get.php', { request: id },
function(response) {
    // In this order, first fadeout div
    $(div).fadeOut(600, function() {

        // If we pass a username as optional parameter...
        if (opt_username) { 
            //Prepend username onto response
            response = "     Welcome " + username + response;   
        }

        // Then get the response back HIDDEN
        $(div).html(response).hide(function() {
                // Once completed, parse with XFBML so everything renders
                FB.XFBML.parse(document.getElementById(div));
                // Only after everything's parsed do we fade back in
                $(div).fadeIn(1100, function() {}); 

        });
    });
});
};  

Теперь я могу делать POST-запросы к get.php, но если я попытаюсь сделать то же самое в get.php для публикации в db.php (для выполнения операций с базой данных), это просто не будет работать.

Моя цель

index.php -> запрос данных -> get.php -> запрос соединения БД -> db.php -> возврат данных -> get.php -> возврат данных -> index.php

Это позволит мне переключить слой базы данных с другим. Например, в настоящее время я использую RDBMS, но я хотел бы в будущем переключиться на XML / RDFXML, то есть все, что мне нужно сделать, это переключить db.php на другой, и все будет работать, сохраняя соответствие MVC.

Мои вопросы

  1. Прежде всего, могу ли я на самом деле сделать POST на страницу, чтобы сделать еще один POST, и если да, то почему я получаю ошибку ниже?
  2. Правильно ли я подхожу к контроллеру модельного вида

Дополнительные пояснения

Вот фрагмент кода в get.php (вторая страница), который выдает ошибку:

$.post('db.php', { test: 2 },
    function(response) {} );

выдана ошибка:

Parse error: syntax error, unexpected '.', expecting T_VARIABLE or '$' 

Заключение

Я просто не могу получить index.php для публикации в get.php, в свою очередь, для публикации в db.php.

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

У вас есть , чтобы сделать два post с?

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

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

Вместо того, чтобы пытаться сделать две записи между страницами, почему бы просто не передать массив $ _POST методу в классе?

Например (в псевдокоде):

Ваш index.php (посты в get.php через AJAX):

<form action="/uses/ajax/to/post/to/get.php" method="post" name="data_form" id="data_form">
    <input type="text" name="data" id="data" />
    <input type="text" name="more_data" id="more_data" />
    <input type="submit" value="Post this data" />
</form>

<script>
    // Your ajax post code here
</script>

Ваш get.php:

<?php
$post_data = isset($_POST) ? $_POST : die('No post data was sent');

include($_SERVER['DOCUMENT_ROOT'] . '/Model_Object.php');

$Model_Object = new Model_Object();

// This would echo your response for the ajax
echo $Model_Object->create_something($post_data);

Затем вместо db.php вы можете создать класс Model (который включен в ваш get.php):

Model_Object.php:

<?php
class Model_Object {
    public function create_something($post_data) {
        $data = isset($post_data['data']) ? $post_data['data'] : '';
        $more_data = isset($post_data['more_data']) ? $post_data['more_data'] : '';

        // MySQL query here
        $success = true;

        if($success) {
            return 'Completed';
        }

        return 'Failed';
    }

    public function create_something_else($post_data) {
        return 'This can do a different MySQL query';
    }
}

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

Что касается правильного подхода к MVC, я не знаю, как это лучше всего сделать, но когда я пишу приложения MVC с нуля, я настраиваю файл .htaccess, чтобы направлять все запросы к root index.php, который из URI будет решать, какой Controller объект создать и какой метод в этом Controller выполнить.

Этот метод может, например, содержать некоторый код для отображения представления или создать объект Model для взаимодействия с базой данных.

Если будет создан Model, он будет передавать всю соответствующую информацию в Controller, а Controller будет делать то, что ему нужно оттуда.

Например, если я перешел на /my_controller/my_action, то файл index.php создаст объект My_Controller, если он существует, и, если он существует, попытается выполнить в этом объекте метод с именем my_action.

Надеюсь, это помогло вам, и мне жаль, если я неправильно понял.

1 голос
/ 24 ноября 2011

Реализация model-view-controller не означает, что вам нужно создавать HTTP-запросы для связи между этими уровнями. Просто включите файл, используя include или require. Разделение уже существует при наличии разных файлов.

...