SQL, “ЕСЛИ”, “НАЧНИТЕ”, “ЗАКОНЧИТЕСЬ”, “ЗАКОНЧИТЕ ЕСЛИ”?

Предупреждение: невозможно изменить информацию заголовка - уже отправленные заголовки

Случается, когда ваш скрипт пытается отправить HTTP-клиенту клиенту, но он уже был выведен ранее, что привело к тому, что заголовки уже отправлены на клиент.

Это E_WARNING , и он не остановит сценарий.

Типичным примером может быть файл шаблона, подобный этому:


    
    My Page

...

Функция session_start() попытается отправить клиенту файлы cookie сеанса. Но PHP уже отправил заголовки, когда он написал элемент в выходной поток. Вам нужно будет переместить session_start() в верхнюю часть.

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

Часто пропускаемый вывод - это новые строки после закрытия PHP ?>. Считается стандартной практикой опускать ?>, когда это последняя вещь в файле. Аналогичным образом, еще одной распространенной причиной этого предупреждения является то, что перед открытием перед ним появляется пустое пространство, строка или невидимый символ, в результате чего веб-сервер отправляет заголовки и пробел / новую строку, таким образом, когда PHP начинает синтаксический анализ, он не сможет для отправки любого заголовка.

Если в вашем файле содержится более одного кодового блока , у вас не должно быть пробелов между ними. (Примечание: у вас может быть несколько блоков, если у вас есть код, который был автоматически сконструирован)

Также убедитесь, что в вашем коде не указаны знаки байтового заказа, например, когда кодировка скрипта является UTF -8 с BOM.

Вопросы, относящиеся

40
задан MrBoJangles 10 January 2012 в 21:44
поделиться

9 ответов

Откровенно это походит на что-то, что должно быть на прикладном уровне, не слое базы данных...

-12
ответ дан Andrew G. Johnson 23 September 2019 в 09:15
поделиться

Это имеет отношение к Нормальной форме для языка SQL. IF операторы могут, по определению, только взять единственный SQL-оператор. Однако существует специальный вид SQL-оператора, который может содержать несколько SQL-операторов, BEGIN-END блок.

, Если Вы опускаете BEGIN-END блок, Ваш SQL будет хорошо работать, но это только выполнит первый оператор как часть IF.

В основном, это:

IF @Term = 3
    INSERT INTO @Classes
    SELECT              
        XXXXXX  
    FROM XXXX blah blah blah

эквивалентно тому же самому с BEGIN-END блок, потому что Вы только выполняете отдельного оператора. Однако по той же причине, что не включая фигурные скобки на IF оператор в подобном языку C является плохой идеей, всегда предпочтительно использовать BEGIN и END.

46
ответ дан Florian 27 November 2019 в 01:26
поделиться

В SQL нет никакого ENDIF.

оператор непосредственно followig, ЕСЛИ, выполняется только, когда, если выражение верно.

НАЧИНАНИЕ... Конструкция КОНЦА является отдельной от ЕСЛИ. Это связывает несколько операторов как блок, который можно рассматривать, как будто они были отдельным оператором. Следовательно НАЧНИТЕ... КОНЕЦ Может использоваться непосредственно после ЕСЛИ и таким образом целый блок кода в НАЧИНАНИИ.... Последовательность КОНЦА будет или выполнена или пропущена.

В Вашем случае я подозреваю" (больше кода)" следующий XXXXX - то, где Ваша проблема.

24
ответ дан AnthonyWJones 27 November 2019 в 01:26
поделиться

От руки код выглядит правильным. Что, при попытке 'Еще' использовать и видите то, что происходит?

IF @SchoolCategoryCode = 'Elem' 

--- We now have determined we are processing an elementary school...

BEGIN

---- Only do the following if the variable @Term equals a 3 - if it does not, skip just this first part

    IF @Term = 3
    BEGIN
        INSERT INTO @Classes

        SELECT              
            XXXXXX  
        FROM XXXX blah blah blah

        INSERT INTO @Classes    
        SELECT
        XXXXXXXX    
        FROM XXXXXX (more code) 
    END   <----(Should this be ENDIF?)
    ELSE
    BEGIN


        INSERT INTO @Classes    
        SELECT
        XXXXXXXX    
        FROM XXXXXX (more code) 
    END
END
11
ответ дан SquidScareMe 27 November 2019 в 01:26
поделиться

Если это - SQL-сервер MS тогда, что Вы имеете, должен хорошо работать... На самом деле, технически, Вы надеваете; t нужно Начинание & Конец вообще, snce в Блоке начинать-конца существует только один оператор... (Я предполагаю, что @Classes является табличной переменной?)

If @Term = 3
   INSERT INTO @Classes
    SELECT                  XXXXXX  
     FROM XXXX blah blah blah
-- -----------------------------

 -- This next should always run, if the first code did not throw an exception... 
 INSERT INTO @Classes    
 SELECT XXXXXXXX        
 FROM XXXXXX (more code)
3
ответ дан Charles Bretana 27 November 2019 в 01:26
поделиться

Вы могли также переписать код для удаления вложенного оператора 'If' полностью.

INSERT INTO @Classes    
SELECT XXXXXX      
FROM XXXX 
Where @Term = 3   

---- **always** "fall thru" to here, no matter what @Term is equal to - always do
---- the following INSERT for all elementary schools    
INSERT INTO @Classes        
SELECT    XXXXXXXX        
FROM XXXXXX (more code) 
2
ответ дан user25623 27 November 2019 в 01:26
поделиться

Если я помню правильно, и чаще тогда не я делаю... нет никакого КОНЦА, ЕСЛИ поддержка в Проводит-Sql. НАЧИНАНИЕ и КОНЕЦ должны сделать задание. Вы получаете ошибки?

1
ответ дан mattruma 27 November 2019 в 01:26
поделиться

Единственное время, которое не должна запускать вторая вставка в @clases, - то, если ошибка произошла в первом операторе вставки.

, Если это так, тогда необходимо решить, должен ли второй оператор работать до первого ИЛИ если Вам нужна транзакция для выполнения отката.

1
ответ дан NotMe 27 November 2019 в 01:26
поделиться

На основе Вашего описания того, что Вы хотите сделать, код, кажется, корректен как есть. ENDIF не является допустимым ключевым словом управления циклом SQL. Вы уверены, что ВСТАВКИ на самом деле вытягивают данные для помещения в @Classes? На самом деле, если бы это было плохо, то это просто не работало бы.

то, Что Вы могли бы хотеть попробовать, должно поместить несколько операторов печати там. Поместите ПЕЧАТЬ выше каждой из ВСТАВОК, просто производящих некоторый глупый текст, чтобы показать, что та строка выполняется. Если Вы получаете оба вывода, то Ваш ВЫБОР... ВСТАВЬТЕ... подозреваемый. Вы могли также просто сделать ВЫБОР вместо ПЕЧАТИ (то есть, без ВСТАВКИ) и видеть точно, какие данные вытягивают.

0
ответ дан Michael Bray 27 November 2019 в 01:26
поделиться
Другие вопросы по тегам:

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