2012-07-04 4 views
0

У меня есть PHP-код для простого поиска базы данных MySQL только с двумя столбцами данных. Я подозреваю, что я, вероятно, уже пройду долгий путь, когда я могу просто сделать это по-другому.Выполнение второго поиска автоматически

У меня есть форма, которую вы можете поместить в имя или IP-адрес, и он будет искать любой из них в базе данных и выводить результаты. У каждого имени может быть только один IP-адрес (последний из них был использован) (для полных уникальных имен будет только один результат или несколько результатов, если частичные имена соответствуют нескольким учетным записям), но IP-адрес может иметь несколько имен (люди, которые используют несколько учетных записей на том же IP-адресе). Что я хочу сделать, так это, если вы ищете имя, оно будет делать обычный одиночный результат (если было введено полное уникальное имя), но затем под ним выполните вторичный поиск для IP, если только NAME был найден в форме.

«Ищет NAME вернул эти результаты:. {Результаты} Мы также нашли эти учетные записи, которые использовали один и тот же IP-адрес: {Результаты соответствие один и тот же IP-адрес из первого результата поиска Имени} ».

Вот код, который я до сих пор:


(Некоторые очистки, так как я использую GET)

$iplookup = strtolower($_GET['iplookup']); 
$iplookup = stripslashes($iplookup); 
$iplookup = strip_tags($iplookup); 
$iplookup = preg_replace('/[^A-Za-z0-9\._]/','',$iplookup); 

$sql = mysql_query("select 
* from banlistip where name like '%$iplookup%' OR lastip like '%$iplookup%' 
"); 

if (empty($iplookup)) { 
echo '<br><b>You left the search form empty.</b>'; 
} else { 
while ($row = mysql_fetch_array($sql)) { 
     echo '<br/> Name: '.$row['name']; 
     echo '<br/> Player IP: '.$row['lastip']; 
     echo '<br/><br/>'; 
} 

}


А потом прямо здесь получилось, что $row['lastip'], а затем выполните поиск для этого, что будет эквивалентно простому поиску ip-адреса в первую очередь.


Вся цель этого заключается в том, чтобы устранить пару шагов и сразу увидеть все желаемые результаты. Обычно, чтобы выполнить поиск по IP-адресу, я должен указать на поиск имени, выделить + скопировать ip, вернуться к форме, а затем выполнить поиск по IP-адресу.



таблица с двумя столбцами под названием «имя» и «lastip» соответственно имеют такие данные:

player1 111.111.111.111 
player2 222.222.222.222 
player3 111.000.111.000 
player4 222.000.222.000 
altaccount1 111.000.111.000 
altaccount2 222.222.222.222 

(Если вы искали Player2, вы получите один результат, так как это уникальное имя. Если вы искали IP-адрес Player2, вы получили бы два результата [player2 + altaccount2], так как есть альтернативная учетная запись, которая использует тот же IP-адрес.)

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

+0

Если вы используете текущую версию PHP, воспользуйтесь входными фильтрами. '$ iplookup = filter_input (INPUT_GET, 'iplookup', FILTER_VALIDATE_IP);' –

+0

Да, я буду, спасибо! :) – DreamPhreak

ответ

1
SELECT * FROM banlistip 
WHERE lastip = (SELECT DISTINCT lastip FROM banlistip WHERE name LIKE '%$iplookup%' OR lastip LIKE '%$iplookup%') 
+0

Но это вызовет ошибку, если у вас будут игроки, подключающиеся в разных местах (которые не являются частью ваших данных образца) –

+0

Подождите, что вы имеете в виду именно? – DreamPhreak

+0

Просто добавьте player1 333.333.333.333 и player2 444.444.444.444 к вашим тестовым данным, затем найдите «player1», подзапрос вернет более одной строки. Вы должны принять во внимание ответ Джареда и использовать запрос, который я предложил, только если пользователь ищет IP-адрес. Я отредактирую свой ответ, чтобы показать вам другой запрос, с которым вы должны играть. –

1

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

Так что, если $iplookup, несомненно, является IP (использование проверка регулярных выражений), то:

$sql = "SELECT * FROM banlistip WHERE lastip LIKE '%$iplookup%'"; 

иначе вы будете использовать:

$sql = "SELECT * FROM banlistip WHERE name LIKE '%$iplookup%'"; 

Regex вы можете использовать, чтобы проверить это с помощью preg_match(), curtousy из regular-expressions.info:

$regex = '/(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/'; 

if (preg_match($regex, $iplookup)) { 
    // Call IP SQL 
} else { 
    // Call Name SQL 
} 
Смежные вопросы