Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопросы по Web-программированию
GAMEINATOR forums > Soft, Hard и периферия > Hard & Soft
Страницы: 1, 2, 3, 4, 5, 6, 7, 8
SaneX
Кто имел дело с Paypal и IPN?
SaneX
Ничего не понимаю. Пытаюсь прикрутить IPN к сайту. При тестировании средствами paypal-а, ошибка - IPN Delivery Failed. HTTP error code 400: Bad Request.

Код IPN скрипта взят прям с сайта paypal'а, так-же пробовал и друие скрипты - везде 400-я ошибка.

Может быть это зависит от хостинга? У меня сейчас free-акк на http://www.000webhost.com/

код:

Код
<?php

// STEP 1: Read POST data

// reading posted data from directly from $_POST causes serialization
// issues with array data in POST
// reading raw POST data from input stream instead.
$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$myPost = array();
foreach ($raw_post_array as $keyval) {
  $keyval = explode ('=', $keyval);
  if (count($keyval) == 2)
     $myPost[$keyval[0]] = urldecode($keyval[1]);
}
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';
if(function_exists('get_magic_quotes_gpc')) {
   $get_magic_quotes_exists = true;
}
foreach ($myPost as $key => $value) {        
   if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
        $value = urlencode(stripslashes($value));
   } else {
        $value = urlencode($value);
   }
   $req .= "&$key=$value";
}


// STEP 2: Post IPN data back to paypal to validate

$ch = curl_init('https://www.paypal.com/cgi-bin/webscr');
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));

// In wamp like environments that do not come bundled with root authority certificates,
// please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set the directory path
// of the certificate as shown below.
// curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
if( !($res = curl_exec($ch)) ) {
    // error_log("Got " . curl_error($ch) . " when processing IPN data");
    curl_close($ch);
    exit;
}
curl_close($ch);


// STEP 3: Inspect IPN validation result and act accordingly

if (strcmp ($res, "VERIFIED") == 0) {
    // check whether the payment_status is Completed
    // check that txn_id has not been previously processed
    // check that receiver_email is your Primary PayPal email
    // check that payment_amount/payment_currency are correct
    // process payment

    // assign posted variables to local variables
    $item_name = $_POST['item_name'];
    $item_number = $_POST['item_number'];
    $payment_status = $_POST['payment_status'];
    $payment_amount = $_POST['mc_gross'];
    $payment_currency = $_POST['mc_currency'];
    $txn_id = $_POST['txn_id'];
    $receiver_email = $_POST['receiver_email'];
    $payer_email = $_POST['payer_email'];
} else if (strcmp ($res, "INVALID") == 0) {
    // log for manual investigation
}
?>


SaneX
Проблема как никогда актуальна =(

Хм. Походу, я реализовал то, что мне было нужно БЕЗ использования IPN, а именно, без оплаты через PayPal, на страницу сайта с выдачей ссылки не попадешь.
Сделал так: в return_url к пейпалу отправляем сгенерированную ссылку вида

Код
http://kursovik/geturl.php?fn=result.php&key=".$secret."


Где $secret - md5 сумма, генерирующаяся каждые 300 секунд (вполне достаточно для оплаты через Paypal). Ссылка генерируется после нажатия кнопки оплатить, перед открытием PayPal.

Страница result.php заблокирована через htaccess.

Страница geturl.php, без единственно верного параметра key будет выдавать ошибку, и только с верным key, выдаст верную страницу с ссылкой на скачивание файла. А ссылка, собственно, будет видна только на сайте PayPal'а, после оплаты.

UPD: проверил - все работает, ссылка сменяется каждые 300 секунд.

Собственно есть ли обход такого способа? Собственно, даже если и есть способы обхода, то для диплома такого способа будет достаточно.
SaneX
Upd2: так, пока только одна проблема, у меня ссылка генерируется каждые 600 секунд таким кодом:
Код
$timeout = 600;

$secret = md5((int)(time() / $timeout));



И в момент перехода на PayPal, когда ссылка отправляется PayPal'у, до момента, когда ссылка сгенерируется снова, может оставаться, например, 30 секунд, соответственно, после прохождения оплаты, при возврате на страницу по сгенерированной ссылке, страница эта уже не будет существовать, и попасть на неё можно будет только через новую ссылку.

По идее, надо сделать так, что бы начало отсчета 600 секунд началось в момент перехода на PayPal.
SaneX
Цитата
По идее, надо сделать так, что бы начало отсчета 600 секунд началось в момент перехода на PayPal.


Долго писал какую то фигню, а в итоге сделал так - проверяю ключ из ссылки как с текущим
Код
md5((int)(time() / $timeout))
, так и с предыдущим

Код
md5(((int)(time() / $timeout))-1)
ключом.

SaneX
Цитата
Есть таблица, в которой для каждого активного пользователя заводится запись (гость, поисковый бот, залогиненый пользователь и т.д.). При каждом обращении к форуму в этой таблице в записи этого юзера обновляется текущее "местоположение".Запись существует в таблице от запроса до запроса к форуму. Если в течении ~20 минут от юзера не было никаких обращений - считается что пользователь ушёл оффлайн и запись из таблицы "присутствующих на форуме" удаляется.
Спасибо, сделал у себя так:



Осталось прикрутить удаление записей (старше 15 минут) из бд. Я так понимаю, что можно просто сделать на странице запрос на удаление всех записей, где
Код
date(y-m-d H:i:s) - date_из_БД(y-m-d H:i:s) > 15
?

UPD: кажись работает.
SaneX
16 запросов на страницу форума (с учетом запросов по условиям, например на блокировку пользователя или удаления сообщения) это нормально? или многовато?
OlegatoR
Цитата(SaneX @ 04.04.2013, 15:05) *
16 запросов на страницу форума (с учетом запросов по условиям, например на блокировку пользователя или удаления сообщения) это нормально? или многовато?

Более-менее.

Главное в цикл запросы не запихивай, я один раз так сделал - в итоге получил 500 запросов на одну страницу. Неделю сайт проработал, а потом меня попросили "что-нибудь с ним сделать" =)
SaneX
Делаю сейчас систему репутации, и столкнулся с проблемой.

