2015-04-25 2 views
0

Привет, У меня есть поле поиска, где я что-то искал из своей базы данных, теперь я увидел проблему после тестирования, что если я положу «%» в поле поиска, он выведет все, что у меня есть готовый к поиску. Есть ли способ отключить это?Как отключить% от вывода всего

<h3>Search Share Details</h3> 
<p>You may search either by company name or issue date</p> 

<form name = "search" method = "get"> 
<input type = "text" name = "share" size = "40" maxlength="50"> 
<input type = "submit" value = "Search"> 
</form> 

Получение содержимого подключения к БД, извлечение результатов и печать

function get_contents() { 

    if(isset($_GET['share'])) 
    { 
     $conn = db_connect(); 
     $shares = get_shareSearch($conn); 
     db_disconnect($conn); 
     $contents = array('shares' => $shares); 
     return $contents; 
    } 
    else 
    { 
     $conn = db_connect(); 
     $shares = get_share($conn); 
     db_disconnect($conn); 
     $contents = array('shares' => $shares); 
     return $contents; 
    } 
} 


function print_contents($contents) 
{ 

    if(count($contents['shares']) == 0) 
    { 
     echo "<script type = 'text/javascript'>alert('Sorry but share is not found! Q_Q');</script>"; 

    } 
    else 
    { 
    ?> 
     <table> 
      <tr> 
       <th>Company Name</th> 
       <th>Rate</th> 
       <th>Issue Date</th> 

      </tr> 
    <?php 
    foreach ($contents['shares'] as $share) 
    { 
     print "<tr>"; 
     $identifier = urlencode($share['SHAREID']); 
     print "<td><a href='share-details.php?id={$identifier}'>{$share['COMPANY']}</a></td>"; 
     print "<td>{$share['RATE']}</td>"; 

     $issue_date = $share['ISSUE_DATE']; 
     $issue_date = $issue_date === NULL ? "&lt; not available &gt;" : $issue_date; 
     print "<td>{$issue_date}</td>"; 
     print "</tr>"; 
    } 
    ?> 
     </table> 
    <?php 
    } 
} 
//require("shares.php"); 
require("search.php"); 
?> 

Query сам

function get_shareSearch($conn) { 
$id = ""; 
if(isset($_GET['share'])){$id = $_GET['share'];} 
$statement = db_create_statement($conn, "SELECT DISTINCT * FROM shares WHERE(company LIKE '{$id}' OR issue_date LIKE '{$id}')"); 
$resultset = db_fetch_resultset($statement); 
return $resultset; 

}

+0

Если я ввел '%; DROP TABLE shares "в окне поиска, скорее всего, я удалю всю таблицу? – adeneo

+0

Возможный дубликат [Escaping MySQL wild cards] (http://stackoverflow.com/questions/3683746/escaping-mysql-wild-cards) – Huey

+0

Какой драйвер вы используете? Используйте готовые операторы, если они доступны, если не учитывать переход к драйверу, который может использовать подготовленные операторы. – chris85

ответ

1

экранируется

Это относится, чтобы положить символ перед ним, чтобы обозначить это означало быть буквально:

первоначальное заявление

SELECT * FROM ikeaTable WHERE chair LIKE '5% off'; 

экранированием

SELECT * FROM ikeaTable WHERE chair LIKE '5\% off' ESCAPE '\'; 

YOURS

SELECT DISTINCT * FROM shares WHERE(company LIKE '\%{$id}' OR issue_date LIKE '\%{$id}') ESCAPE '\' 
+0

так что в основном мой запрос будет выглядеть как '' SELECT DISTINCT * FROM shares WHERE (компания LIKE '\% {$ id}' ИЛИ ​​issue_date LIKE '\% {$ id}') ESCAPE '\' "?' – Nico12345

+0

нет работает так: D – Nico12345

0

Я не знаю, какие базы данных библиотеки вы используете, но вы, конечно, необходимо, чтобы избежать параметров, которые включают в запрос. Если не избежать, MySQL будет понимать% как особый символ, который в основном означает «соответствовать чему-либо».

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

+0

Я использую My Sql поэтому в основном мой запрос будет как '" SELECT DISTINCT * FROM акций WHERE (компания LIKE '\% {$ ид}' ИЛИ ​​issue_date LIKE «\% {$ ID } ') ESCAPE' \ '"'? – Nico12345

+0

Возможно, попробуйте изменить запрос на «SELECT DISTINCT * FROM shares WHERE company LIKE: share OR issue_date LIKE: доля« и добавить в код db_bind ($ statement, ': share', $ id); – maalls

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