Я вставляю нулевые записи, когда я ничего не вводил

Я пытаюсь сначала проверить NULL и, если значение равно NULL, пропустите INSERT, Но это не то, что происходит. Код вставляет пустые записи, хотя я ничего не вводил в поле формы. Это почти как признание того, что не существует.

<cfoutput>
<cfif form.TBCom is not ""> 
    <cfquery name="TestTBComm" datasource="TrenaTest">
        INSERT INTO Comment1 (
            UniqueNum,
            ComTyp,
            Comments )
        SELECT 
           '#UniqueNum#',
           '#TBComV#',
           '#TBCom#'
    </cfquery>
</cfif>
</cfoutput>

3 ответа

Предыдущие ответы верны, так как при тестировании общих строк проверка NULL не применяется в CF. Вы либо проверяете длину или значение.

Этот запрос напугал меня настолько, что я подумал, что необходим полный пример. Обязательно, чтобы КАЖДОЕ поле запроса, чьи данные были предоставлены пользователем, содержалось в CFQUERYPARAM. Ищите термин " инъекция SQL" по причинам, почему.

Этот запрос должен работать для вас:

<cfquery name="TestTBComm" datasource="TrenaTest">
    INSERT INTO Comment1 (
        UniqueNum,
        ComTyp,
        Comments )
    VALUES (
        <cfqueryparam cfsqltype="cf_sql_integer" value="#FORM.UniqueNum#">
        , <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.TBComV#" NULL="#!Len(FORM.TBComV)#">
        , <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.TBCom#" NULL="#!Len(FORM.TBCom)#">
    )
</cfquery>

В параметре NULL обратите внимание на "!", Который инвертирует результат функции LEN().

Если вы имеете в виду, что хотите пропустить вставку, когда поле формы пусто, trim() это сначала и проверьте длину. Затем пропустите вставку, если длина равна 0:

 <cfif len(trim(form.TBCom))>
      not empty. do the insert ...
 </cfif>

Как в стороне, вам не нужно cfoutput метки вокруг cfquery, Переменные будут оцениваться автоматически. Кроме того, вы должны использовать cfqueryparam на все пользовательские параметры ( см. ответ Майка для примера) и убедитесь, что ваши переменные находятся в области видимости, т.е. form.TBCom не просто TBCom,

Приведенный выше код НЕ вставит пустые значения в указанные 3 столбца (uniqueNum, comTyp и комментарии). Это вставило бы пустые строки - что не то же самое, что NULL.

Кроме того - я согласен с Ли, что правильный синтаксис должен быть:

   <cfquery name="TestTBComm" datasource="TrenaTest">
        INSERT INTO Comment1 (
            UniqueNum,
            ComTyp,
            Comments )
        VALUES (
           '#UniqueNum#',
           '#TBComV#',
           '#TBCom#'
           )
    </cfquery>

Итак... где эти нули происходят? Если они находятся в других столбцах в БД (которые не являются частью этого запроса), это потому, что вы не вставляете их в эти столбцы, и для них задано значение "разрешить пустые значения", и у них нет значения "по умолчанию".

Другие вопросы по тегам