У меня репутация изменяется в отдельном новом окне, после изменения, выводится надпись о успешном изменении и кнопка "закрыть окно".


Разумеется, на основной странице форума с сообщениями репутация обновится только после обновления страницы, а хотелось бы, чтоб изменения отобразились одновременно с внесением их в базу данных. На gameru.net репутация мгновенно изменяется без перезагрузки страницы.

Кроме как через AJAX это можно сделать?
SaneX
Посоветуйте хороший бесплатный редактор кода по типу sublime text но обязательно с фичей, чтобы если открываешь файл XXX.PHP, то автоматом бы открывались все его зависимости, инклуднутые php файлы, стили, java скрипты и т.п. как в dreamweaver'е.







SaneX
Начал изучать MVC паттерн.

Вот такое отделение HTML кода от PHP нормально выглядит?

Код
            <div class="bodyinnerleft1x3">
                <div class="bodyinner" title="iTreesVol 1" onclick="location.href='item.php?id=2'" onmouseover="change()" onmouseout="changeback()">
                    <style>
                        .bodyinner{
                            background: url(images/gallery/itreesvol1/1.jpg);
                            background-position: center;
                            background-size:cover;
                        }
                    </style>
                </div>
                <div class="bodyinnernewscontainer">
                    <div class="bodyinnernewshead">
                        <span class="bodyinnernewsheadcapture">
                            Новости
                            <?php
                                $html = "<div class='add_news_button' title='Добавить новость'>+</div>";
                                echo model::if_1_1_eq($statusadmin['status'], 'admin', model::print_html($html));
                            ?>
                        </span>          
                    </div>
                    <div id="bodyinnernewsbody">
                            <div id="bodyinnernewsbodycontainer">
                            <?php
                                $html = "<form name='add_news_form' class='add_news' action='/index' method='POST' ENCTYPE='multipart/form-data'>
                                           <div class='add_news_div'>
                                                    <table style='width:100%'>
                                                       <tr>
                                                            <td><textarea required placeholder='Заголовок новости' id='news_title_id' name='news_title' cols='40' rows='3' class='news_title_textarea'></textarea></td>
                                                        </tr>
                                                        <tr>
                                                            <td><textarea placeholder='Ссылка (опционально)' id='news_titlelink_id' name='news_titlelink' cols='40' rows='3' class='news_titlelink_textarea'></textarea></td>
                                                        </tr>
                                                        <tr>
                                                           <td><div class='news_bbcode_wrapper'>
                                                                <div class='bbcode_button' onClick='bb(\"news_text_id\", \"b\")'>B</div>
                                                                <div class='bbcode_button' onClick='bb(\"news_text_id\", \"i\")'>i</div>
                                                                <div class='bbcode_button' onClick='bb(\"news_text_id\", \"u\")' style='text-decoration:underline'>U</div>
                                                                <div class='bbcode_button' onClick='bb(\"news_text_id\", \"url\")' style='width:30px'>URL</div>
                                                           </div></td>
                                                        </tr>
                                                        <tr>
                                                            <td><textarea required id='news_text_id' name='news_text' cols='40' rows='3' class='news_text_textarea'></textarea></td>
                                                        </tr>
                                                        <tr>
                                                            <td><input type='submit' value='Добавить новость' name='news_submit' class='news_submit_button'></td>
                                                        </tr>                
                                                    </table>
                                            </div>
                                        </form>";
                                echo model::if_1_1_eq($statusadmin['status'], 'admin', model::print_html($html));
                                echo model::if_1_1_eq($statusadmin['status'], 'admin', model_index::add_news());
                            ?>    
                                <?php
                                    $news = mysql_query("SELECT news.id, news.title, news.titlelink, news.text, news.date FROM news ORDER BY date DESC");
                                    while ($news_line = mysql_fetch_array($news)){    
                                        $html_delete_news_block = "<div class='delete_news_button' title='Удалить новость'>X</div>
                                                <div class='delete_news_confirm_div'>
                                                    <div style='width:100%; border-bottom:1px solid #C86A6A; text-align:center'>Введите `Del`</div>
                                                    <div>
                                                        <form name='delete_news_form' class='delete_news_class' action='/index' method='POST' ENCTYPE='multipart/form-data'>
                                                            <input type='hidden' id='news_id_input' name='news_id' value='".model_index::get_news_id_for_delete($news_line['id'])."'>
                                                            <input type='text' id='confirm_digits_id' name='confirm_digits' class='confirm_digits_input'>
                                                            <input type='submit' value='ОК' class='delete_news_submit'>
                                                        </form>
                                                    </div>
                                                </div>";
                                        $html_news_main_block = "<div>".model_index::convert_date_y_m_d($news_line['date'])."</div>
                                        <div style='font-size:12px; font-weight:bold; margin-top:8px'><a href='".model_index::select_news_link($news_line['titlelink'])."'>".$news_line['title']."</a>
                                        ".model::if_1_1_eq($statusadmin['status'], 'admin', model::print_html($html_delete_news_block))."    
                                        ".model::if_1_1_eq($statusadmin['status'], 'admin', model_index::delete_news())."                                    
                                        </div>
                                        ".nl2br("<div style='margin-top:8px; margin-bottom:18px; width:95%'>".model::bb_regexp($news_line['text'], '13')."</div>")."
                                        <hr>";
                                        model::print_html_echo($html_news_main_block);
                                    }
                                ?>           
                            </div>    
                        </div>
                    </div>
                </div>
                <div class="bodyinnerright1x3">
                    <div class="bodyinner1" title="iTreesVol 2" onclick="location.href='item.php?id=3'" onmouseover="change()" onmouseout="changeback()">
                        <style>
                            .bodyinner1{
                                background: url(images/gallery/itreesvol2/1.jpg);
                                background-position: center;
                            }
                        </style>
                    </div>
                </div>
                <div class="bodyinner2" title="S&N Grass Vol 1" onclick="location.href='item.php?id=1'" onmouseover="change()" onmouseout="changeback()">
                    <style>
                        .bodyinner2{
                            background: url(images/gallery/grassvol1/1.jpg);
                            background-position: center;
                        }
                    </style>
                </div>
                <div class="bodyinner3" onmouseover="change()" title="Галерея" onclick="location.href='gallery.php'" onmouseout="changeback()">
                    <style>
                        .bodyinner3{
                            background: url(images/gallery/sntreesvol3/1.jpg);
                            background-position: center;
                        }
                    </style>
                </div>
            </div>






OlegatoR
Цитата(SaneX @ 25.06.2013, 22:59) *
отделение HTML кода от PHP

Цитата(SaneX @ 25.06.2013, 22:59) *
  
                                    $news = mysql_query("SELECT news.id, news.title, news.titlelink, news.text, news.date FROM news ORDER BY date DESC");
                                    while ($news_line = mysql_fetch_array($news)){    
                                        $html_delete_news_block = "<div class='delete_news_button' title='Удалить новость'>X</div>
                                          
                                      ......
        
                                    }
                                ?>           
                            </div>    

biggrin.gif Пока что получилось не очень.

Код
model::print_html_echo($html_news_main_block);

Если в модели какая-то функция отдаёт HTML - разделения уже не получается.

В идеале должно выглядеть вот так:
Контроллер получил запрос, как-то его обработал -> Контроллер получил необходимые данные из модели -> Контроллер передал данные в View -> В View данные выводятся (никаких работ с БД, модификаций данных по минимуму)

Посмотри в сторону фреймворков CodeIgniter или Yii (Юи поновее, Кодеигнитер легче в освоении).

Цитата(SaneX @ 26.04.2013, 17:08) *
Посоветуйте хороший бесплатный редактор кода по типу sublime text но обязательно с фичей, чтобы если открываешь файл XXX.PHP, то автоматом бы открывались все его зависимости, инклуднутые php файлы, стили, java скрипты и т.п. как в dreamweaver'е.

NetBeans. Автоматом инклуды не открываются, но можно перейти в CSS файл, кликнув по классу или иду, или перейти в нужный инклуд по клику на объекте или его методе. Срабатывает в 95% случаев.
SaneX
Чето я туплю. Вот есть функция, которая, например, вставляет в БД что-либо, а так-же выводит какоенибудь сообщение.

1-й раз мы к функции обратились, она вставила данные в БД, вывела нам сообщение. Как повторно обратиться к результату функции, минуя её повторное выполнение? Без помещения в результата функции в переменную, и обращения уже к переменной.

Son1c
Цитата(SaneX @ 28.06.2013, 16:34) *
Как повторно обратиться к результату функции... Без помещения в результата функции в переменную, и обращения уже к переменной.

Никак
SaneX
Цитата(Son1c @ 28.06.2013, 19:41) *
Цитата(SaneX @ 28.06.2013, 16:34) *
Как повторно обратиться к результату функции... Без помещения в результата функции в переменную, и обращения уже к переменной.

Никак


Эх. Сколько дурацких ограничений.


SaneX
Сколько времени у среднего верстальщика займет верстка такого шаблона, с учетом резиновости и кроссбраузерности?

