Сравните строки, заданные в $ _POST с php - PullRequest
4 голосов
/ 09 октября 2008

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

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 ['размеры'], и это дает мне именно такую ​​вещь.

Ответы [ 9 ]

8 голосов
/ 09 октября 2008

Что Пол Диксон сказал правильно. Могу ли я также рекомендовать использовать оператор switch вместо этого неуклюжего куска операторов if (который на самом деле содержит логическую ошибку, я мог бы добавить - $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;
}

?>
3 голосов
/ 09 октября 2008

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

Кроме того, без использования elseif для Среднего и Большого, если ваш $ _POST ['размеры'] не Большой, то ваш общий $ всегда будет $ _POST ['цена']. Это также может сбить вас с толку.

2 голосов
/ 09 октября 2008

Итак, вы знаете, проблема с вашими 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 и т. Д.

1 голос
/ 04 февраля 2009

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

<select name="sizes">
    <option value="small">Small ($30)</option>
    <option value="meduim">Medium ($40)</option>
    <option value="large">Large ($50)</option>
</select>
1 голос
/ 04 февраля 2009

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

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

$total = array_key_exists($_POST['sizes'], $vals)
    ? $vals[$_POST['sizes']]
    : $_POST['price'];
1 голос
/ 09 октября 2008

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

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'];}

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

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

0 голосов
/ 04 февраля 2009
// 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'];
0 голосов
/ 04 февраля 2009

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

0 голосов
/ 04 февраля 2009

Является ли $ total строкой?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...