Поиск по базе данных (php + mysql).

Задача: осуществить поиск по базе данных на php. В качестве входного параметра – строка (одно или несколько слов, числа …).

Решение: используем оператор LIKE в SQL-запросе.

Примеры:

1. Определяем количество строк в таблице, где есть совпадения с $squery по искомой строке:

$sql = "SELECT COUNT(*) FROM products WHERE (product_name LIKE '%$squery%' OR description LIKE '%$squery%')";

2. Получаем все строки из таблицы, где есть совпадения с $squery.
$sql =  "SELECT * FROM products WHERE (product_name LIKE '%$squery%' OR description LIKE '%$squery%') LIMIT $start, $limit";

Добавлено: 18 Мая 2018 07:32:50 Добавил: Андрей Ковальчук

Живой поиск

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

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

<form action="search.php" method="post" name="form" onsubmit="return false;">
  <p>
    Живой поиск:<br> 
    <input name="search" type="text" id="search">
    <small>Вводите на английском языке</small>
  </p>
</form>

Сразу за формой разместим блок, в котором будут отображаться результаты поиска
<div id="resSearch">Начните вводить запрос</div>

Теперь посмотрим основную часть кода. Как ни странно, но она очень простая и представляет всего несколько строк кода:
<script type="text/javascript">
$(function(){
  $("#search").keyup(function(){
     var search = $("#search").val();
     $.ajax({
       type: "POST",
       url: "search.php",
       data: {"search": search},
       cache: false,                                 
       success: function(response){
          $("#resSearch").html(response);
       }
     });
     return false;
   });
});
</script>

Как видите все довольно просто. Мы просто отслеживаем любое изменение содержимого в поле сid=search, получаем это значение и отправляем нашему обработчику search.php, производящий собственно сам поиск. Далее любой результат, который мы получили от обработчика мы просто выводим в блок с id=research.

Теперь поговорим, как устроен обработчик. Как правило, поиск производится по базе данных, но в примере мы будем искать в массиве название стран (в исходниках приведен код для поиска по базе данных). Не забывайте о том, что когда поиск производится по базе данных, то у поля, по которому мы ищем должен быть режим «полный текст».
<?php
header("Content-type: text/html; charset=windows-1251");
$search = $_POST['search'];
$search = addslashes($search);
$search = htmlspecialchars($search);
$search = stripslashes($search);
   if($search == ''){
      exit("Начните вводить запрос");
   }
$db = mysql_connect("localhost","user","password");
mysql_select_db("basa",$db);
mysql_query("SET NAMES cp1251");
                
$query = mysql_query("SELECT * FROM table WHERE MATCH(text) AGAINST('$search')",$db);
if(mysql_num_rows($query) > 0){
   $sql = mysql_fetch_array($query);
   do{
     echo "<div>".$sql['text']."</div>";
   }while($sql = mysql_fetch_array($query));
}else{
   echo "Нет результатов";
}
?>

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

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

Добавлено: 17 Мая 2018 19:45:19 Добавил: Андрей Ковальчук

sqlsrv_encoding_utf8

В базах данных от Microsoft очень часто наблюдаются проблемы с кодировкой. Данные нужно переводить из windows-1251 в UTF-8.
Это делается на уровне базы данных.Можно использовать функцию PDO::SQLSRV_ENCODING_UTF8 для драйвера PDO.Очень удобный драйвер для общения с любой базой данных.

$serverName = "serverName\SQLEXPRESS"; 
$name= "user_name"; 
$pass = "password"; 
$options = array(PDO::SQLSRV_ATTR_ENCODING=>PDO::SQLSRV_ENCODING_UTF8, "CharacterSet" => "UTF-8");  
 
try 
{ 
    $conn = new PDO( "sqlsrv:Server=".$serverName."; Database=DB_Name", $name, $pass, $options); 
    echo "Connected!"; 
} 
catch(Exception $e) 
{ 
    die( print_r( $e->getMessage() ) ); 
}

Или устанавливать атрибут при соединении с БД
$conn->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_UTF8); 

Если перебороть эту напасть не удастся-можно использовать iconv на стороне php сервера.

Если и это не поможет-смените тип поля с varchar на nvarchar.Должно помочь.

Добавлено: 17 Мая 2018 11:26:32 Добавил: Андрей Ковальчук

Работа с запросами SQL в PHP с помощью ezSQL

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

Что такое ezSQL, и зачем он нужен
В больших проектах обычной практикой является использование CMS или рабочей среды, например, Symfony или CodeIgniter, для построения структуры сайта. Но в маленьких проектах очень многие разработчики продолжают использовать функции PHP, такие как mysql_query(), для организации запросов SQL к базе данных.