OlegatoR
Цитата(SaneX @ 02.07.2013, 10:40) *
Сколько времени у среднего верстальщика займет верстка такого шаблона, с учетом резиновости и кроссбраузерности?


Часа 3-4, с перерывами на чай.
SaneX
Такая ситуация:

Паттерн MVC - index.php в котором инклудятся model, controller и view.php. Все как у других.

Допустим открываю сессию. Значения переменных в сессию нормально заносятся и в ней сохраняются.

Но если сохранить в сессии объект класса, то он добавляется в сессию, однако после обновления старницы значения переменных объекта удаляются из сессии.

Сессия открывается только 1-н раз.

До этого, когда делал не через MVC паттерн, а была просто php страничка с перемешанным php и html кодом - все работало.

Что за беда? Мб сталкивался кто с подобным?

UPD: решил проблему написав session_write_close(); в начале этого класса оО но это костыль.
SaneX
чет туплю.

Есть функция (в классе Model):

Код
public function query()
        {
            $query = mysql_query("SELECT id, name, price, filename, catcaption FROM catalog");
            return mysql_fetch_array($query);
        }


Пытаюсь её вызвать вот тут:

Код
while ($catalogline = model::query()){

блаблабла

}


Браузер падает т.к. выводится огромное кол-во записей, содержащих данные 1-й строки таблицы БД.

Как павильно написать? Обязательно с функцией.
SaneX
уже разобрался
OlegatoR
Цитата(SaneX @ 26.07.2013, 21:50) *
while ($catalogline = model::query()){

блаблабла

}

o_O.gif
Что-то ты такое мутишь...

Как разобрался?
Son1c
Цитата(OlegatoR @ 27.07.2013, 00:39) *
Цитата(SaneX @ 26.07.2013, 21:50) *
while ($catalogline = model::query()){

блаблабла

}

Как разобрался?

Скорее всего убрал бесконечный цикл
while ($catalogline = model::query()) wink.gif
SaneX
нагуглил вот такое решение -)

Код
public function query()
        {
            static $query = false;
            if (!$query){
                $query = mysql_query("SELECT id, name, price, filename, catcaption FROM catalog");
            }
            return $fetch_array = mysql_fetch_array($query);
        }


Кстати в форуме глюк. При вставке тега [code] после отправки сообщения после квадратной ковычки "]" и открывающего и закрывающего тега добавляюся два тега

Цитата
Что-то ты такое мутишь

Я перевожу свой дипломный проект (интернет магазин с форумом) на MVC паттерн. Вобщем отделяю view и model.
SaneX
Возник ещё один вопрос. Продолжаю пилить класс подключения к БД.

Есть функция
Код
        public function query()
        {
            static $query = false;
            if (!$query){
                $query = mysql_query("SELECT id, firstname, secondname FROM users");
            }
            return $fetch_array = mysql_fetch_array($query);
        }


и функция

Код
public function show_user($para, $query)
        {
            switch ($para) {
                case id:
                    $val = $query['id'];
                    break;
                case firstname:
                    $val = $query['firstname'];
                    break;
                case secondname:
                    $val = $query['secondname'];
                    break;
            }
            return $val;
        }


Отображаю так:
Код
while ($row = model::query()){
echo model::show_user('id', $row);
echo model::show_user('firstname', $row);
echo model::show_user('secondname', $row);
}


но в итоге, выходит многовато лишних запросов к БД.
Как можно оптимизировать в плане кол-ва обращений к БД?
Но обязательно должно остаться использование функций, т.к.
Код
while ($row = model::query()){
echo $row['id'];
echo $row['firstname'];
echo $row['secondname'];
}

не очень красиво в MVC паттерне.
cjayho
Цитата(SaneX @ 29.07.2013, 12:16) *
Возник ещё один вопрос. Продолжаю пилить класс подключения к БД.

Есть функция
Код
        public function query()
        {
            static $query = false;
            if (!$query){
                $query = mysql_query("SELECT id, firstname, secondname FROM users");
            }
            return $fetch_array = mysql_fetch_array($query);
        }


и функция

Код
public function show_user($para, $query)
        {
            switch ($para) {
                case id:
                    $val = $query['id'];
                    break;
                case firstname:
                    $val = $query['firstname'];
                    break;
                case secondname:
                    $val = $query['secondname'];
                    break;
            }
            return $val;
        }


Отображаю так:
Код
while ($row = model::query()){
echo model::show_user('id', $row);
echo model::show_user('firstname', $row);
echo model::show_user('secondname', $row);
}


но в итоге, выходит многовато лишних запросов к БД.
Как можно оптимизировать в плане кол-ва обращений к БД?
Но обязательно должно остаться использование функций, т.к.
Код
while ($row = model::query()){
echo $row['id'];
echo $row['firstname'];
echo $row['secondname'];
}

не очень красиво в MVC паттерне.



не совсем понимаю что вас смущает... Ответ бд вытягивается и записывается в массив плана

$query = array( 'id' => somevalue, 'firstname' => somevalue, 'secondname' => somevalue );

в случае если массив есть то повторный запрос не делается а выуживается элемент массива.
Вообще неплохо бы увидеть весь класс.
SaneX
спасибо, попробую сделать через массив.
А по поводу всего класса - там кроме этих 2-х функций остальные к БД не относятся.
Цитата
Продолжаю пилить класс подключения к БД.

