2013-11-25 2 views
0

Я пытаюсь написать функцию для моей клиентской системы, которая может искать таблицу «клиентов» на основе одного (или нескольких) входов из формы поиска. Код размещен нижеПоиск таблицы MySQL на основе дополнительных входных данных формы

$lookupCust['userid'] = mysqli_real_escape_string($mysqli, $_POST['userid']); 
$lookupCust['name'] = mysqli_real_escape_string($mysqli, $_POST['name']); 
$lookupCust['phone'] = mysqli_real_escape_string($mysqli, $_POST['phone']); 
$lookupCust['balance'] = mysqli_real_escape_string($mysqli, $_POST['balance']); 
$lookupCust['credit'] = mysqli_real_escape_string($mysqli, $_POST['credit']); 
$lookupCust['notes'] = mysqli_real_escape_string($mysqli, $_POST['notes']); 

$query = "SELECT * FROM customers WHERE 
      userid = '" . $lookupCust['userid'] . "' OR 
      name = '" . $lookupCust['name'] . "' OR 
      phone = '" . $lookupCust['phone'] . "' OR 
      balance = '" . $lookupCust['balance'] . "' OR 
      credit = '" . $lookupCust['credit'] . "' OR 
      notes = '" . $lookupCust['notes'] . "'"; 
$lookupCust['result'] = '<table border="1"><tr><td>Username</td><td>Name</td><td>Phone</td><td>Balance</td><td>Credit</td><td>Notes</td></tr>'; 

while($row = mysqli_fetch_assoc($result)) 
    $lookupCust['result'] .= "<tr><td>".$row['userid']."</td><td>".$row['name']."</td><td>".$row['phone']."</td><td>".$row['balance']."</td><td>".$row['credit']."</td><td>".$row['notes']."</td></tr>"; 

Проблема здесь в том, что независимо от того, что получает набрано, все клиенты будут перечислены из, в связи с запросом, имеющим пробелы (из полей, которые не заполнены). Может ли кто-нибудь написать пример о том, как искать только то, что представлено в запросе?

+2

Рассмотрите возможность использования 'if (empty' и STOP их прямо у передних ворот. –

+0

Если вам нравится вводить лишние данные, придерживайтесь этой техники, иначе я бы использовал' new mysqli() 'и Object Oriented. – PHPglue

ответ

2

код что-то вроде этого:

$where = ""; 

foreach ($_POST as $k => $v) 
{ 
    if ($v == "") 
     continue; 

    if ($where != "") 
     $where .= "OR "; 

    $where .= $k ." = '".mysqli_real_escape_string(trim($v))."'"; 
} 

Если $_POST имеет, кроме поиска ключевых слов. вы можете сделать это вот так:

$search = Array('userid', 'name', 'phone', 'balance', 'credit', 'notes'); 

$where = ""; 

foreach ($search as $col) 
{ 
    if ($_POST[$col] == "") 
     continue; 

    if ($where != "") 
     $where .= "OR "; 

    // $where .= $col ." LIKE '".mysqli_real_escape_string(trim($_POST[$col]))."%'"; // prefix matching 

    // $where .= $col ." LIKE '%".mysqli_real_escape_string(trim($_POST[$col]))."%'"; // matches anywhere 
} 

FYI, я думаю, что поиск по методу POST не является хорошей практикой. сложно сделать постоянный URL ссылки. это не удобно.

+0

Ran it. $ where generated: =' bill 'OR OR OR OR OR, когда я ввел «bill» как userid.Как я должен сделать запрос из этого? –

+0

@AlexSchittko извините, я допустил ошибки .. Необходимо изменить блок «ИЛИ» и «продолжить». Также я добавил 'trim()' в удалите пустое пространство. ответ обновлен. –

+0

Скорректированный $ k до $ col во втором фрагменте. Отлично работает, за исключением того, что я сталкиваюсь с той же проблемой, что и другой ответ. Результаты дают только точные соответствия. IE, я ищу «alex», и выходит только «alex». Я бы хотел, чтобы это также отображало «alex4» и «alex5» и любые другие частичные совпадения. Какие-либо предложения? –

1

Используйте && или AND состояние, как:

$query = "SELECT * FROM customers WHERE 
    userid = '{$lookupCust['userid']}' && userid != '' || 
    name = '{$lookupCust['name']}' && name != '' || 
    phone = '{$lookupCust['phone']}' && phone != '' || 
    balance = '{$lookupCust['balance']}' && balance != '' || 
    credit = '{$lookupCust['credit']}' && credit != '' || 
    notes = '{$lookupCust['notes']}' && notes != ''"; 

Я взял на себя смелость, чтобы показать вам технику в двойных кавычках, чтобы сохранить нажатия клавиш. Кроме того, вы должны обязательно проверить свой mysqli_result::$num_rows. В этой ссылке есть хороший пример стиля ООП. Однако вы должны поддерживать соединение с базой данных на защищенной отдельной странице.

+0

вы не должны группировать каждое условие AND с помощью()? Просто спрашивайте. –

+0

Просто запустил это. Он работает только, если я набираю точное значение, поэтому это не теоретически «поиск». Я изменил значение = 's на LIKE, но это ничего не менял.Я тогда добавил% вокруг '{$ variable}, и это только что вызвало ошибку SQL –

Смежные вопросы