2013-03-14 1 views
1

Это мой код:Как разместить несколько условий NOT внутри инструкции cfif?

<cfif (CFFILE.FileSize GT (4194304))> 
Delete File 
<cfelseif CFFILE.serverFileExt neq "png" > 
Delete File 
<cfelse> 
It's ok 
</cfif> 

Я хочу добавить «JPG» и «JPEG» в список разрешенных типов файлов. Я пробовал, но без успеха.

<cfif (CFFILE.FileSize GT (4194304))> 
Delete File 
<cfelseif ((CFFILE.serverFileExt neq "png") OR (CFFILE.serverFileExt neq "jpg") OR (CFFILE.serverFileExt neq "jpeg")) > 
Delete File 
<cfelse> 
It's ok 
</cfif> 

Любые идеи?

РЕШЕНИЕ:

Мои ИЛИ заявление должно быть И, спасибо Мигель-F, и с Busches Improvment, это конечный результат:

<cfif (CFFILE.FileSize GT (4194304))> 
    Delete File 
<cfelseif NOT ListFindNoCase("jpg,jpeg,png", CFFILE.serverFileExt)> 
    Delete File 
<cfelse> 
    It's ok 
</cfif> 

Спасибо, ребята!

+2

Использование и вместо или – Travis

ответ

3

Ваш код синтаксически корректный, но логика неверна. Это условие всегда будет истинным, потому что вы используете OR. Как только одно из условий верно, условие проходит. Попробуйте использовать AND вместо этого, как это:

<cfif (CFFILE.FileSize GT (4194304))> 
    Delete File 
<cfelseif (CFFILE.serverFileExt NEQ "png") AND (CFFILE.serverFileExt NEQ "jpg") AND (CFFILE.serverFileExt NEQ "jpeg")> 
    Delete File 
<cfelse> 
    It's ok 
</cfif> 

См Busches ответ способ вы можете конденсироваться ваш код немного, если вы используете функцию ColdFusion ListFindNoCase().

+5

Хотя его проблема не используется 'AND', я также рекомендую ему перейти на'! ListFind ("png, jpg, jpeg", cffile.ServerFileExt) 'вместо того, чтобы писать одно и то же условие снова и снова. – Busches

+0

Ahhh вы правы! Спасибо! – Amir

+0

@Busches пишут это как ответ. Легче читать и поддерживать. Я проголосовал за него – Travis

2

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

Я считаю, что это будет иметь эффект, который вы ищете.

<cfelseif ((CFFILE.serverFileExt neq "png") 
     AND (CFFILE.serverFileExt neq "jpg") 
     AND (CFFILE.serverFileExt neq "jpeg")) > 

Вы не ищете ситуации, когда потенциально удаленный файл удовлетворяет любой один условий (что и «ИЛИ» делает), потому что любое расширение файла будет неравным, по крайней мере, 2 из 3 вариантов.

Скорее, вы ищете ситуации, в которой потенциально удаленном файловом удовлетворяет все условий (что «И» делает.

8

Как заявил Мигель-F, ваш вопрос вам нужно использовать AND вместо OR. Я также рекомендую, в таких случаях, чтобы переключиться на использование ListFindNoCase() вместо использования нескольких OR/AND заявлений.

<cfif CFFILE.FileSize GT 4194304> <!--- You also don't need all those() here ---> 
    Delete File 
<cfelseif NOT ListFindNoCase("png,jpg,jpeg", cffile.ServerFileExt)> 
    Delete File 
<cfelse> 
    It's ok 
</cfif> 

ListFindNoCase является гораздо более кратким и легким для чтения и поддерживать. Обратите внимание, как указано в

+0

Вместо этого я бы использовал 'ListFindNoCase', чтобы игнорировать случай SeNsiTiVITy. –

+1

+1. Функции списка обычно более читабельны, если вы выходите за пределы двух значений/условий. – Leigh

+0

@ Miguel-F duh, обновлено. – Busches