тут немного не правильно выразился.
SaneX
Цитата(cjayho @ 29.07.2013, 14:52) *
Ответ бд вытягивается и записывается в массив плана

в случае если массив есть то повторный запрос не делается а выуживается элемент массива.
Вот так вроде катит. Во всяком случае, я поставил счетчик после обращения к БД и теперь он равен "1".


Код
public function query()
        {
            static $query = false;
            if (!$query){
                $query = Model::sql_select_few('id', 'name', 'price', 'filename', 'catcaption', 'catalog');
                ++$_SESSION['test'];
                return mysql_fetch_array($query);
            } else {
                return mysql_fetch_array($query);
            }
        }
cjayho
Цитата(SaneX @ 29.07.2013, 21:23) *
Цитата(cjayho @ 29.07.2013, 14:52) *
Ответ бд вытягивается и записывается в массив плана

в случае если массив есть то повторный запрос не делается а выуживается элемент массива.
Вот так вроде катит. Во всяком случае, я поставил счетчик после обращения к БД и теперь он равен "1".


Код
public function query()
        {
            static $query = false;
            if (!$query){
                $query = Model::sql_select_few('id', 'name', 'price', 'filename', 'catcaption', 'catalog');
                ++$_SESSION['test'];
                return mysql_fetch_array($query);
            } else {
                return mysql_fetch_array($query);
            }
        }



Для начала могу только сказать что надстройка работы с mysql, которую вы используете, является устаревшей с версии php 5.5.0, так что стоит задуматься над заменой, например на бэкэнд mysqli.

Ps. А вообще создание грамотной mvc-архитектуры - далеко не тривиальная задача, это я вам как веб-разработчик с 15-летним стажем говорю.
SaneX
Цитата
Ps. А вообще создание грамотной mvc-архитектуры - далеко не тривиальная задача


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

cjayho
Цитата(SaneX @ 25.06.2013, 22:59) *
Начал изучать MVC паттерн.

Вот такое отделение HTML кода от PHP нормально выглядит?
<...>


Исполняемые файлы шаблонов (с php-кодом внутри) - по сути отсутствие mvc, так как все равно это получается спагетти-код.
Я например использую неисполняемые шаблоны, то есть программу отделяю от данных полностью. Куски html кода выношу в отдельные .tpl-файлы. которые не инклудятся, а читаются через file_get_contents() и потом парсятся, например регулярками. В простейшем случае. если не делать какой-то серьезной обработки, чтобы вставить в нужное место результат выполнения какой-нибудь ф-ции или другой шаблон, использую конструкции типа

Код
<!--[tagname]-->


И потом пройдясь по содержимому файла простейшим str_replace('<!--[tagname]-->', 'то что нам нужно', ... ) получаю уже заполненный шаблон.
SaneX
мороки много =( а MVC это разделение на логику модели, отображения и контроллера, т.е. вполне, я щитаю, можно искользовать для логики отображения конструкции типа
Код
blablabla

<div> bla bla bla

Собственно, я теперь так и делаю без помещения html кода в переменную:
Код
$html = "blablabla ".echo model::foo()."";
if (blablabla){
echo $html;
}
cjayho
Цитата(SaneX @ 17.07.2013, 19:15) *
Но если сохранить в сессии объект класса, то он добавляется в сессию, однако после обновления старницы значения переменных объекта удаляются из сессии.



Вообще паттерн mvc и предназначен для жесткого разделения исполняемого кода и произвольных данных. Вы же, сохраняя класс (который является вместилищем и исполняемого кода тоже) по сути сводите на нет все усилия. Лучше реализуйте сериализацию данных и обратное восстановление при записи в сессию и из нее соответственно. Несмотря на то, что данные сессии хранятся на сервере во временных файлах, от повреждения файлов никто не застрахован, и лучше пусть повредятся произвольные данные, чем повредится исполняемый код, что приведет к непредсказуемым результатам.
SaneX
Цитата(cjayho @ 29.07.2013, 23:30) *
Цитата(SaneX @ 17.07.2013, 19:15) *
Но если сохранить в сессии объект класса, то он добавляется в сессию, однако после обновления старницы значения переменных объекта удаляются из сессии.


Вообще паттерн mvc и предназначен для жесткого разделения исполняемого кода и произвольных данных. Вы же, сохраняя класс (который является вместилищем и исполняемого кода тоже) по сути сводите на нет все усилия. Лучше реализуйте сериализацию данных и обратное восстановление при записи в сессию и из нее соответственно. Несмотря на то, что данные сессии хранятся на сервере во временных файлах, от повреждения файлов никто не застрахован, и лучше пусть повредятся произвольные данные, чем повредится исполняемый код, что приведет к непредсказуемым результатам.



Вы мне советуете с точки зрения опытного разработчика, я же дай бог новичек, у меня это чисто чтобы время убить. Проект, в котором я все это делаю, с вероятностью 98% никогда в сеть не попадет. Так что я особо не заморачиваюсь. Просто потихоньку делаю что-то.
По поводу MVC, я уж щас глобально переделывать не буду, пусть будет как есть - функции отдельно, код отображения отдельно без всяких регулярок, шаблонов и прочего.
cjayho
Цитата(SaneX @ 29.07.2013, 22:26) *
мороки много =( а MVC это разделение на логику модели, отображения и контроллера, т.е. вполне, я щитаю, можно искользовать для логики отображения конструкции типа
Код
blablabla

ololololol

Собственно, я теперь так и делаю без помещения html кода в переменную:
Код
$html = "blablabla ".echo model::foo()."";
if (blablabla){
echo $html;
}


Если уже подходить последовательно, то модель данных у вас уже есть - это база данных. В ней еще и часть логики вида есть - есть ведь такие штуки как view, которые позволяют делать весьма сложные выборки из таблиц. Тоесть вам по сути надо написать контроллер и шаблонизатор. Остальное уже - это программирование БД.
SaneX
Цитата
по сути надо написать контроллер


У меня контроллер выбирает из адреса страницы "site.ru/item/1" переменные, к примеру "1", и по ним уже работает модель.
Ещё создает объекты класса модели и вью. Ещё назначает общий шаблон для страницы и подключает файл "страница_view.php"

Что ещё он должен делать?

PS: базовую реализацию я честно стащил с хабры, т.к. с нуля мне не это не по зубам =)
http://habrahabr.ru/post/150267/
cjayho
Цитата(SaneX @ 29.07.2013, 22:43) *
Цитата
по сути надо написать контроллер


У меня контроллер выбирает из адреса страницы "site.ru/item/1" переменные, к примеру "1", и по ним уже работает модель.
Ещё создает объекты класса модели и вью. Ещё назначает общий шаблон для страницы и подключает файл "страница_view.php"

Что ещё он должен делать?

PS: базовую реализацию я честно стащил с хабры, т.к. с нуля мне не это не по зубам =)
http://habrahabr.ru/post/150267/


