Метод сопоставления любой строки в SQL - PullRequest
0 голосов
/ 07 декабря 2009

У меня простой запрос SQL,

SELECT * FROM phones WHERE manu='$manuf' AND price BETWEEN $min AND $max

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

$min=$_REQUEST['min_price'];
$max=$_REQUEST['max_price'];
$manuf=$_REQUEST['manufact'];
if (empty($min)){
    $min=0;}
if (empty($max)){   
    $max=900000;}
if (empty($manuf)){
    $manuf='*';}

, который работает нормально для числовых полей (хотя мне не нравится вручную устанавливать такие ограничения), но я не могу понять, как получить универсальное соответствие для текстового поля. Я думал * сделает это, так как он соответствует всем именам строк, но, видимо, нет. Кто-нибудь знает, как это сделать?

Ответы [ 4 ]

1 голос
/ 07 декабря 2009

На вашем месте я бы разрезал весь SQL на части и работал с оператором WHERE.

Что-то вроде:

sql = "SELECT * FROM phones WHERE 1=1 "
if (not empty($manu))
    sql = sql + ' AND manu = "$manu"'
...

С уважением.

1 голос
/ 07 декабря 2009

Я склонен делать это, меняя логику в SQL и передавая NULL-параметры или параметры с конкретными значениями.

WHERE manu='$manuf' AND price BETWEEN $min AND $max

=>

WHERE
    (manu='$manuf' OR '$manuf' = '*')    -- Check for "special value"
    AND (price >= $min OR $min IS NULL)  -- Check for NULL
    AND (price <= $max OR $max IS NULL)  -- Check for NULL
1 голос
/ 07 декабря 2009

Я предполагаю, что вы хотите сделать запрос типа «фильтр», который позволяет указывать необязательные параметры? Вы можете сделать что-то вроде:

SELECT 
    * 
FROM 
    Phones 
WHERE
    (manu = $manu OR manu IS NULL)
    AND (min = $min OR min IS NULL)
    AND (max = $max OR max IS NULL)

Добавление ИЛИ с параметром null (вы можете сделать его пустой строкой или чем-либо еще) позволяет фильтровать любой переданный параметр.

Вы можете комбинировать это с тем, что у вас есть выше, проверяя минимальные / максимальные значения и задавая значения по умолчанию для вашего предложения BETWEEN.

0 голосов
/ 08 декабря 2009

Может быть, что-то вроде ...

SELECT * FROM phones 
WHERE manu = coalesce(?, manu)
AND price >= coalesce(?, price) 
AND price <= coalesce(?, price)

Затем передайте параметры вместо того, чтобы вводить переменные напрямую (не уверен, как это сделать в PHP, у меня в голове).

...