Как я могу запросить MySQL только с цифрами, когда пользователь может ввести суффикс?

0

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

38039 или 38039h

Однако он также сказал, что у него есть только одна группа кодов продуктов, которые начинаются с "T", поэтому они могут вводить "T760", и в этом случае нам нужен префикс.

Мой код ниже выполняет поиск точного продукта в настоящее время, может ли кто-нибудь помочь мне работать в этих примерах?

<?php 

//Find Stock Value
function checkstock($prodCode) { 

  $prodCode = strtoupper($prodCode);

  require '../../../../config.php';
  $dbh = new PDO(DB_DSN, DB_USER, DB_PASS);
  $sql = "SELECT * FROM isproducts WHERE prodCode = '".
         $prodCode."' AND AllowSalesOrder = '1'"; 
  $stmt = $dbh->query($sql);
  $obj = $stmt->fetch(PDO::FETCH_OBJ);

  $count = $stmt->rowCount();

  echo ($count == 1 ? 
   ROUND($obj->FreeStockQuantity, 0) : 'Invalid product code '.$prodCode.'');   

}

//Call Stock Function
checkstock($_POST['productcode']);

?>
Теги:

5 ответов

2
Лучший ответ

Измените запрос как показано ниже?

SELECT * FROM isproducts 
WHERE 
  (
    prodCode='{$prodCode}'          // for product with prefix or suffix
    OR prodCode LIKE '{$prodCode}%' // without suffix
    OR prodCode='T{$prodCode}'      // without prefix
  )
  AND AllowSalesOrder = ''"; 

Дикая карта с одиночным символом

 OR prodCode LIKE '{$prodCode}_' // single character wild-card
  • 0
    Почему бы просто не использовать LIKE '% ". $ ProdCode."%'? Это позаботится обо всем вышеперечисленном проще.
  • 2
    @Spiros - Вам нужно решить проблему с производительностью,% any% НЕ будет использовать индекс для поиска
Показать ещё 12 комментариев
0

проверьте это.

http://www.w3schools.com/SQL/sql_wildcards.asp

может быть полезно...: -)

0

В некоторых моих кодах я использую следующую стратегию:

# psuedo-code ... NOT intended for real use:
SELECT COUNT(*) FROM someTable WHERE someColumn = "{XXX}"
# If that returns exactly one than use the corresponding query
SELECT COUNT(*) FROM someTable WHERE someColumn LIKE "{XXX}"
# If that returns exactly one then use it
SELECT COUNT(*) FROM someTable WHERE someColumn LIKE "{XXX}%"
# If that returns exactly one then use it
SELECT COUNT(*) FROM someTable WHERE someColumn LIKE "%{XXX}%"
# If that returns exactly one then use it

... (где {XXX} является заполнителем для поискового запроса пользователя).

Идея здесь в том, что я сначала попробую точное совпадение, затем я пробую ее в предположении, что этот термин уже может содержать групповые символы SQL, затем я пытаюсь суффиксной карты% wild, и, наконец, я пытаюсь ее обернуть с помощью% wild cards.

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

(На самом деле я использую функции интерполяции параметров Python или Perl или дезинфицирую свои входы, чтобы позволить wild cards, предотвращая SQL-инъекции, поэтому код не похож на то, что я показываю здесь. передать общую идею).

Моя цель - разрешить вызов моих скриптов с минимальными однозначными аргументами, которые звучат примерно так же, как и ваши клиенты.

С точки зрения удобства использования большинство пользователей получат первые символы любого права ввода. Таким образом, точное совпадение, соответствующее суффиксному подстановочному матчу, скорее всего, будет успешным в большинстве случаев. В моем случае мои пользователи, скорее всего, будут знакомы с подстановочными знаками SQL и могут предпочесть использовать их для создания своего однозначного соответствия; и логически, что попытка должна быть вставлена ​​до того, как я начну суффикс или обертывать ее своими собственными подстановочными знаками.

Вот почему я использую эту конкретную последовательность попыток сопоставления.

  • 0
    Извините за наглость, нет различий между запросом один и запросом два ...
0

Кажется, что у вас могут быть продукты с одинаковым номером, но не с тем же суффиксом? как 8512n и 8512h? Вы можете использовать LIKE '% $code%'

$sql = "SELECT * FROM isproducts WHERE prodCode LIKE '%".$prodCode."%' AND AllowSalesOrder = ''";

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

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

  • 0
    Позволит ли это, если они введут H или T?
  • 0
    Это позволит что-нибудь связать с введенным кодом. n8500, h8500, gh8500, 9500p независимо от того, что число находится между и без символа (например, если у вас есть код продукта 85c50 и пользовательский тип 8550, он не найдет его). Вы также можете проверить mysql, как здесь: dev.mysql.com/doc/refman/5.0/en/…
Показать ещё 4 комментария
0

Вы можете использовать% wild card для этой проблемы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню