Проверка значения цены для вставки в таблицу продаж

#php #mysql

#php #mysql

Вопрос:

У меня есть форма с одним из таких входных данных:

 <input name="price" type="text" />
  

Я проверяю его, чтобы я мог вставить в базу данных. Требование, которое я хотел бы иметь, это:

  • допускается только число.
  • если она пуста, значение будет равно 0 (нулю) при вставке в таблицу продаж.

1) Шаг проверки, подобный этому:

 // Validate price:
if (empty($_POST['price'])){
    $price = 0;
} elseif(!empty($_POST['price'])) {
    $price = is_decimal($_POST['price']);
} else {
    $price = TRUE;
}
  

2) запрос для вставки цены в таблицу продаж:

 $q ="INSERT INTO sales (price) VALUES ('$price')";
  

После выполнения запроса с ПУСТЫМ значением для переменной $ price я проверил таблицу продаж и обнаружил, что значение, которое вставлено в столбец цены, равно 1.00, но не 0.00, как я ожидал.

Что я сделал не так? И вы можете помочь? Спасибо

Примечания:

Эта функция называется is_decimal:

 function is_decimal ($price){
   $price = trim($price);
   $price = preg_match('/^(d)(.d)?$/', $price);
   $price = round($price, 2);
return $price;
}
  

Sales таблица:

 $query = 'CREATE TABLE sales (
        sale_id int(10) unsigned NOT NULL auto_increment,
        price decimal(6,2) unsigned NOT NULL,
        PRIMARY KEY  (sale_id),
        ) ENGINE = MYISAM';       
  

Комментарии:

1. Вы могли бы просто выполнить приведение: $price = (float) 0; . Я не знаю, что вы делаете с $price = true; (который является обоими else результатами); true вычисляется как 1 при принудительном использовании. Уделяйте больше внимания вашему логическому потоку.

2. Джаред прав. вероятно, вам следует попробовать привести свой результат. к тому времени, как он начнет поступать в базу данных в настоящее время, $price имеет значение TRUE . TRUE равно 1

3. Почему вы заключаете $price в ' в INSERT ? Это делает его строкой, не совсем уверен, что mysql это действительно нравится. В любом случае, вам следует избегать интерполяции переменных в коде SQL. Используйте mysqli или PDO с подготовленным оператором и связанными параметрами.

4. @jcaron — Для этого, конечно, есть справочная страница .

5. @Jared. Спасибо, и я использую не (float), а (int), потому что столбец таблицы определен как десятичный (6,2). И я заменяю TRUE на isset($ _POST[‘price’]) для моего конкретного случая. Сейчас у меня все работает нормально. Еще раз, большое спасибо

Ответ №1:

Проблема, в частности, в вашей функции preg_match . Вы получаете 1 , потому что именно столько совпадений было найдено. Для исправления вы можете просто добавить результирующую переменную для вывода в:

 function is_decimal ($price){
        $price = trim($price);
        preg_match('/^(d)(.d)?$/', $price, $result);
        $price = round($result, 2);
return $price;
}
  

Комментарии:

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

2. Согласен с проблемой prey_match, но is_decimal не должен вызываться в «пустом» случае…

3. Взгляните на приведенный здесь пример, он должен дать вам четкое представление о том, что происходит. Также в зависимости от вашего php вам может потребоваться использовать $result[0] для переменной match, поскольку это массив.

4. @jcaron, я только что заметил, что вы упомянули о том, что пустой вызов не используется is_decimal ; и, как вы с Джаредом оба указали, похоже, что в коде больше одной ошибки.

5. @JaredFarrish, полностью согласен с мнением там — под рукой множество проблем. Обычно я остаюсь в стороне от SQL-кода, но ошибки с регулярными выражениями я могу обнаружить довольно быстро. 🙂