Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> странная ошибка echo, подскажите решение 
:(
    Опции темы
krinart
Дата 18.9.2009, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



я в общем никогда не бежал сломя голову в случае какойто проблемы на форумы с просьбами о помощи, но тут у меня ситуация из ряда вон. Причём на ровном месте. Суть такова - есть две функции., которые вызываются из "главной". из первой возвращается значение и передается параметром во вторую. Схематично: 

Код


function a1()
{
    // запрос к базе данных
    return $res;
}

function a2($par)
{
    // запрос к базе данных 2
    return $res2;
}

$b1= a1();
$b2= a2($b1);


Всё просто и элементарно до безобразия. Но! если в первой функции не поставить какойнибудь вывод echo, то ничего не работает. А именно во вторую функцию не передаётся параметр, т.е. при запросе к бд он получается пустой и выскакивает логичная ошибка "Warning:  mysql_fetch_array(): supplied argument is not a valid MySQL result resource". Хуже всего то, что я даже отследить где он теряется не могу - при добавлении в любое место echo скрипт начинает работать как ни в чём не бывало smile 

Проверено множество раз - и все запросы правильно составлены, и синтаксис везде верен.Почемуто всё упирается в какойто нелепый вывод. Самое интересно то, что результат выводится в формате JSON, т.е. это ответ на AJAX-запрос и я не могу даже зяпятой лишней вывести. Но как только я вставляю "холостой" вывод, который не мешает синтаксису JS, всё опять таки перестаёт работать. Большую пакость и придумать сложно.

Единственное, что могу ещё добавить - это большой размер файла (90 Кб ~ 4000 строк). Даже не знаю на что грешить. Подскажите, а?
PM MAIL ICQ   Вверх
Ипатьев
Дата 18.9.2009, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



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

PM MAIL   Вверх
NewDima
Дата 18.9.2009, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



krinart, надо смотреть исходники, так ничего не скажешь
PM ICQ   Вверх
krinart
Дата 18.9.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



а можно поподробней о записи в файл и что именно писать?

и есть ли вобще мысли о возможных причинах?
PM MAIL ICQ   Вверх
Ипатьев
Дата 18.9.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37




Модератор: Сообщение скрыто.

PM MAIL   Вверх
NewDima
Дата 18.9.2009, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



Ипатьев, че ты ерничаешь, кто сказал, что весь исходник нужно смотреть? одну, максимум две функции

Добавлено через 27 секунд
krinart, не понятно, первая функция не возвращает, или результат теряется?
PM ICQ   Вверх
Ипатьев
Дата 18.9.2009, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



Цитата(krinart @  18.9.2009,  09:52 Найти цитируемый пост)
а можно поподробней о записи в файл и что именно писать?

о-т-л-а-д-о-ч-н-у-ю и-н-ф-о-р-м-а-ц-и-ю
ту, которую вы не можете вывести из -за того, что 
Цитата(krinart @  18.9.2009,  09:27 Найти цитируемый пост)
Хуже всего то, что я даже отследить где он теряется не могу - при добавлении в любое место echo скрипт начинает работать как ни в чём не бывало



Цитата(krinart @  18.9.2009,  09:52 Найти цитируемый пост)
и есть ли вобще мысли о возможных причинах? 

нет, мыслей нет. 
мысли, вообще, очень ненадежный способ найти решение проблемы.
рекомендую вместо мыслей отладку.
PM MAIL   Вверх
krinart
Дата 18.9.2009, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



NewDima, 

Код

    // главная функция
    if($act=='game' && $action!="initGame")
    {
        $mode= $_GET['mode'];
        
        $actionUserID= $P->getActionUser($mode);
        
        $timePass= $P->checkTimeOut_Before($mode, $actionUserID);
        
        echo ', timePass: '.$timePass;
        echo ', actionUserID: '.$actionUserID;
    }

    // эти две функции находятся в отдельном файле(классе)
function checkTimeOut_Before($mode, $actionUserID)
    {
        
        /*
            1. Определить время на ход/заказ
            2. Проверить таймаут на ход
        /**/
        
        $gameID= $_GET['gameID'];
        $kind= ($mode=="turns" ? "timeOut_turn" : "timeOut_order");
        $gameplayingID= $_GET['gameplayingID'];
        
        if(!$gameID || !$gameplayingID)
            return;
        
        $conn = $this->db_connect();
        
        // 1. Определить время на ход/заказ
            $query= "SELECT ".$kind." AS timeOut
                    FROM games
                    WHERE gameID=".$gameID;
            $result= mysql_query($query);
        
            if(mysql_num_rows($result) != 1 )
                return;
        
            $timeOut= mysql_fetch_array($result);
            $timeOut= $timeOut['timeOut'];


        // 2. Проверить таймаут на ход
            
            $query= "SELECT gameTimerBegin as time
                    FROM games
                    WHERE gameID=".$gameID;
            $result= mysql_query($query);
            
            $time= mysql_fetch_array($result);
            $time= $time['time'];
            
            
            // если основной таймаут закончился и гачался отсчёт банка времени
            if( (time()-$time) > $timeOut)
            {
                /*
                    1. Найти игрока, который должен сделать действие(ход или заказ)
                    2. Найти оставшийся банк времени игрока
                    3. Проверить есть ли у него ещё время
                    4. Если есть - вернуть true
                    5. Если нет - вызвать процедуру окончания игры
                /**/
                
                    
                    $time+= $timeout; // начало отсчёта банка времени игрока
                    
                
                // 1. Найти игрока, который должен сделать действие(ход или заказ)
                
                    
                    
                    // определить, сколько осталось у игрока в "банке времени"
                    $query= "SELECT timeout
                            FROM user_game
                            WHERE gameID=".$gameID." AND userID=".$actionUserID;                                            
                    $result= mysql_query($query);
                    
                    $userTimeout= mysql_fetch_array($result);
                    $userTimeout= $userTimeout['timeout'];
                    
            
                    // если банк времени игрока закончился - закончить игру
                    if( (time()- $time) > $userTimeout)
                    {
                        return -1;
                    }
                    // если у игрока не вычерпан банк времениы
                    else
                        // вернуть количество секунд, прошедших с момента начала отсчёта банка времени
                    {
                        return (time()- $time);
                    }
                    
                
                // здесь обработка результата в случае истечения таймаута на ход
            }
            else
                return 0;
    }


    // эти две функции находятся в отдельном файле(классе)
function getActionUser($mode)
    {
        $gameID= $_GET['gameID'];
        $gameplayingID= $_GET['gameplayingID'];
        
        $kind= ($mode=="turns" ? "timeOut_turn" : "timeOut_order");
        
        if(!$gameID || !$gameplayingID)
            return;
        
        $conn = $this->db_connect();
        
        switch($mode)
        {
            case "turns": 
                            $query= "SELECT userID
                                    FROM gameplaying_turns
                                    WHERE gameplayingID= ".$gameplayingID." AND card= 0
                                        AND turn
                                        IN (
                                            SELECT MIN( turn ) AS turn
                                            FROM gameplaying_turns
                                            WHERE gameplayingID= ".$gameplayingID."
                                            AND card= 0 AND round IN (
                                                SELECT MAX( round ) AS round
                                                FROM gameplaying_turns
                                                WHERE gameplayingID= ".$gameplayingID."
                                                )
                                            )";
                            $result= mysql_query($query);    
                            
                            $currentUserID= mysql_fetch_array($result);
                            $currentUserID= $currentUserID['userID'];
            
                            break;
                            
            case "orders": 
                            $query= "SELECT userID 
                                    FROM user_game
                                    WHERE gameID=".$gameID." AND user_index IN 
                                    (
                                        SELECT ((COUNT(userID) +
                                            (
                                                SELECT stage
                                                FROM game_playing
                                                WHERE gamePlayingID= ".$gameplayingID."
                                            ))%4+1) AS orderUserID
                                        FROM gameplaying_user_cards
                                        WHERE gamePlayingID= ".$gameplayingID." AND cardOrder!=-1
                                    )";

                                
                            //echo $query;
                            
                            $result= mysql_query($query);    
                            
                            
                            
                            $currentUserID= mysql_fetch_array($result);
                            $currentUserID= $currentUserID['userID'];
                            
                            
                            
                            break;
        }
        
        
        //echo '!!!!!!!!!!!!!!';
        //echo $currUserID;
        //echo '/*, c1 "abc"*/';

        // вот этот злополучный участок кода!
        // без предыдущих echo ничего не хочет работать
        
        return $currentUserID;
    }



Ещё раз повторюсь, код абсолютно рабочий. И просьба не обращать внимания на непроверяемость входных данных и подобные "мелочи" - речь не об этом smile 

Добавлено @ 10:03
NewDima, 
вот мне тоже это непонятно. я честно говоря даже не знаю что выводить в файл. если выводить значение возвращаемой переменной - оно выводится. Если не выводить, во вторую функцию оно не передаётся. Если выводить var_dump($actionUserID) - выводится NULL



Это сообщение отредактировал(а) krinart - 18.9.2009, 10:12
PM MAIL ICQ   Вверх
bars80080
Дата 18.9.2009, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



156-я строчка - что это?
PM MAIL WWW   Вверх
NewDima
Дата 18.9.2009, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



Я ошибку не вижу, но могу посоветовать ооочень корявый метод, но возможно он поможет: ob_start(), ob_get_contents.
В стдаут не выведет, а работать можеь будет, но это нехорошо конечно

Добавлено через 50 секунд
bars80080, да этот код вообще не будет интерпретироваться, там же ошибки после копирования
PM ICQ   Вверх
krinart
Дата 18.9.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



bars80080, уже поправил. просто при копировании вылезло


NewDima, У меня в начале скрипта ob_start(); есть, в конце ob_end_flush();

Куда этот ob_get_contents вставлять? в конец скрипта?
PM MAIL ICQ   Вверх
NewDima
Дата 18.9.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



ну, можно исхитриться примерно так:
Код

$content = ob_get_contents(); //поймать все, что было выведено
ob_clean();
echo 1111;
ob_clean();
echo $content;

!!! Но, даже если этот эхо-вывод поможет, советую искать корень ошибки

Это сообщение отредактировал(а) NewDima - 18.9.2009, 10:26
PM ICQ   Вверх
bars80080
Дата 18.9.2009, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



во второй функции не обыгрываются все варанты. 

return $currentUserID; нет дефолтной ситауции, если $mode не равно turns или orders ничего не выведет.
хотя должен выдать ошибку
PM MAIL WWW   Вверх
krinart
Дата 18.9.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



NewDima, чуток поэкспериментировал - вобще непонятно что и в какой кодировке выводит, результат работы всего скрипта:

"�hG"

Хотя должно быть, естественно, на порядок больше.
 Можеть, хоть подскажите, в какую сторону копать-то? Я не прошу чтобы за меня решили.. просто подтолкните...вывод, переполнение памяти.. не знаю, что там ещё может быть? На что влияет echo, что её присутствие или отсутствие так категорично сказывается на наличие переменной и вобще работу скрипта?

Добавлено через 1 минуту и 53 секунды
bars80080, пока что всё работает в условиях "по-умолчанию". Никаких непредвиденных ситуаций быть не может. Я мониторю всё, что приходит на сервер. Ошибка не в логике, это я могу сказать с уверенностью

Добавлено через 4 минуты и 31 секунду
bars80080, добавил 

default: break;

Результат тот же(
PM MAIL ICQ   Вверх
bars80080
Дата 18.9.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(krinart @  18.9.2009,  10:36 Найти цитируемый пост)
default: break;

надо было добавить 

Код

default: $currentUserID = ''; break;

PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.