Не смотря на функциональность такого подхода, использование всех функций вида mysql_XXX является порочным методом работы. Конечно, очень многие сайты используют MySQL, но если в один прекрасный день придется иметь дело с какой-нибудь другой базой данных, например PostGres или Oracle… Ваш код не будет работать и придется переписывать все практически с нуля. Очень печально, не так ли? Поэтому рекомендуется использовать уровень абстрагирования базы данных, то есть API, которая будет обеспечивать коммуникацию между вашим приложением/веб сайтом и сервером базы данных, будь то MySQL, Oracle или PostgreSQL.

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

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

ezSQL и WordPress
Если вы знакомы с WordPress, то вероятно, знаете о классе wpdb, который позволяет отправлять запросы к базе данных. Класс wpdb основан на ezSQL, и в данном случае у вас не будет проблем с освоением ezSQL. Но не стоит беспокоиться, если вы никогда не слышали о WordPress или о классе wpdb. ezSQL очень проста для изучения и использования.

Загрузка и установка ezSQL
Сделаем несколько примеров. Для начала надо скачать копию ezSQL (ищем на открывшейся странице ссылку "Download ezSQL"). После загрузки архива, распаковываем его в папку проекта на сервере.

Для того чтобы использовать ezSQL в своих проектах, надо включить два файла: первый - ez_sql_core.php (ядро ezSQL); второй зависит от типа используемой в вашем проекте базы данных. Чтобы использовать ezSQL для MySQL, нужно включить файл ez_sql_mysql.php.

После включения файлов нужно создать объект ezSQL. Это легко выполняется с указанием имени базы данных, имени пользователя, его пароля и сервера базы данных. Следующий пример демонстрирует включение требуемых файлов и создание объекта ezSQL:

include_once "../shared/ez_sql_core.php";
include_once "ez_sql_mysql.php";
$db = new ezSQL_mysql('имя_пользователя_БД','пароль_пользователя_БД','имя_БД','сервер_БД');

Теперь у нас есть объект $db. И его можно использовать для выполнения запросов к базе данных.

Примеры запросов
ezSQL имеет несколько методов для простой организации SQL запросов. Рассмотрим несколько примеров:

Выполнение любого запроса
Для того чтобы выполнить любой запрос к базе данных, нужно использовать метод query. В случае добавления данных метод вернет идентификатор добавленной записи.
$db->query("INSERT INTO users (id, name, email) VALUES (NULL,'Кошка','cat@google.com')");

Пример запроса обновления данных:
$db->query("UPDATE users SET name = 'Петруха' WHERE id = 4");

Выбор строки
Метод get_row используется для извлечения строки из базы данных. В примере выполняется запрос, и выводятся полученные данные:
$user = $db->get_row("SELECT name, email FROM users WHERE id = 4");
 
echo $user->name;
echo $user->email;

Выбор одной переменной
Если вам нужно только одна переменная, то в данном случае подходит метод get_var. Его очень просто использовать:
$var = $db->get_var("SELECT count(*) FROM users");
 
echo $var;

Выбор множества строк
Большой объем работы с данными приходится на получение из базы нескольких строк, соответствующих определенному критерию, и их обработку. Метод get_results позволяет получить различные данные из базы. Для обработки используется цикл foreach():
$results = $db->get_results("SELECT name, email FROM users");
 
foreach ( $results as $user ) {
    echo $user->name;
    echo $user->email;
}

Выбор столбца
Если нужно получить столбец, то можно воспользоваться методом get_col. Второй параметр - это смещение столбца в результате запроса.
foreach ( $db->get_col("SELECT name,email FROM users",0) as $name ) {
            echo $name;
}

Отладка
Когда что-то не работает так, как ожидалось, ezSQL имеет отличный метод для выполнения отладки. Очевидно, что метод называется debug. При вызове данный метод отображает последний выполненный запрос к базе данных и его результат:
$db->debug();

Надеюсь, что ezSQL поможет вам в успешной реализации ваших будущих проектов!

Добавлено: 16 Мая 2018 09:14:39 Добавил: Андрей Ковальчук

PHP+MySQL проблемы с кодировкой

На некоторых хостингах возникают проблемы с кодировкой – символы отображаются знаками вопроса или иероглифами. Очень часто по причине того что созданная таблица или база данных не состыкуется с кодировкой самого сайта. То есть к примеру вы используете cp1251 (стандартную кодировку для русских символов Windows-1251) а база под кодировкой utf-8 или на оборот.

Как вариант решения:

mysql_query ("set character_set_client='cp1251'") || die(mysql_error());
mysql_query ("set character_set_results='cp1251'") || die(mysql_error());
mysql_query ("set collation_connection='cp1251_general_ci'");

это запросы из php которые следует применять После подключения к базе. И эти запросы если применяются то должны применятся при выводе данных и при внесении данных в БД

Добавлено: 08 Мая 2018 21:30:28 Добавил: Андрей Ковальчук

