2012-08-03 3 views
0

Я пытаюсь написать проверку поставщиков и моделей в форме, я поставил вместеКак объединить выражения «и» и «if» в PHP?

Вот relavent часть формы

<table width="75%"> 
<form action="?" method="post"> 
<tr> 
<td colspan="6" align="center"> 
<font size="5"><b>Add new record</b></font> 
</td> 
</tr> 
<tr> 
<td align="right"> 
<b>Vendor:</b> 
</td> 
<td> 
<select name="vendor"> 
<option value="ClearAccess">ClearAccess</option> 
<option value="VisionNet">VisionNet</option> 
<option value="Other">Other</option> 
</select> 
</td> 
<td align="right"> 
<b>Model:</b> 
</td> 
<td> 
<select name="model"> 
<option value="NotModel">--ClearAccess--</option> 
<option value="AG10W">AG10W</option> 
<option value="SR100G">SR100G</option> 
<option value="SR300N">SR300N</option> 
<option value="SR350N">SR350N</option> 
<option value="SR500N">SR500N</option> 
<option value="NotModel">--VisionNet--</option> 
<option value="M404">M404</option> 
<option value="M405">M405</option> 
<option value="M505">M505</option> 
<option value="M505n">M505N</option> 
<option value="Legacy">Legacy</option> 
</select> 
</td> 

моя форма хороша. моя проблема в том, когда я создаю цикл if. Вот что у меня есть до сих пор

if ($_POST['vendor']='ClearAccess') && ($_POST['model']='M404') || ($_POST['model']='M405') || ($_POST['model']='M505') || (_$POST['model']='M505N') || ($_POST['model']='Legacy') 
echo "You have not selected a valid vendor/model combination" 

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

Я также собираюсь создать, если заявление, подобное этому

if ($_POST['vendor']='VisionNet') && ($_POST['model']='AG10W') || ($_POST['model']='SR100G') || ($_POST['model']='SR300N') || (_$POST['model']='SR350N') || ($_POST['model']='SR500N')|| ($_POST['model']='Legacy') 
echo "You have not selected a valid vendor/model combination" 

Я полностью открыт для делать это различными способами. В конце концов я превращу это в java-скрипт, где вы выбираете поставщика и получаете только подходящие модели для этого поставщика. Полагаю, что я все еще изучаю PHP и не изучил даже основы Java, но я хочу попробовать это так.

+0

_ "valid" _ должно быть _ "invalid" _ – radikaos

+4

Убедитесь, что вы понимаете разницу между '=' и '=='. 'if ($ _POST ['vendor'] = 'VisionNet')' всегда будет возвращать true, потому что вы выполняете назначение, а не сравнение. –

+0

@TimFountain в 'if ($ _ POST ['vendor'] = 'VisionNet')' закрывающая скобка также завершает оператор 'if' – Matt

ответ

0

Вы должны использовать == вместо = в ваших условиях.

Таким образом, вместо:

if ($_POST['vendor']='ClearAccess') && ... 

использование

if ($_POST['vendor'] == 'ClearAccess') && ... 

Лучше иметь ваше состояние, если так:

if ($_POST['vendor'] == 'ClearAccess') && 
    str_replace(array('M404', 'M405', 'M505', 'M505N', 'Legacy'), '', $_POST['model']) 
     != $_POST['model'] 
    ) 
    echo "You have not selected a valid vendor/model combination" 
+0

Это правда, но наименьшая проблема OP. – Matt

+1

@Matt: Я не знаю о «наименее проблемах OP»; это довольно серьезная причина неудачи. «Условия» всегда будут возвращать истину независимо от исходных значений, потому что все становится равным правдивому значению (которое возвращается как значение этого выражения). Таким образом, даже если значения || s и && s и скобки были правильными, условие все равно будет сильно нарушено. – cHao

1

Вот ваши проблемы:

  1. Использование = вместо ==
  2. Не размещая () в if заявлении

переход от

if ($_POST['vendor']='ClearAccess') && ($_POST['model']='M404') || ($_POST['model']='M405') || ($_POST['model']='M505') || (_$POST['model']='M505N') || ($_POST['model']='Legacy') 

к:

if (($_POST['vendor']=='ClearAccess') && ($_POST['model']=='M404') || ($_POST['model']=='M405') || ($_POST['model']=='M505') || (_$POST['model']=='M505N') || ($_POST['model']=='Legacy')) 
1

