Как найти с помощью php

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

array_searchSearches the array for a given value and returns the first corresponding key if successful

Description

array_search(mixed $needle, array $haystack, bool $strict = false): int|string|false

Parameters

needle

The searched value.

Note:

If needle is a string, the comparison is done
in a case-sensitive manner.

haystack

The array.

strict

If the third parameter strict is set to true
then the array_search() function will search for
identical elements in the
haystack. This means it will also perform a
strict type comparison of the
needle in the haystack,
and objects must be the same instance.

Return Values

Returns the key for needle if it is found in the
array, false otherwise.

If needle is found in haystack
more than once, the first matching key is returned. To return the keys for
all matching values, use array_keys() with the optional
search_value parameter instead.

Warning

This function may
return Boolean false, but may also return a non-Boolean value which
evaluates to false. Please read the section on Booleans for more
information. Use the ===
operator for testing the return value of this
function.

Examples

Example #1 array_search() example


<?php
$array
= array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array); // $key = 1;
?>

See Also

  • array_keys() — Return all the keys or a subset of the keys of an array
  • array_values() — Return all the values of an array
  • array_key_exists() — Checks if the given key or index exists in the array
  • in_array() — Checks if a value exists in an array

turabgarip at gmail dot com

6 years ago


About searcing in multi-dimentional arrays; two notes on "xfoxawy at gmail dot com";

It perfectly searches through multi-dimentional arrays combined with array_column() (min php 5.5.0) but it may not return the values you'd expect.

<?php array_search($needle, array_column($array, 'key')); ?>

Since array_column() will produce a resulting array; it won't preserve your multi-dimentional array's keys. So if you check against your keys, it will fail.

For example;

<?php
$people
= array(
 
2 => array(
   
'name' => 'John',
   
'fav_color' => 'green'
 
),
 
5=> array(
   
'name' => 'Samuel',
   
'fav_color' => 'blue'
 
)
);
$found_key = array_search('blue', array_column($people, 'fav_color'));
?>

Here, you could expect that the $found_key would be "5" but it's NOT. It will be 1. Since it's the second element of the produced array by the array_column() function.

Secondly, if your array is big, I would recommend you to first assign a new variable so that it wouldn't call array_column() for each element it searches. For a better performance, you could do;

<?php
$colors
= array_column($people, 'fav_color');
$found_key = array_search('blue', $colors);
?>


cue at openxbox dot com

19 years ago


If you are using the result of array_search in a condition statement, make sure you use the === operator instead of == to test whether or not it found a match.  Otherwise, searching through an array with numeric indicies will result in index 0 always getting evaluated as false/null.  This nuance cost me a lot of time and sanity, so I hope this helps someone.  In case you don't know what I'm talking about, here's an example:

<?php

$code
= array("a", "b", "a", "c", "a", "b", "b"); // infamous abacabb mortal kombat code :-P

// this is WRONG

while (($key = array_search("a", $code)) != NULL)

{

// infinite loop, regardless of the unset

unset($code[$key]);

}
// this is _RIGHT_

while (($key = array_search("a", $code)) !== NULL)

{

// loop will terminate

unset($code[$key]);

}

?>


stefano@takys dot it

12 years ago


for searching case insensitive better this:

<?php

array_search
(strtolower($element),array_map('strtolower',$array));

?>


RichGC

17 years ago


To expand on previous comments, here are some examples of
where using array_search within an IF statement can go
wrong when you want to use the array key thats returned.

Take the following two arrays you wish to search:

<?php
$fruit_array
= array("apple", "pear", "orange");
$fruit_array = array("a" => "apple", "b" => "pear", "c" => "orange");

if (

$i = array_search("apple", $fruit_array))
//PROBLEM: the first array returns a key of 0 and IF treats it as FALSEif (is_numeric($i = array_search("apple", $fruit_array)))
//PROBLEM: works on numeric keys of the first array but fails on the secondif ($i = is_numeric(array_search("apple", $fruit_array)))
//PROBLEM: using the above in the wrong order causes $i to always equal 1if ($i = array_search("apple", $fruit_array) !== FALSE)
//PROBLEM: explicit with no extra brackets causes $i to always equal 1if (($i = array_search("apple", $fruit_array)) !== FALSE)
//YES: works on both arrays returning their keys
?>


thinbegin at gmail dot com

5 years ago


Despite PHP's amazing assortment of array functions and juggling maneuvers, I found myself needing a way to get the FULL array key mapping to a specific value. This function does that, and returns an array of the appropriate keys to get to said (first) value occurrence.

function array_recursive_search_key_map($needle, $haystack) {
    foreach($haystack as $first_level_key=>$value) {
        if ($needle === $value) {
            return array($first_level_key);
        } elseif (is_array($value)) {
            $callback = array_recursive_search_key_map($needle, $value);
            if ($callback) {
                return array_merge(array($first_level_key), $callback);
            }
        }
    }
    return false;
}

usage example:
-------------------

$nested_array = $sample_array = array(
    'a' => array(
        'one' => array ('aaa' => 'apple', 'bbb' => 'berry', 'ccc' => 'cantalope'),
        'two' => array ('ddd' => 'dog', 'eee' => 'elephant', 'fff' => 'fox')
    ),
    'b' => array(
        'three' => array ('ggg' => 'glad', 'hhh' => 'happy', 'iii' => 'insane'),
        'four' => array ('jjj' => 'jim', 'kkk' => 'kim', 'lll' => 'liam')
    ),
    'c' => array(
        'five' => array ('mmm' => 'mow', 'nnn' => 'no', 'ooo' => 'ohh'),
        'six' => array ('ppp' => 'pidgeon', 'qqq' => 'quail', 'rrr' => 'rooster')
    )
);

$search_value = 'insane';

$array_keymap = array_recursive_search_key_map($search_value, $nested_array);

var_dump($array_keymap);
// Outputs:
// array(3) {
// [0]=>
//  string(1) "b"
//  [1]=>
//  string(5) "three"
//  [2]=>
//  string(3) "iii"
//}