Честно говоря то что там на хабре написано ничего кроме фейспалма не вызывает.

Да кстати избегайте делать страницы сайта в виде http://сайт/раздел/
только http://сайт/раздел.htm и именно .htm, не .php и тем более не урл со слешем в конце. Очень плохая практика, так как противоречит всем писанным стандартам. Работать в браузере будет, но так делать не стОит. На то есть много причин.
Также избегайте как кириллики в урл, так и параметров вроде http://сайт/чтототам.php?var1=многа_многа_букаф
Для параметров запроса есть POST или сессии, GET-запросы в свое время были временным костылем, когда в начале 90-х ничего не оставалось как передавать параметры CGI-скриптам таким образом.
SaneX
Цитата
только http://сайт/раздел.htm и именно .htm, не .php и тем более не урл со слешем в конце.
хм. на будущее усвою, но все же, чем плохо? Тот же d3 открываю, а там: http://android.d3.ru/comments/463924/, ну или хабр: http://habrahabr.ru/post/188010/
Цитата
тем более не урл со слешем в конце

у меня щас редирект идет со ссылки вида "site.ru/item/1/" на "site.ru/item/1"
OlegatoR
Цитата(cjayho @ 29.07.2013, 23:03) *
Да кстати избегайте делать страницы сайта в виде http://сайт/раздел/
только http://сайт/раздел.htm и именно .htm, не .php и тем более не урл со слешем в конце.

Цитата(cjayho @ 29.07.2013, 23:03) *
Работать в браузере будет, но так делать не стОит. На то есть много причин.

Цитата(cjayho @ 29.07.2013, 23:03) *
так и параметров вроде http://сайт/чтототам.php?var1=многа_многа_букаф

Готов выслушать пояснение "из первых рук", т.к. в гугле мнений находится много и разных smile.gif
cjayho
Цитата(OlegatoR @ 29.07.2013, 23:10) *
Цитата(cjayho @ 29.07.2013, 23:03) *
Да кстати избегайте делать страницы сайта в виде http://сайт/раздел/
только http://сайт/раздел.htm и именно .htm, не .php и тем более не урл со слешем в конце.

Цитата(cjayho @ 29.07.2013, 23:03) *
Работать в браузере будет, но так делать не стОит. На то есть много причин.

Цитата(cjayho @ 29.07.2013, 23:03) *
так и параметров вроде http://сайт/чтототам.php?var1=многа_многа_букаф

Готов выслушать пояснение "из первых рук", т.к. в гугле мнений находится много и разных smile.gif


Да зачем далеко ходить - возьмите какой-нибудь wget или прочие скачивалки сайтов и посмотрите как бедная программа пытается скачивать html-код в inode директории вместо inode файла. А теперь представьте - на таком же принципе работают и поисковые боты. Аналогично и с кирилликой в именах файлов, которая превращается в жуткую строку состоящую на треть из знаков процента. О страничках с гет-запросами все еще веселее - не всякие оси позволяют сохранять файлы, с символом знака вопроса в filename.
SaneX
Нид хелп!


Есть функция:

Код
public function bd_query($query)
        {
            static $query = false;
            if (!$query){
                $query = func_get_arg(0);
                return mysqli_fetch_array($query);
            } else {
                return mysqli_fetch_array($query);
            }    
    }