Во-первых, вам нужно использовать === вместо от =. Единица равнозначает назначение задания, а не сравнение.

Во-вторых, то, что я думаю, что вы пытаетесь сделать, это сказать «, если это этот продавец и один из этих моделей, сделать что-то Если это так, попробуйте это:.

if($_POST['vendor'] === 'ClearAccess' && (*various models, using ||*)) 
     //dostuff 

Таким образом, это будет приравнивать к true если поставщик равно как и по крайней мере одна из моделей.

лучший способ сделать это было бы создать массив различных моделей, а затем использовать РНР in_array()

+0

почему '===' вместо '=='? – mlishn

+0

Это лучшая практика. '==' будет делать преобразование типов, что может вызвать странные ошибки. http://stackoverflow.com/questions/80646/how-do-the-equality-double-equals-and-identity-triple-equals-comparis – SomeKittens

+0

huh, никогда не знал этого, спасибо :) – mlishn

0

You следует посмотреть на синтаксис php, если а затем http://php.net/manual/en/control-structures.if.php, потому что ваш синтаксис неверен.Вы назначаете свои почтовые переменные другие значения, чем при использовании ==

если ($ _POST [ 'поставщика'] == 'VISIONNET')
Кроме того, вы должны пересмотреть свою $$ и || использовать и решить, что на самом деле говорит в вашей программе.

0

Оберните свой & & в пределах его собственного круга круглых скобок. Итак, пример ниже говорит, что если POST [поставщик] является Clear Acces, а POST [модель] - M404, или POST [модель] - это M405, M505, M505N или Legacy.

if (($_POST['vendor']=='ClearAccess') && ($_POST['model']=='M404')) || ($_POST['model']=='M405') || ($_POST['model']=='M505') || (_$POST['model']=='M505N') || ($_POST['model']=='Legacy') 
echo "You have not selected a valid vendor/model combination" 
3

Уменьшите свою логику. Начните с того, что вы хотите делать в общих утверждениях.

A = "Vendor is VisionNet" 
B = "Model is AG10W" 
C = "Model is SR100G" 
etc. 

Затем запишите вашу логику

if (A and (B or C)) 

ИЛИ

if ((A and B) or C) 

и т.д.

Затем заменить местоблюстителем с PHP эквивалент.

В PHP, если вы пытаетесь увидеть, если х является одним из многих значений, вы можете использовать метод in_array():

$models = array('AG10W', 'SR100G', 'SR300N', 'SR350N', 'SR500N', 'Legacy'); 

// if the vendor is vision net OR the model is in the list of models defined in $models, do something 
if ($_POST['vendor'] == 'VisionNet' || in_array($_POST['model'], $models)) { 
    // do something. 
} 

Принять operators во внимание, как хорошо. Назначение отличается от сравнения.

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

я упоминаю потому, что ты написал это:

if ($_POST['vendor'] = 'VisionNet') || ... 

Вот ссылка на учебник по discrete mathematics который является причудливым способом сказать «математика логики».

Кроме того, для всех желающих, Массачусетский технологический институт (Массачусетский технологический институт) предлагает бесплатные курсы онлайн бесплатно, один из которых - mathematics of computer science, в котором подробно рассматривается дискретная математика.

+1

Не удалось написать лучше этого. – Oussama

+0

@Yazmat Я попытался сделать это как можно более ясным. Проблема не всегда была PHP, но и отсутствием знаний о том, как работает логика. OP требует дискретного курса математики. – Matt

0

Вы должны поместить ваши() 's право ...

Просто, чтобы вы знали о синтаксисе, вот код с хорошей линией ломает :)

if (
($_POST['vendor'] == 'ClearAccess' && $_POST['model'] = 'M404') || 
$_POST['model'] == 'M405' || 
$_POST['model'] == 'M505' || 
$_POST['model'] == 'M505N' || 
$_POST['model'] == 'Legacy' 
) { 
echo "You have not selected a valid vendor/model combination" 
} 

и без linebreaks:

if (($_POST['vendor'] == 'ClearAccess' && $_POST['model'] == 'M404') || $_POST['model'] == 'M405' || $_POST['model'] == 'M505' || $_POST['model'] == 'M505N' || $_POST['model'] == 'Legacy') { 
echo "You have not selected a valid vendor/model combination" 
} 

Ваше другое утверждение аналогичным образом.