----------------------------------------------

But again, with the above solution, PHP again falls short on how to dynamically access a specific element's value within the nested array. For that, I wrote a 2nd function to pull the value that was mapped above.

function array_get_nested_value($keymap, $array)
{
    $nest_depth = sizeof($keymap);
    $value = $array;
    for ($i = 0; $i < $nest_depth; $i++) {
        $value = $value[$keymap[$i]];
    }

    return $value;
}

usage example:
-------------------
echo array_get_nested_value($array_keymap, $nested_array);   // insane


opencart dot ocfilter at gmail dot com

1 year ago


Be careful!

<?php

var_dump

(array_search('needle', [ 0 => 0 ])); // int(0) (!)var_dump(array_search('needle', [ 0 => 0 ], true)); // bool(false)?>

But, in php 8

<?php

var_dump

(array_search('needle', [ 0 => 0 ])); // bool(false)?>


maciej at speccode dot com

7 years ago


FYI, remember that strict mode is something that might save you hours.

If you're searching for a string and you have a "true" boolean on the way - you will get it as result (first occurrence). Example below:

<?php

$arr

= [
   
'foo'    => 'bar',
   
'abc'    => 'def',
   
'bool'   => true,
   
'target' => 'xyz'
];var_dump( array_search( 'xyz', $arr ) ); //bool
var_dump( array_search( 'xyz', $arr, true ) ); //target?>


azaozz, gmail

14 years ago


Expanding on the comment by hansen{}cointel.de:

When searching for a string and the array contains 0 (zero), the string is casted to (int) by the type-casting which is always 0 (perhaps the opposite is the proper behaviour, the array value 0 should have been casted to string). That produces unexpected results if strict comparison is not used:

<?php
$a
= array(0, "str1", "str2", "str3");
echo
"
str1 = "
.array_search("str1", $a).",
str2 = "
.array_search("str2", $a).",
str3 = "
.array_search("str3", $a).",

str1 strict = "

.array_search("str1", $a, true).",
str2 strict = "
.array_search("str2", $a, true).",
str3 strict = "
.array_search("str3", $a, true);
?>

This will return:
str1 = 0, str2 = 0, str3 = 0, str1 strict = 1, str2 strict = 2, str3 strict = 3


codeslinger at compsalot dot com

13 years ago


one thing to be very aware of is that array_search() will fail if the needle is a string and the array itself contains values that are mixture of numbers and strings.  (or even a string that looks like a number)

The problem is that unless you specify "strict" the match is done using ==    and in that case any string will match a numeric value of zero which is not what you want.

-----

also, php can lookup an index pretty darn fast.  for many scenarios, it is practical to maintain multiple arrays, one in which the index of the array is the search key and the normal array that contains the data.

<?php

  $normal

[$index] = array('key'=>$key, 'data'=>'foo');

 
$inverse[$key] = $index;
//very fast lookup, this beats any other kind of search
if (array_key_exists($key, $inverse))

  {

   
$index = $inverse[$key];

    return
$normal[$index];

  }
?>


n-regen

14 years ago


If you only know a part of a value in an array and want to know the complete value, you can use the following function:
<?php
function array_find($needle, $haystack)
{
   foreach (
$haystack as $item)
   {
      if (
strpos($item, $needle) !== FALSE)
      {
         return
$item;
         break;
      }
   }
}
?>
The function returns the complete first value of $haystack that contains $needle.

andreas dot damm at maxmachine dot de

15 years ago


Combining syntax of array_search() and functionality of array_keys() to get all key=>value associations of an array with the given search-value:
<?php
function array_search_values( $m_needle, $a_haystack, $b_strict = false){
    return
array_intersect_key( $a_haystack, array_flip( array_keys( $a_haystack, $m_needle, $b_strict)));
}
?>

Usage:
<?php
$array1
= array( 'pre'=>'2', 1, 2, 3, '1', '2', '3', 'post'=>2);
print_r( array_search_values( '2', $array1));
print_r( array_search_values( '2', $array1, true));
print_r( array_search_values( 2, $array1, true));
?>

Will return:
array(4) {
    ["pre"] =>
    string(1) "2"
    [1] =>
    int(2)
    [4] =>
    string(1) "2"
    ["post"] =>
    int(2)
}
array(2) {
    ["pre"] =>
    string(1) "2"
    [4] =>
    string(1) "2"
}
array(2) {
    [1] =>
    int(2)
    ["post"] =>
    int(2)
}

yasien dot dwieb at gmail dot com

3 years ago


Beware when using array_search to a mix of string and integer where prefixes of keys may collide, as in my case I have encountered the following situation:

Assume you have the following array:
<?php
$arr
= [
          
1 => 'index 0',
          
2 => 'index 1',
          
3 => 'index 2',
          
'3anothersuffix' => 'index 3'
];$index1 = array_search('3', array_keys($arr)); // 2
$index2 = array_search('3anothersuffix', array_keys($arr)); //2
?>

$index1 and $index2 will be the same

after using strict type search:

<?php
$index1
= array_search('3', array_keys($arr), true); // false
$index2 = array_search('3anothersuffix', array_keys($arr), true);  //3
?>

it will not find $index1 at all while returning a correct value for $index2;


stooshie at gmail dot com

11 years ago


Example of a recursive binary search that returns the index rather than boolean.
<?php
// returns the index of needle in haystack
function binSearch($needle, $haystack)
{
   
// n is only needed if counting depth of search
   
global $n;
   
$n++;
   
// get the length of passed array
   
$l = count($haystack);
   
// if length is 0, problem
   
if($l <= 0)
    {
        return -
1;
    }
   
// get the mid element
   
$m = (($l+($l%2))/2);
   
// if mid >= length (e.g. l=1)
   
if($m >= $l)
    {
       
$m = $m-1;
    }
   
// get the indexed element to compare to the passed element and branch accordingly
   
$compare = $haystack[$m];
    switch(
true)
    {
        case(
$compare>$needle):
        {
           
// recurse on the lower half
           
$new_haystack = array_slice($haystack, 0, $m);
           
$c = count($new_haystack);
           
$r = binSearch($needle, $new_haystack);
           
// return current index - (length of lower half - found index in lower half)
           
return $m - ($c - $r);
            break;
        }
        case(
$compare<$needle):
        {
           
// recurse on the upper half
           
$new_haystack = array_slice($haystack, $m, ($l-$m));
           
$c = count($new_haystack);
           
$r = binSearch($needle, $new_haystack);
           
// return current position + found index in upper half
           
return $m + $r;
            break;
        }
        case(
$compare==$needle):
        {
           
// found it, so return index
           
return $m;
            break;
        }
    }
}
?>

helenadeus at gmail dot com

14 years ago


I was trying to use array_search to retrieve all the values that match a given needle, but it turns out only the first match key is returned. I built this little function, which works just like array_search, but returns all the keys that match a given needle instead. The output is an array.

<?php

$haystack

= array('a','b','a','b');$needle = 'a';print_r(array_search_all($needle, $haystack));//Output will be
// Array
// (
//         [0]=>1
//         [1]=>3
// )
function array_search_all($needle, $haystack)
{
#array_search_match($needle, $haystack) returns all the keys of the values that match $needle in $haystackforeach ($haystack as $k=>$v) {

            if(

$haystack[$k]==$needle){$array[] = $k;
        }
    }
    return (
$array);

    }

?>


nordseebaer at gmx dot de

3 years ago


It's really important to check the return value is not false! I used array_search() to determine the index of an value to unset this value and then realized that $arr[false] === $arr[0] !

<?php
$arr
= ['apple', 'banana'];var_dump($arr[0] === 'apple'); // true
var_dump($arr[false] === $arr[0]); // true
var_dump($arr[false] === 'apple'); // trueunset($arr[array_search('banana', $arr)]); //index = 1
var_dump($arr);// result
//   array(1) {
//     [0]=>
//     string(5) "apple"
//   }
unset($arr[array_search('peach', $arr)]); //not found, result is false
var_dump($arr);// result
//   array(0) {
//   }
// because $arr[false] === $arr[0]
?>

So always check the return of array_search!


kermes [at] thesevens [dot] net

15 years ago


A variation of previous searches that returns an array of keys that match the given value:

<?php
function array_ksearch($array, $str)
{
   
$result = array();
    for(
$i = 0; $i < count($array); next($array), $i++)
        if(
strtolower(current($array)) == strtolower($str))
           
array_push($result, key($array);

        return

$result;
}
?>

Usage would be as follows:
<?php
$testArray
= array('one' => 'test1', 'two' => 'test2', 'three' => 'test1', 'four' => 'test2', 'five' => 'test1');
   
print_r(array_ksearch($testArray, 'test1'));
?>


Добрый День, у меня вопрос:

Есть строка например:

abracadabra-cudsa_123-qwerty-text_a-abraca-trollololo-nlo

Если в строке есть слово(маркер) = text_a то вывести: Привет Васа!

Если в строке есть слово(маркер) = text_b то вывести: Привет Лана!

Если в строке не найдено text_a или text_b то вывести дефолт: Привет Мир!

Я делаю так:

$text = $_GET['text'];

$main_str = $text;

//искомый текст
$my_str = 'text_a';

$pos = strpos($main_str, $my_str);
if ($pos === false) {
  echo 'Привет Мир!';
}else{
  echo 'Привет Васа!';
}

Но тут проблема что ищет только одно слово (маркер)
Помогите решить! Спасибо!

Василий Барбашев's user avatar

задан 25 мар 2016 в 7:38

John Freeman's user avatar

John FreemanJohn Freeman

1391 золотой знак2 серебряных знака11 бронзовых знаков

Как вариант:

$text = $_GET['text'];

$main_str = $text;

if (strpos($main_str, 'text_a') !== false) {
  echo 'Привет Васа!';
} elseif (strpos($main_str, 'text_b') !== false) {
  echo 'Привет Лана!';
} else {
  echo 'Привет Мир!';
}

P.S. А что нужно делать, если найдены оба?

ответ дан 25 мар 2016 в 7:44

user200141's user avatar

user200141user200141

1,0071 золотой знак6 серебряных знаков17 бронзовых знаков

0

$text = $_GET['text'];

$main_str = $text;

$has_a = strpos($main_str, 'text_a') !== false;
$has_b = strpos($main_str, 'text_b') !== false;

if ($has_a && $has_b) {
    echo 'ОШИБКА';
} else {
    if ($has_a) {
        echo 'А';
    } elseif ($has_b) {
        echo 'Б';
    } else {
        echo 'ПУСТО';
    }
}

ответ дан 25 мар 2016 в 8:25

u_mulder's user avatar

u_mulderu_mulder

3,5833 золотых знака17 серебряных знаков23 бронзовых знака

раз уж стоит метка регулярные-выражения

<?php

$main_str = 'abracadabra-cudsa_123-qwerty-text_a-abraca-trollololo-nlo';

//искомый текст
$my_str = '/text_a|text_b/';

$matches = array();
preg_match_all($my_str, $main_str, $matches);

if (array_search('text_a', $matches[0]) !== false)
  echo 'Привет, Васа!';
elseif(array_search('text_b', $matches[0]) !== false)
  echo 'Привет, Лана!';
else
  echo 'Привет, Мир!';

ответ дан 25 мар 2016 в 8:07

Nikola Tesla's user avatar

9

Одна из самых популярных и необходимых функций на любом сайте – это поиск, реализованный с помощью специальной формы. Этот функционал позволяет посетителям быстро находить на сайте интересующий их контент.

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

Разрабатывать формы поиска при помощи PHP, а также познакомитесь с SQL (Structured Query Language) – специальным языком для сбора, записи и модификации информации, содержащейся в базах данных. Перед тем как начать, рекомендуем вам скачать файлы проекта.

Что вам понадобится

  • Инструмент для работы с базами данных MySQL.
  • Локальный или удаленный сервер с поддержкой PHP.
  • Текстовый редактор.
  • Создаем базу данных
  • Создание таблицы
  • Вносим представителей персонала в таблицу
  • Разработка формы
  • Проверка на соответствие критерию
  • Результаты Connect, Select, Query и Return из таблицы базы данных
  • Убираем табуляцию
  • Поиск по буквам
  • Поиск определенного сотрудника
  • SQL-инъекция
  • В завершение

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

Самым популярным инструментом для управления MySQL является PHP My Admin, Этого инструмента будет достаточно для нашего сегодняшнего руководства.

Наша таблица должна быть создана в следующем формате:

Column Name Data Type Length Null or Not Null Primary key? Auto Increment
ID INT 1 Not Null Yes Yes
FirstName Varchar 50 Not Null No No
LastName Varchar 50 Not Null No No
Email Varchar 50 Not Null No No
PhoneNumber Varchar 15 Not Null No No

Таблица базы данных состоит из столбцов и строк, как в Excel. Первый столбец позволяет идентифицировать данные по имени. Далее идет колонка Data types (тип данных), которая указывает нам на тип данных, содержащихся в колонке. В поле Length (Длина) указывается максимальный объем памяти (хранилища) для столбца таблицы. Мы используем переменные, которые дают больше гибкости. Другими словами, если длина ФИО меньше 50 символов, то будет занята лишь часть отведенного места.

И среди данных персонала не может быть пустых значений (null, empty). Первая строка выделена желтым цветом, потому что столбец ID – наш основной ключ. Основной ключ в базе данных гарантирует, что каждая запись будет уникальной. К этой колонке также применен автоинкремент, а это значит, что каждой записи в нашей базе данных будет присваиваться уникальный номер автоматически.

Как только разберетесь с таблицей, начните заполнять ее данными. 6 записей вполне достаточно, чтобы закрепить в уме процедуру. Ниже предлагаю вам собственный пример:

Чтобы создать форму поиска по сайту через Google, откройте любой подходящий текстовый редактор. Я рекомендую воспользоваться бесплатным PSPad. Вы можете использовать любой текстовый редактор, где предусмотрена подсветка синтаксиса. Это в значительной степени облегчит процесс написания и отладки PHP-кода. Создавая страницу для формы поиска, не забудьте сохранить ее в формате .php, иначе PHP-код не будет обрабатываться должным образом. Как только сохраните документ, скопируйте в него следующую разметку:

<!DOCTYPE  HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
  <head> 
    <meta  http-equiv="Content-Type" content="text/html;  charset=iso-8859-1"> 
    <title>Поиск  контактов:</title> 
  </head> 
  <p><body> 
    <h3>Детальный поиск контактов</h3> 
    <p>Вы можете искать по имени или фамилии</p> 
    <form  method="post" action="search.php?go"  id="searchform"> 
      <input  type="text" name="name"> 
      <input  type="submit" name="submit" value="Search"> 
    </form> 
  </body> 
</html> 
</p>

Если вы знакомы с языком HTML, то тут вам все должно быть понятно как минимум до открывающего тега form. Внутри этого тега находится важнейший элемент всего кода – атрибут action. В качестве действия нашей формы мы указали название нашего файла, а затем применили к нему строку запроса “go”.

Когда пользователь вводит имя или фамилию, а затем нажимает кнопку подтверждения, форма передает данные самой себе и добавляет в конце строку запроса “go”. На данном этапе мы проверяем наличие строки запроса go. Если результат положительный, выводим результаты поиска.

До вывода запрашиваемых результатов нам нужно перепроверить: (1) была ли подтверждена форма, (2) содержит ли строка запроса значение go, (3) был ли поисковой запрос введен в нижнем или верхнем регистре? Если ни одна из проверок не дает положительного результата (true), то от нас не требуется выполнять какие-либо действия.

Для начала добавим небольшой блок кода PHP поиск по сайту после закрывающего тега </form>:

</form> 
<?php 
//сделать что-то в коде 
?> 
</body> 
</html>

Сначала мы открываем блок PHP-кода тегом ””.

Любой PHP-код внутри этой пары тегов будет исполняться сервером. Затем мы проверяем, была ли подтверждена форма:

<?php 
  if(isset($_POST['submit'])){ 
  // сделать что-то в коде
  } 
  else{ 
  echo  "<p> Введите поисковый запрос</p>"; 
  } 
?>

Мы воспользуемся встроенной функцией isset, которая возвращает значение типа bool, и поместим в нее массив $_POST. Логическое выражение в программировании позволяет получить нам либо true, либо false.

Следовательно, если функция возвращает значение true, то форма была подтверждена, и нам нужно продолжить выполнение кода дальше. Если же функция возвращает значение false, то мы выведем сообщение об ошибке. Сохраните весь набранный код в файле search_submit.php.

Далее нам нужно проверить, имеется ли в строке запроса значение go:

<?php 
  if(isset($_POST['submit'])){ 
  if(isset($_GET['go'])){ 
  else{ 
  echo  "<p> Введите поисковый запрос</p>"; 
  } 
  } 
  } 
?>

Мы вкладываем еще одно условное логическое выражение внутрь основного, но только в этот раз мы используем массив $_GET вместе со значением “go”. Сохраните изменения в файле search_go.php.

Теперь нам нужно убедиться, что посетители могут вводить первую букву в строку запроса только в верхнем или только в нижнем регистре. Нам также нужно предусмотреть способ учета критериев поиска, введенных посетителем. Лучше всего проверять введенные посетителем данные с помощью регулярного выражения:

<?php 
  if(isset($_POST['submit'])){ 
  if(isset($_GET['go'])){ 
  if(preg_match("^/[A-Za-z]+/", $_POST['name'])){ 
   $name=$_POST['name']; 
  } 
  } 
  else{ 
  echo  "<p>Пожалуйста, введите поисковый запрос</p>"; 
  } 
}?>

Мы вкладываем еще одно условное логическое выражение внутрь наших двух. На этот раз мы используем регулярное выражение для проверки ввода. Мы используем встроенную функцию preg_match с двумя параметрами: регулярное выражение, и поле формы, к которому должна применяться проверка.

В нашем случае, это будет поле «Имя» (name). Чтобы извлечь параметры поиска, указанные посетителем, мы создаем переменную $name, и привязываем к ней значение POST с названием поля из формы, которое будет использоваться в SQL-запросе. Сейчас мы реализовали: (1) отправку данных формы, (2) строка запроса включает значение go и (3) посетитель ввел либо заглавную, либо строчную первую букву. И все эти проверки происходят еще до внесения изменений в базу данных. Сохраните все изменения.

Чтобы получить данные из таблицы, сначала в скрипте поиска по сайту нужно подключиться к серверу. Для этого мы используем следующий код:

<?php 
  if(isset($_POST['submit'])){ 
  if(isset($_GET['go'])){ 
  if(preg_match("/[A-Z  | a-z]+/", $_POST['name'])){ 
  $name=$_POST['name']; 
  //подключение к базе данных 
  $db=mysql_connect ("servername",  "<username>", "<password>") or die (' Я не могу подключиться к базе данных, так как: ' . mysql_error()); 
  else{ 
  echo  "<p> Пожалуйста , введите поисковый запрос</p>"; 
  } 
  } 
}?>

Мы создаем переменную $db, и привязываем ее к встроенной функции MySQL mysql_connect, которая принимает три параметра: сервер с базой данных (localhost, если вы работаете локально), логин и пароль.

После этого мы запускаем встроенную PHP-функцию die, которая останавливает дальнейшее выполнение кода, если нет соединения с базой данных. И выводим информацию об ошибке, запуская встроенную функцию MySQL mysql_error, которая вернет причину ошибки. Сохраните файл search_connectdb.php.

Далее при помощи представленного ниже кода, мы выбираем, какую базу данных использовать:

<?php 
  if(isset($_POST['submit'])){ 
  if(isset($_GET['go'])){ 
  if(preg_match("/[A-Z  | a-z]+/", $_POST['name'])){ 
  $name=$_POST['name']; 
  // Подключиться к базе данных
  $db=mysql_connect  ("servername", "username",  "password") or die ('Я не могу подключиться к базе данных, так как ' . mysql_error()); 
  //-Выберите базу данных
  $mydb=mysql_select_db("yourDatabase"); 
  } 
  else{ 
  echo  "<p>Пожалуйста , введите поисковый запрос</p>"; 
  } 
  } 
  } 
?>

Создаем переменную под названием mydb и привязываем ее ко встроенной MySQL-функции mysql_select_db, а затем указываем название базы данных, которую создали ранее. Далее мы опрашиваем таблицу базы данных при помощи SQL-запроса с переменной name, в которой содержатся параметры поиска, введенные посетителем:

<?php 
  if(isset($_POST['submit'])){ 
  if(isset($_GET['go'])){ 
  if(preg_match("/[A-Z  | a-z]+/", $_POST['name'])){ 
  $name=$_POST['name']; 
  //Подключиться к базе данных
  $db=mysql_connect  ("servername", "username",  "password") or die ('Я не могу подключиться к базе данных, так как: ' . mysql_error()); 
  //-Выберите базу данных
  $mydb=mysql_select_db("yourDatabase"); 
  //-Запрос к таблице базы данных
  $sql="SELECT ID, FirstName, LastName FROM Contacts WHERE  FirstName LIKE '%" . $name . "%' OR LastName LIKE '%" . $name  ."%'"; 
  } 
  else{ 
  echo  "<p>Пожалуйста , введите поисковый запрос</p>"; 
  } 
  } 
  } 
?>

При опросе таблицы базы данных мы создаем переменную $sql, и привязываем ее к строке, содержащей SQL-запрос. Мы используем оператор SELECT для извлечения значений из столбцов id, а также имени и фамилии из таблицы contacts. Затем мы используем инструкцию WHERE вместе со значениями имени и фамилии, чтобы сузить поиск.

Вместе с оператором LIKE мы используем знак процента (%) – спецсимвол, который возвращает 0 и более знаков, а также переменную name из строки поиска. В результате LIKE (в сочетании со спецсимволом) находит любое соответствующее имя в таблице базы данных. Можно описать весь процесс следующим образом: «Мы выбираем имя и фамилию из таблицы contacts, которые соответствуют введенным посетителем». Сохраните файл search_query.php.

Далее нам нужно поместить результаты SQL-запроса в переменную, и запустить ее при помощи функции mysql_query, как показано ниже:

<?php 
if(isset($_POST['submit'])){ 
if(isset($_GET['go'])){ 
if(preg_match("/[A-Z  | a-z]+/", $_POST['name'])){ 
$name=$_POST['name']; 
// Подключиться к базе данных
$db=mysql_connect  ("servername", "username",  "password") or die ('Я не могу подключиться к базе данных, так как: ' . mysql_error());  
//- Выберите базу данных
$mydb=mysql_select_db("yourDatabase"); 
//- Запрос к таблице базы данных
$sql="SELECT  ID, FirstName, LastName FROM Contacts WHERE FirstName LIKE '%" . $name .  "%' OR LastName LIKE '%" . $name ."%'"; 
//- Запустить запрос к функции MySQL Query
$result=mysql_query($sql); 
} 
else{ 
echo  "<p> Пожалуйста, введите поисковый запрос </p>"; 
} 
} 
} 
?>

Мы создаем переменную $result, и присваиваем ей значение функции mysql_query (), внося ее в $query. Теперь наш запрос хранится в переменной result. Чтобы вывести результат в PHP, мы создаем цикл, а затем выводим данные в неупорядоченном списке:

<?php 
  if(isset($_POST['submit'])){ 
  if(isset($_GET['go'])){ 
  if(preg_match("/^[  a-zA-Z]+/", $_POST['name'])){ 
  $name=$_POST['name']; 
  // Подключиться к базе данных
  $db=mysql_connect  ("servername", "username",  "password") or die ('Я не могу подключиться к базе данных, так как: ' . mysql_error()); 
  //- Выберите базу данных
  $mydb=mysql_select_db("yourDatabase"); 
  //- Запрос к таблице базы данных
  $sql="SELECT  ID, FirstName, LastName FROM Contacts WHERE FirstName LIKE '%" . $name .  "%' OR LastName LIKE '%" . $name ."%'"; 
  //- Запустить запрос к функции MySQL Query
  $result=mysql_query($sql); 
  //-Создание цикла 
  while($row=mysql_fetch_array($result)){ 
          $FirstName  =$row['FirstName']; 
          $LastName=$row['LastName']; 
          $ID=$row['ID']; 
  //-Вывод результата в виде массива 
  echo "<ul>n"; 
  echo "<li>" . "<a  href="search.php?id=$ID">"   .$FirstName . " " . $LastName .  "</a></li>n"; 
  echo "</ul>"; 
  } 
  } 
  else{ 
  echo  "<p> Пожалуйста, введите поисковый запрос </p>"; 
  } 
  } 
  } 
?>

Сначала мы создаем цикл while, внутри него создаем переменную под названием row, и инициализируем ее возвращаемым значением функции mysql_fetch_array, которая принимает переменную result, в которой находится наш SQL-запрос. Внутри цикла while мы присваиваем каждому значению столбца значение переменной с идентичным названием. Затем мы выводим значения внутрь неупорядоченного списка.

Здесь важно обратить внимание на два момента: (1) внутри цикла while не нужно присваивать значения переменным массива row, так как значения можно брать напрямую из массива row; (2) тег anchor, который мы используем в названии нашего файла вместе с id и основным ключом. Причина этого заключается в том, что во многих поисковых элементах изначально ничего не отображается.

Так как мы показываем только имя и фамилию, приписывая ID в конце нашего тега anchor, то мы можем использовать ID для дополнительного запроса, который позволит вывести дополнительную информацию о персонале. Сохраните файл и протестируйте форму PHP поиска по сайту (search_display.php).

Результаты выводятся в виде неупорядоченного списка, но суть в том, что нам не нужна табуляция. Чтобы избавиться от нее, добавьте следующее CSS-правило в самое начало вашего файла в head:

<style  media="screen"> 
ul  li{ 
  list-style-type:none; 
} 
</style>

Для реализации поиска по буквам потребуется лишь несколько дополнительных строк кода. Добавим этот удобный функционал для посетителей. Таким образом, они смогут находить представителей персонала по буквам, которые содержатся в имени или фамилии.

Добавьте следующую строку кода после закрывающего тега form:

</form> 
<p><a  href="?by=A">A</a> | <a  href="?by=B">B</a> | <a  href="?by=K">K</a></p> 
<?php

Мы привязываем тег <a> к строке запроса с by с помощью анкора, и устанавливаем его равным определенной букве. Чтобы реализовать функционал поиска по буквам, нам нужно добавить следующий код прямо после закрывающей фигурной скобки в исходном скрипте, как показано ниже:

}//Окончание скрипта поисковой формы 
if(isset($_GET['by'])){ 
$letter=$_GET['by']; 
//Подключение к базе данных 
$db=mysql_connect  ("servername", "username",  "password") or die ('Я не могу подключиться к базе данных, так как: ' . mysql_error()); 
//-Выберете базу данных 
$mydb=mysql_select_db("yourDatabase"); 
//-Запрос к таблице базы 
$sql="SELECT  ID, FirstName, LastName FROM Contacts WHERE FirstName LIKE '%" . $letter . "%' OR LastName LIKE '%" . $letter ."%'"; 
//-Запустить запрос к функции MySQL Query
$result=mysql_query($sql); 
//-Результаты подсчета
$numrows=mysql_num_rows($result); 
echo  "<p>" .$numrows . " results found for " . $letter . "</p>"; 
//-Запуск цикла и сортировка результатов 
while($row=mysql_fetch_array($result)){ 
$FirstName  =$row['FirstName']; 
            $LastName=$row['LastName']; 
            $ID=$row['ID']; 
//-Вывести результат в массиве
echo  "<ul>n"; 
echo  "<li>" . "<a  href="search.php?id=$ID">"   .$FirstName . " " . $LastName .  "</a></li>n"; 
echo  "</ul>"; 
} 
}

Здесь мы изменили четыре фрагмента кода скрипта поиска по сайту:

  • Мы используем функцию isset(), и вносим в нее массив $_GET, а затем проверяем значение by;
  • Создаем переменную $letter и инициализируем ее значение массивом $_GET;
  • Добавляем переменную letter в SQL-запрос;
  • Указываем переменную letter внутри выражения, в котором получаем подсчитанное количество строк.

Сохраните файл search_byletter.php и проверьте результат.

Чтобы отобразить информацию об остальном персонале, которая передается через уникальное id внутри нашей ссылки, нужно добавить следующий код прямо после закрывающей фигурной скобки в скрипте letter, как показано ниже:

}//Окончание скрипта 
if(isset($_GET['id'])){ 
$contactid=$_GET['id']; 
//Подключение к базе данных 
$db=mysql_connect  ("servername", "username",  "password") or die ('Я не могу подключиться к базе данных, так как: ' . mysql_error()); 
//-select  the database to use 
$mydb=mysql_select_db("yourDatabase"); 
//- Запрос к таблице базы данных
$sql="SELECT  * FROM Contacts WHERE ID=" . $contactid; 
//- Запустить запрос к функции mysql_query()
$result=mysql_query($sql); 
//- Запуск цикла и сортировка результатов
while($row=mysql_fetch_array($result)){ 
  $FirstName =$row['FirstName']; 
            $LastName=$row['LastName']; 
            $PhoneNumber=$row['PhoneNumber']; 
            $Email=$row['Email']; 
//- Вывести результат в массиве
echo  "<ul>n"; 
echo  "<li>" . $FirstName . " " . $LastName .  "</li>n"; 
echo  "<li>" . $PhoneNumber . "</li>n"; 
echo  "<li>" . "<a href=mailto:" . $Email .  ">" . $Email . "</a></li>n"; 
echo  "</ul>"; 
} 
}

Здесь мы изменили четыре фрагмента кода:

  • Мы используем функцию isset(), и с ее помощью проверяем значение ID в массиве $_GET;
  • Создаем переменную $contactid и инициализируем ее массивом $_GET;
  • В таблице выделяем все, что отмечено звездочкой *. Звездочка – это сокращенное обозначение в SQL, которое означает «дайте мне все столбцы и строки из таблицы». Чтобы определить, какую информацию выводить, мы упоминаем переменную contactid в конце SQL-выражения;
  • Выводим дополнительную информацию о каждом представителе персонала.

Сохраните файл search_byid.php и проверьте результат.

Обратите внимание, что наш функционал работает так, как и положено. При вводе имени или фамилии в поле, или при выборе буквы в качестве гиперссылки, отображаются только имена представителей персонала. Если навести курсор на ссылку, то в строке статуса можно увидеть уникальный ID. Если кликнуть по конкретному человеку, то адресная строка изменится, и отобразится дополнительная информация об этом сотруднике.

Причина, по которой мы добавили в наше поле поиска регулярное выражение, заключается в том, чтобы никто не смог вмешаться в наш SQL-запрос. Раньше эта проблема была распространена, и хакеры умудрялись проводить собственные SQL-запросы, манипулируя при этом вашим приложением. Например, если бы мы допустили возможность использовать апостроф в нашем поле, то хакер мог бы просто удалить базу данных, используя запрос:

Как уже было отмечено, регулярное выражение гарантирует, что в качестве первого символа посетитель может вводить лишь буквы в нижнем или верхнем регистре.

В сегодняшней статье мы рассмотрели, как сделать поиск по сайту, а также:

  • Создавать базы данных и соответствующие таблицы;
  • Использовать инструменты для управления базами данных, создавать столбцы и вводить данные;
  • Разрабатывать формы поиска на основе PHP, которая умеет осуществлять проверку вводимых данных, наличия переменных в запросе, а также соединяться с базой данных и выводить результаты из таблицы;
  • Как защитить приложение и базу данных от SQL-инъекций.

Используя знания, полученные из этой статьи, вы сможете без труда модифицировать чужой код, а также при необходимости расширять функционал формы поиска.

Как разработать PHP скрипт поиска для своего сайта

От автора: PHP скрипт поиска является неотъемлемой частью современного ресурса. Но для начинающих разработчиков его реализация может стать «краеугольным камнем». Сегодня я постараюсь объяснить построение такого модуля как можно проще, чтобы его код не испугал вас своей чрезмерной сложностью.

Ищем на PHP

Организация на сайте внутренней системы поиска является важной задачей. Наличие такого функционала значительно поднимает ресурс в глазах любого пользователя. Особенно это касается узкотематических сайтов, контент которых посвящен решению конкретных «проблем». Например, в веб-программировании.

