#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-кода, но ошибки с регулярными выражениями я могу обнаружить довольно быстро. 🙂