MySQL / PHP Query - PullRequest
       22

MySQL / PHP Query

0 голосов
/ 15 мая 2009

У меня есть 3 группы полей (каждая группа состоит из 2 полей), которые я должен проверить по некоторым условиям. Я проверяю не каждое поле, а некоторую комбинацию, например:

  1. групповая ценаEurBus, ценаLocalBus
  2. групповая цена EurAvio, цена LocalAvio
  3. групповая ценаEurSelf, priceLocalSelf

Мой пример (отформатирован для удобочитаемости) & mdash; как это можно улучшить?

$rest .="
WHERE 
  (
    ((priceEurBus+(priceLocalBus / ".$ObrKursQuery.")) <= 400) 
    OR 
    ((priceEurAvio+(priceLocalAvio / ".$ObrKursQuery.")) <= 400) 
    OR
    ((priceEurSelf+(priceLocalSelf / ".$ObrKursQuery.")) <= 400)
  )
";

$ObrKursQuery - это значение, которое я использую для перевода местной валюты в евро.

Ответы [ 2 ]

1 голос
/ 15 мая 2009

Повышение производительности: ваш запрос основан на ИЛИ, что означает, что он прекратит оценивать условия, как только обнаружит, что одно из них является истинным. Попробуйте упорядочить ваши условия таким образом, чтобы, например, в вашем случае первая проверка с наибольшей вероятностью была меньше 400.

Улучшение безопасности: используйте подготовленные операторы и отфильтруйте свои переменные перед их использованием. В случае $ ObrKursQuery, если он поступает из пользовательского ввода или ненадежного источника, это числовое значение без кавычек, и вы сталкиваетесь с большим разнообразием проблем внедрения SQL (включая арифметическое внедрение SQL: если это значение равно 0 , вы получите ошибку DivByZero, которую можно использовать как условие слепого внедрения SQL).

Улучшение читаемости: всегда будьте последовательны в том, как вы пишете свой код, и, если возможно, следуйте некоторому общепринятому фактическому стандарту, например, начинайте с имен переменных в нижнем регистре: $ ObrKursQuery -> $ obrKursQuery. Также для самодокументируемого кода выберите имена для ваших переменных, которые означают, что они являются: $ ObrKursQuery -> $ translationRatio.

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

0 голосов
/ 15 мая 2009

Никогда не используйте конкатенацию для генерации SQL, вы должны использовать подготовленные операторы SQL с параметрами.

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

Таким образом, вам нужно создать отношение «один-много» между товаром и ценами.

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