Чаще всего для написания скрипта поиска по сайту на PHP используется связка данного программного языка с MySQL. Для реализации интерактивной поисковой системы применяется технология AJAX. Но сегодня мы не будем «петлять» в таких дебрях, и остановимся на классическом варианте.

Я приведу самый простой пример поиска. В нем не будет проверок наличия соединения с СУБД, проверки результатов возвращаемой выборки и т.д. Все эти тонкости вы сможете добавить самостоятельно. Цель материала – дать общее представление о построении внутренней системы поиска на современном интернет-ресурсе. Поехали!

Для начала приведу код формы для ввода поискового запроса. Это простая разметка, даже без малейших стилевых «изысков».

Профессия PHP-разработчик с нуля до PRO

Готовим PHP-разработчиков с нуля

Вы с нуля научитесь программировать сайты и веб-приложения на PHP, освоите фреймворк
Laravel
, напишете облачное хранилище и поработаете над интернет-магазином в команде.
Сможете устроиться на позицию Junior-разработчика.

Узнать подробнее

Командная стажировка под руководством тимлида

90 000 рублей средняя зарплата PHP-разработчика

3 проекта в портфолио для старта карьеры

<form name=«f1» method=«post» action=«search.php»>

<input type=«search» name=«search_q»/></br>

</br>

<input type=«submit» value=«Поиск»/></br>

</form>

Так эта форма выглядит в браузере:

Переходим к скрипту

Теперь переходим непосредственно к программному коду. Для начала приведу структуру таблицы, которую нужно создать в MySQL. Мы будем искать опубликованные материалы по их заголовку. По этому же принципу можно создать PHP скрипт поиска слов по сайту. Все в ваших умелых руках :).

Сначала мы перехватываем значение, введенное пользователем в форму. Затем очищаем его от «мусора»: лишних пробелов, тегов и коннектимся к базе. После этого запускаем SQL запрос, в котором сравниваем значение поискового запроса с названием материалов, сохраненных таблице. При совпадении выводим соответствующий контент. В конце закрываем соединение с MySQL и «сбрасываем» запрос. Вот весь код примера:

<?php

$search_q=$_POST[‘search_q’];

$l= mysqli_connect(‘localhost’, ‘root’, », ‘site’);

$search_q = trim($search_q);

$search_q = strip_tags($search_q);