Импорт больших SQL-дампов через PHP

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

$f = @fopen("path/to/dump.sql", "r");
if($f)
{
    $q = '';
 
    while(!feof($f))
    {
        // читаем построчно в буфер $q      
        $q .= fgets($f);
 
        // пока не упрёмся в ;
        if(substr(rtrim($q), -1) == ';')
        {
            // выполяем запрос
            execute_sql($q);
 
            // обнуляем буфер
            $q = '';
        }
    }
}

Добавлено: 07 Мая 2018 06:47:11 Добавил: Андрей Ковальчук

Изменяем адрес URL изображений

Если нужно поменять путь к вашим изображениям, вы можете использовать следующий запрос SQL (замените http://www.myoldurl.com на старый адрес папки с изображениями, а http://www.mynewurl.com - на новый адрес):

UPDATE wp_posts
SET post_content = REPLACE (post_content, 'src=”http://www.myoldurl.com', 'src=”http://www.mynewurl.com');

Добавлено: 02 Мая 2018 11:36:50 Добавил: Андрей Ковальчук

Поиск и замена содержания записи

Для поиска и замены содержания записи используйте следующий запрос. Замените ‘OriginalText‘ текстом, который надо найти, а ‘ReplacedText‘ - новым текстом.

UPDATE wp_posts SET `post_content`
= REPLACE (`post_content`,
'OriginalText',
'ReplacedText');

Добавлено: 02 Мая 2018 11:36:10 Добавил: Андрей Ковальчук

Переустанавливаем пароль вручную

Если вы единственный пользователь вашего блога WordPress и имя пользователя admin, то можно изменить пароль с помощью запроса SQL. Нужно заменить PASSWORD на новый пароль:

UPDATE `wordpress`.`wp_users` SET `user_pass` = MD5('PASSWORD') WHERE `wp_users`.`user_login` =`admin` LIMIT 1;

Добавлено: 02 Мая 2018 11:35:32 Добавил: Андрей Ковальчук

Пакетное удаление ревизий записей

Ревизии записей могут быть весьма полезными, но они существенно увеличивают размер базы MySQL. Можно удалять ревизии записей вручную, но значительно быстрее будет использовать запрос SQL.

DELETE FROM wp_posts WHERE post_type = "revision";

Добавлено: 02 Мая 2018 11:34:44 Добавил: Андрей Ковальчук

Делаем запись страницей и наоборот

Сделать запись страницей очень просто:

UPDATE wp_posts SET post_type = 'page' WHERE post_type = 'post'

А если нужно выполнять обратную задачу, используем запрос:
UPDATE wp_posts SET post_type = 'post' WHERE post_type = 'page'

Добавлено: 02 Мая 2018 11:34:01 Добавил: Андрей Ковальчук

Удаляем ненужный короткий код

Короткий код WordPress является отличным инструментом, но когда он становится ненужным записи все равно продолжают хранить его. Данный запрос удаляет ненужный короткий код из базы данных. Замените ‘tweet‘ на имя короткого кода, который надо удалить.

UPDATE wp_post SET post_content = replace(post_content, '[tweet]', '' ) ;

Добавлено: 02 Мая 2018 11:33:19 Добавил: Андрей Ковальчук

Выбираем и удаляем записи, которые старше ‘X’ дней

Для выбора записей, которые старше ‘X’ дней нужно использовать данный запрос (замените Х на нужное количество дней):

SELECT * FROM `wp_posts`
WHERE `post_type` = 'post'
AND DATEDIFF(NOW(), `post_date`) > X

Для удаления записей, которые старше ‘X’ дней нужно использовать данный запрос (замените Х на нужное количество дней):
DELETE FROM `wp_posts`
WHERE `post_type` = 'post'
AND DATEDIFF(NOW(), `post_date`) > X

Добавлено: 02 Мая 2018 10:16:34 Добавил: Андрей Ковальчук

Удаляем комментарии с определенного URL

Если спам комментарии содержат одинаковый URL, то данный запрос поможет удалить их все сразу. В качестве параметра для удаления используется строка, которая размещается между двумя символами ‘%’. Любой адрес URL, который содержит данную строку будет удален.

DELETE from wp_comments WHERE comment_author_url LIKE "%nastyspamurl%" ;

Добавлено: 02 Мая 2018 10:14:20 Добавил: Андрей Ковальчук

Разрешаем/запрещаем пингбек и трекбек записей до определенной даты

В данном запросе задаем статус ping_status либо open (разрешить) либо closed (запретить), а также дату (в примере используется 2010-01-01).

UPDATE wp_posts SET ping_status = 'closed' WHERE post_date < '2010-01-01' AND post_status = 'publish';

Добавлено: 02 Мая 2018 10:13:48 Добавил: Андрей Ковальчук