2008-10-08 3 views
4

У меня есть форма, которая отправляет размеры вещей, и мне нужно посмотреть, что строки равны, чтобы я мог установить цену соответственно. Когда я пытаюсь это сделать, он говорит, что они не равны, и я не получаю никаких цен. Это код, который я использую:

if ($_POST['sizes'] == "Small ($30)"){$total = "30";} 
if ($_POST['sizes'] == "Medium ($40)"){$total = "40";} 
if ($_POST['sizes'] == "Large ($50)"){$total = "50";} 
else {$total = $_POST['price'];} 

Что я здесь делаю неправильно? Я могу повторить $ _POST ['размеры'], и это дает мне одну из этих вещей.

ответ

8

Что Paul Dixon said правильно. Мог бы я также рекомендую использовать переключатель заявление вместо того, что неуклюжий кусок, если заявления (которые на самом деле имеет логическую ошибку в этом, я мог бы добавить - $total всегда равна $_POST['price'] когда не 'Large ($50)')

<?php 

switch ($_POST['sizes']) 
{ 
    case 'Small ($30)' : 
     $total = 30; 
     break; 
    case 'Medium ($40)' : 
     $total = 40; 
     break; 
    case 'Large ($50)' : 
     $total = 50; 
     break; 
    default: 
     $total = $_POST['price']; 
     break; 
} 

?> 
+0

Great Bailey's think like! – Adam 2008-10-08 20:35:19

+0

Исправлена ​​возможная ошибка. Надеюсь, вы не против. – strager 2009-02-04 00:08:54

+0

@strager: Ни один из них не является ошибкой, а второй - даже стандартами кодирования Zend. – flussence 2009-02-04 00:17:45

1

Попробуйте использовать одиночные кавычки

if ($_POST['sizes'] == 'Small ($30)'){$total = "30";} 
elseif ($_POST['sizes'] == 'Medium ($40)'){$total = "40";} 
elseif ($_POST['sizes'] == 'Large ($50)'){$total = "50";} 
else {$total = $_POST['price'];} 

строк в двойных кавычках с помощью переменной интерполяции, так что символ $ становится значимым! См. this manual page о различиях в том, как вы можете объявлять строковые литералы в PHP.

(ред исправить логическую ошибку - как и другие отметили, переключатель будет гораздо понятнее здесь)

3

Это хороший кандидат для оператора switch/case, когда ваш 'else' является значением по умолчанию.

Кроме того, без использования elseif на Medium и Large, если ваш $ _POST ['размеры'] не является большим, тогда ваш $ total всегда будет $ _POST ['price']. Это тоже может отбросить вас.

2

Знаете ли вы, что проблема с вашим if/else заключается в том, что последнее происходит всегда. Переключатель еще лучше, но вот то, что код должен быть:

if ($_POST['sizes'] == "Small ($30)") { $total = "30"; 
} else if ($_POST['sizes'] == "Medium ($40)") { $total = "40"; 
} else if ($_POST['sizes'] == "Large ($50)") { $total = "50"; 
} else { $total = $_POST['price']; } 

Для всех, кто говорит, что проблема заключается в $ 30, $ 40, и т.д., это не так. Переменные не могут начинаться с числа, поэтому PHP игнорирует $ 40 и т. Д.

+0

Возможно, вы правы. Еще один общий совет - использовать одинарные кавычки, когда вам не нужны интерполяции/escape-последовательности, чтобы избежать дополнительной работы у интерпретатора. – PhiLho 2008-10-08 21:19:36

+0

Вы правы, но разница в скорости для интерпретатора составляет ms за миллионы повторений. Самое большое различие заключается в написании строк с HTML в них и необходимости избегать всех двойных кавычек. – 2008-10-08 21:31:40

0

Есть ли $ total string?

$ total = "30"; является синтаксисом для строки. $ total = 30; будет правильным для Numeric.

0

Здесь нет дыры в безопасности? Что, если кто-то просто подает любую цену, которую они хотят для предложения по умолчанию?

1

Или, даже лучше, чем неуклюжий переключатель, вы можете воспользоваться этой простой логики и практики «программирования управляемых данными»:

$vals = array(
    'Small ($30)' => 30, 
    'Medium ($40)' => 40, 
    'Large ($50)' => 50 
); 

$total = array_key_exists($_POST['sizes'], $vals) 
    ? $vals[$_POST['sizes']] 
    : $_POST['price']; 
0
// remove any non-decimal characters from the front, then extract your value, 
// then remove any trailing characters and cast to an integer 
$total = (integer)preg_replace("/^\D*(\d+)\D.*/", "$1", $_POST['sizes']); 
if (!$total) $total = $_POST['price']; 
1

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

<select name="sizes"> 
    <option value="small">Small ($30)</option> 
    <option value="meduim">Medium ($40)</option> 
    <option value="large">Large ($50)</option> 
</select> 
Смежные вопросы