Вызываю её многократно вот так:

Код
public function send_messages_query()
        {
            $query = Model::sql_select_few_where_one('id', 'caption', 'dest', 'date','messages', 'autor="'.$_SESSION['login'].'"');
            return model::bd_query($query);
        }
        
        public function admin_sales_query()
        {
            $query = Model::sql_select_few('id', 'user', 'date', 'name', 'price', 'items');
            return model::bd_query($query);
        }
        
        public function admin_users_query()
        {
            $query = Model::sql_select_few('id', 'login', 'email', 'reg_date', 'users');
            return model::bd_query($query);
        }
        
        public function admin_items_query()
        {
            $query = Model::sql_select_few('id', 'name', 'price', 'filename', 'text', 'catalog');
            return model::bd_query($query);
        }


Но аргумент $query в эту функцию передаётся только от первого вызова. Дальше - выводятся пустые строки.
Т.е. к примеру:
Код
public function admin_sales_query()
        {
            $query = Model::sql_select_few('id', 'user', 'date', 'name', 'price', 'items');
            return model::bd_query($query);
        }

...выдаст результат.

А вот следующий вызов в:
Код
public function admin_users_query()
        {
            $query = Model::sql_select_few('id', 'login', 'email', 'reg_date', 'users');
            return model::bd_query($query);
        }

Не выдаст никаких ошибок, но результат будет абсолютно пустым.

Я так понял дело в
Код
if (!$query){
, но как пофиксить не понял =)
OlegatoR
Цитата(SaneX @ 02.08.2013, 22:51) *
bd_query($query)

Хочется взять и... наругать. Не привыкай называть функции (переменные, поля в бд) калькой с рус. слов, db_query раз уж на то пошло.
Цитата(SaneX @ 02.08.2013, 22:51) *
Код
if (!$query){, но как пофиксить не понял =)


Код
public function bd_query($query)
    {
           if (!$query) return FALSE;
           return mysqli_fetch_array($query);
    }
SaneX
Цитата(OlegatoR @ 03.08.2013, 00:07) *
Цитата(SaneX @ 02.08.2013, 22:51) *
bd_query($query)

Хочется взять и... наругать. Не привыкай называть функции калькой с рус. слов, db_query раз уж на то пошло.
Цитата(SaneX @ 02.08.2013, 22:51) *
Код
if (!$query){, но как пофиксить не понял =)


Код
public function bd_query($query)
    {
           if (!$query) return FALSE;
           return mysqli_fetch_array($query);
    }


Выдает бесконечный цикл 1-й искомой строки в БД, т.к. вызываю её потом вот так:
Код
while ($row = admin_items_query()){

echo Бла-бла-бла

}



Условие

Код
   static $query = false;
            if (!$query){
                $query = func_get_arg(0);
                return mysqli_fetch_array($query);
            } else {
                return mysqli_fetch_array($query);
            }



это фиксит.

Я конечно могу сделать так в каждой функции:
Код
public function admin_users_query()
        {
static $query = false;
            if (!$query){
                $query = Model::sql_select_few('id', 'login', 'email', 'reg_date', 'users');
                return mysqli_fetch_array($query);
            } else {
                return mysqli_fetch_array($query);
            }    
        }

Но это сильно увеличивает объем повторяемого кода в функциях.
SaneX
Я, кстати, так и не решил проблему.
Son1c
SaneX,
Попробуй так
CODE
public function bd_query($query)
{
global $query;
if (!$query){
$query = func_get_arg(0);
return mysqli_fetch_array($query);
} else {
return mysqli_fetch_array($query);
}
}


CODE
public function send_messages_query()
{
$query = Model::sql_select_few_where_one('id', 'caption', 'dest', 'date','messages', 'autor="'.$_SESSION['login'].'"');
$result = model::bd_query($query);
$query = false;
return $result;
}

public function admin_sales_query()
{
$query = Model::sql_select_few('id', 'user', 'date', 'name', 'price', 'items');
$result = model::bd_query($query);
$query = false;
return $result;
}

public function admin_users_query()
{
$query = Model::sql_select_few('id', 'login', 'email', 'reg_date', 'users');
$result = model::bd_query($query);
$query = false;
return $result;
}

public function admin_items_query()
{
$query = Model::sql_select_few('id', 'name', 'price', 'filename', 'text', 'catalog');
$result = model::bd_query($query);
$query = false;
return $result;
}

SaneX
Нет, не, выполняется только 1-й вызов функции, последующие вызовы перескакивают на "else" условия.
nuan
Код
Ошибка    1    Тип "System.Web.Mvc.ModelClientValidationRule" существует как в "c:\Program Files\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\System.Web.Mvc.dll", так и в "c:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Web.WebPages\v4.0_2.0.0.0__31bf3856ad364e35\System.Web.WebPages.dll"    C:\Users\Nuan\Desktop\дополнительные материалы\Гайдар Магдануров - ASP.Net MVC 3 видеоуроки\Дополнительные материалы\ASP MVC 3 - Part5\StartSample\Models\AccountModels.cs    243    28    MvcTrainingApp


