У меня есть функция, ниже которой работает отлично, но теперь клиент вернулся и попросил, чтобы номер был сделан только для поиска, потому что большинство его клиентов не будут вводить суффикс "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']);
?>
Измените запрос как показано ниже?
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
В некоторых моих кодах я использую следующую стратегию:
# 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 и могут предпочесть использовать их для создания своего однозначного соответствия; и логически, что попытка должна быть вставлена до того, как я начну суффикс или обертывать ее своими собственными подстановочными знаками.
Вот почему я использую эту конкретную последовательность попыток сопоставления.
Кажется, что у вас могут быть продукты с одинаковым номером, но не с тем же суффиксом? как 8512n и 8512h? Вы можете использовать LIKE '% $code%'
$sql = "SELECT * FROM isproducts WHERE prodCode LIKE '%".$prodCode."%' AND AllowSalesOrder = ''";
и я думаю, что это более безопасный способ в вашем случае, чтобы все продукты, содержащие номер, появлялись независимо от суффикса или префикса.
Вышеуказанное может возвращать более одного продукта, поэтому пользователю по-прежнему нужно выбрать, какой он он на самом деле ищет.
Вы можете использовать% wild card для этой проблемы.