$q= mysqli_query($l, «SELECT title_value,content FROM `title` WHERE title_value LIKE ‘%$search_q%'»);

$itog=mysqli_fetch_assoc($q);

  while ($itog = mysqli_fetch_assoc($q)) {

        printf(«%s (%s)n»,$r[«title_value»],$r[«content»]);

    }

mysqli_free_result($q);

  mysqli_close($l);

?>

Профессия PHP-разработчик с нуля до PRO

Готовим PHP-разработчиков с нуля

Вы с нуля научитесь программировать сайты и веб-приложения на PHP, освоите фреймворк
Laravel
, напишете облачное хранилище и поработаете над интернет-магазином в команде.
Сможете устроиться на позицию Junior-разработчика.

Узнать подробнее

Командная стажировка под руководством тимлида

90 000 рублей средняя зарплата PHP-разработчика

3 проекта в портфолио для старта карьеры

Код следует разместить в отдельном файле PHP на стороне сервера, а его название прописать в форме (атрибут action). Еще раз напоминаю, что это всего лишь «костяк» поиска по сайту PHP MySQL скрипта. «Обшить» его различными проверками сможете самостоятельно. Главное, что показан принцип реализации.

В этой статье будет рассказано, как сделать простой поиск по БД в PHP, но стоит сказать, что этот способ, больше подойдёт для Admin панели, но если вы хотите сделать поиск по сайту для пользователей, то эта статья не для вас.

Как работает поиск по БД:

Суть работы поиска по базе данных очень проста, мы вводим в строку данные, и он сравнивает все параметры по всем совпадением, например, он сравнивает имя и фамилию пользователя в базе данных, и ищет совпадение.

Делаем поиск:

Мы будет делать поиск среди пользователей, но можно сделать для любой таблицы.

HTML документ:

C HTML документом всё очень просто, поэтому я даже не буду рассказывать про него, просто покажу код.

<!DOCTYPE html>

<html lang=«en»>

<head>

    <meta charset=«UTF-8»>

    <title>Document</title>

</head>

<body>

    <form action=«<?= $_SERVER[‘SCRIPT_NAME’] ?>»>

        <p>Поиск Человека: <input type=«text» name=«search» id=«»> <input type=«submit» value=«Поиск»></p>

        <hr>

    </form>

    <?php

    countPeople($result); // Функция вывода пользователей

    ?>

</body>

</html>

Как видите тут всё просто, вы отправляете данные прямо в этот же файл, это значит, что мы работаем в PHP, также отправляются POST запрос, ну а в низу используется функция которая выводит результат работы/поиска.

Если вы не знаете как работать с формой в PHP, то прочитайте часть нашего учебника: PHP работа с формой.

Подключение БД:

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

$servername = «127.0.0.1»; // Адрес сервера

$username = «root»; // Имя пользователя

$password = «»; // Пароль

$BDname = «users_search»; // Название БД

// Подключение к БД

$mysqli = new mysqli($servername, $username, $password, $BDname);

// Проверка на ошибку

if ($mysqli->connect_error) {

    printf(«Соединение не удалось: %sn», $mysqli->connect_error);

    exit();

}

В принципе тут тоже объяснять особо не о чём, так как, вы уже должны это знать, если вы читаете эту статью.

Но если вы всё таки не знаете, то посмотрите часть учебника по PHP: PHP работа с БД MySQL.

Основной код:

Теперь пришло время к основному коду PHP, так сказать к основной логики.

// Получаем запрос

$inputSearch = $_REQUEST[‘search’];

// Создаём SQL запрос

$sql = «SELECT * FROM `users` WHERE `name` = ‘$inputSearch’ || `surname` = ‘$inputSearch’ || `email` = ‘$inputSearch’ || `number_phone` = ‘$inputSearch’ || `city` = ‘$inputSearch’ || `year_of_birth` = ‘$inputSearch'»;

// Отправляем SQL запрос

$result = $mysqli -> query($sql);

В этой части кода, мы просто берём данные, которые получили от формы и загоняет их в переменную $inputSearch, дальше создаём SQL запрос, в котором через или сравниваем со всеми данными пользователя.

Отправляем этот запрос в базу данных MySQL и сохраняем возвращаемые данные в переменной $result.

Перед тем как перейдём к созданию функции, которая будет выводить всё совпадения, нужно кое что, грубо говоря настроить.

function doesItExist(array $arr) {

    // Создаём новый массив

    $data = array(

        ’email’ => $arr[’email’] != false ? $arr[’email’] : ‘Нет данных’,

        ‘city’ => $arr[‘city’] != false ? $arr[‘city’] : ‘Нет данных’,

        ‘year’ => $arr[‘year_of_birth’] != false ? $arr[‘year_of_birth’] : ‘Нет данных’

    );

    return $data; // Возвращаем этот массив

}

Это маленькая функция, нужна для того, что бы если данных, к примеру, email нету, то выводилось не пустая строка, а фраза «Нет данных», функция возвращает массив с изменениями.

Теперь можно создать функцию для вывода данных.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

function countPeople($result) {

    // Проверка на то, что строк больше нуля

    if ($result -> num_rows > 0) {

        // Цикл для вывода данных

        while ($row = $result -> fetch_assoc()) {

            // Получаем массив с строками которые нужно выводить

            $arr = doesItExist($row);

            // Вывод данных

            echo «ID: «. $row[‘id’] .«<br>

                  Имя: «. $row[‘name’] .«<br>

                  Фамилия: «. $row[‘surname’] .«<br>

                  Телефон: «. $row[‘number_phone’] .«<br>

                  Email: «. $arr[’email’] .«<br>

                  Город: «. $arr[‘city’] .«<br>

                  Год рождения: «. $arr[‘year’] .«<hr>»;

        }

    // Если данных нет

    } else {

        echo «Не кто не найден»;

    }

}

Давайте разберём код, тут создаём функцию, для вывода пользователей, в качестве параметра используется результат метода отправление SQL запроса.

В остальном тут нет не чего сложного, если вы прочитали часть учебника «PHP работа с БД MySQL», которая упоминалась выше.

Вот результат программы.

Результата поиска

Как видите программа абсолютно рабочая.

Вывод:

В этой статье было показано как сделать поиск по БД в PHP, надеюсь она вам помогла, также, если вы не умеете работать с базой данных, то посмотрите весь наш учебник посвящённый работе с ней, по этой ссылки.

Подписываетесь на соц-сети:

Оценка:

Загрузка…

Также рекомендую:

Понравилась статья? Поделить с друзьями:
  • Эксель как найти данные в массиве
  • Как найти свою посылку на укрпочте
  • Как найти токи в ветвях онлайн
  • Как найти модель кроссовок по фото
  • Как найти музыку по своему вкусу