Опа... не ожидал ) и какой из них то?
nuan
На всякий случай сообщаю что проблема решена переустановкой .net.
Теперь вопрос такой, написал модульный тест типа :
Код
[TestMethod]
        public void Correct_Total_Reduction_Amount()
        {
            // Организация
            FakeRepository repo = new FakeRepository();
            decimal reductionAmount = 10;
            decimal initialTotal = repo.GetTotalValue();
            MyPriceReducer target = new MyPriceReducer(repo);
            // Действие
            target.ReducePrices(reductionAmount);
            // Утверждение
            Assert.AreEqual(repo.GetTotalValue(),
            (initialTotal - (repo.GetProducts().Count() * reductionAmount)));
        }

Запускаю, ошибок не пишет, но остановить его вообще никак... и не перезапустить тест, не выполнить программу сволочь не дает... Только если закрыть и открыть заного... Может кто сталкивался?
nuan
Цитата
Собственно чтобы выучить Asp.net я стал читать книгу : Сандерсон С - ASP.NET MVC3 Framework с примерами на C# для профессионалов (третье издание) - 2012

В 5 главе, сначала мы эмулируем данные с помощью Moq:
Код C#

1
2
3
4
5
6
7



Mock<IProductsRepository> mock = new Mock<IProductsRepository>();
mock.Setup(m => m.Products).Returns(new List<Product> {
new Product { Name = "Football", Price = 25 },
new Product { Name = "Surf board", Price = 179 },
new Product { Name = "Running shoes", Price = 95 }
}.AsQueryable());
ninjectKernel.Bind<IProductsRepository>().ToConstant(mock.Object);

Далее в контроллере:
Код C#

1
2
3
4
5
6
7
8
9
10
11
12
13



public class ProductController : Controller
{
private IProductsRepository repository;

public ProductController(IProductsRepository productRepository)
{
repository = productRepository;
}
public ViewResult List()
{
return View(repository.Products);
}
}

Сам List :
Код HTML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16



@model IEnumerable<SportsStore.Domain.Entities.Product>

@{
ViewBag.Title = "List";
}

<h2>List</h2>
<div>

@foreach(var p in Model)
{
<p>@p.Name </p>
<p>@p.Description</p>
<p>@p.Price.ToString("c")</p>
}
</div>

При этом все работает и выдает список , как и должен быть.
Теперь по книге мы создаем БД и добавляем в Web.config строку подключения:
Код HTML

1
2
3
4
5



<connectionStrings>
<add name="EFDbContext"
connectionString="Data Source=NUAN-ПК\SQLEXPRESS;Initial Catalog=SportsStore;Integrated Security=True;Pooling=False"
providerName="System.Data.SqlClient" />
</connectionStrings>

Я создал проект который тупо к ней подключался чтобы менять\добавлять данные и т.п., оттуда и взял строку.
Далее: EFDbContext

Код C#

1
2
3
4
5
6
7



namespace SportsStore.Domain.Concrete
{
class EFDbContext
{
public DbSet<Product> Products { get; set; }
}
}

Сам Product:
Код C#

1
2
3
4
5
6
7
8
9
10
11



namespace SportsStore.Domain.Entities
{
public class Product
{
public int ProductID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}
}

Далее IProductsRepository и EFProductRepository
Код C#

1
2
3
4
5
6
7



namespace SportsStore.Domain.Abstract
{
public interface IProductsRepository
{
IQueryable<Product> Products { get; }
}
}

Код C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25



namespace SportsStore.Domain.Concrete
{
public class EFProductRepository : IProductsRepository
{
private EFDbContext context = new EFDbContext();
public IQueryable<Product> Products { get { return context.Products; } }

}
Вылетает с ошибкой:
HTML
Ссылка на объект не указывает на экземпляр объекта.
Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода.

Сведения об исключении: System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.

Ошибка источника:


Строка 8: <div>
Строка 9:
Строка 10: @foreach(var p in Model)
Строка 11: {
Строка 12: <p>@p.Name </p>

}

в строке 10 , при отладке почему то реализации = null
Перепробовал все что только можно, проверил подключение к базе, да она работает...
Могу скинуть полностью весь проект.
Помогите бился весь вечер, а научиться хочется.
SaneX
Вопрос появился.
Есть код:
Код
$full_url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$explode = explode('://', $full_url);
if (preg_match('#//+#', $explode[1]) > 0)
{
     $new_url = preg_replace('#//+#', '/', $explode[1]);
     $new_url = preg_replace("#/$#", "", $new_url);
     $new_url = 'http://'.$new_url;
     exit("<meta http-equiv='refresh' content='0; url=".$new_url."'>");
}

Мы получаем полную ссылку на текущую страницу, удаляем из неё http:// и в оставшейся строке заменяем все символы '/' больше одного на один '/'.

Всё работает прекрасно.

Но почему, если заменить
Код
exit("<meta http-equiv='refresh' content='0; url=".$new_url."'>");

на
Цитата
header('Location:'.$new_url);

, то при выполнении условия страница уходит в циклическую переадресацию?
SaneX
первый и последний ап blush.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.