Архив метки: MySql

Бэкап БД с помощью cron

Бэкап с помощью cron

Как запускать php скрипт из cron’a?
Строка в кронфайле,запускающая php скрипт  должна выглядеть так:

* * * * * /usr/local/bin/php /home/user/www/site1/public_html/scriptus.php

где /usr/local/bin/php – путь до php-интерпретатора (на различных серверах путь может быть разным. );
/home/user/www/site1/public_html/scriptus.php – путь до скрипта необходимо указывать от корня сервера.

Часто используемые SSH и MySQL команды

Команды работы с файлами и директориями

mkdir — команда служит для создания директории. Пример: mkdir tst, создаст директорию tst.

rmdir — команда служит для удаления пустой директории (для удаления непустых директорий надо использовать rm -rf directory).

rm filename — удалить файл или директорию.

cd directory — команда служит для навигации по каталогам, пример: «cd ~/public_html» произведет заход в директорию public_html вашего домашнего каталога.

pwd — показывает абсолютный путь до каталога, в котором вы находитесь.

cp ~/from/~/to/- скопировать файл или директорию. Чтобы скопировать каталог из одной директории в другую, используйте данную команду с ключами -rf, например cp -rf ~/from/directory/ ~/to/directory.

scp -r ./* new_login@new_host:~/ — защищенное копирование файлов из текущей директории на новую машину (используйте при переносе вашего сайта, например, с виртуального хостинга на VPS).

rsync -avH –progress * new_login@new_host:~/ — синхронизация данных. Файлы заменяются более новыми. Главное отличие от scp, то что при обрыве rsync начинает синхронизировать с места разъединения.

wget -c -m –passive-ftp -nH ftp://login:pass@host/ — копирование по ftp. Параметр «-с» позволяет докачивать файлы. Может пригодиться, когда rsync не в состоянии синхронизировать большой файл.

mv ~/from/~/to/- переместить файл или директорию (также можно использовать для переименования файлов).

ls -al — показывает все файлы в текущем каталоге.

Команды работы с архивами

tar -zxf archive_name.tgz — разархивировать файл в текущий каталог.

tar -zcf archive_name.tgz filename — создать архив, вместо filename можно также указывать имя директории, тогда она будет тоже заархивирована. Архив создается в текущем каталоге.

Команды работы с базами MySQL

mysqldump –opt -Q -u username -ppassword database_name > filename.sql — сделать dump базы данных database_name в файл filename.sql, username – имя пользователя к базе данных, dump которой вы хотите сделать.

mysql -u username -ppassword database_name < filename.sql — распаковать dump из файла filename.sql в базу данных database_name, username – имя пользователя к базе данных, в которую вы хотите распаковать dump.

mysql -u username -ppassword database_name — работа с базой database_name через командную строку. В этом режиме можно выполнять команды MySQL. Обратите внимание на то, что команда обязательно должна заканчиваться символом «;», иначе выполнена она не будет.

Импорт и экспорт данных MySQL

Экспорт и импорт данных в MySQL обычно требуется при переносе информации из одной базы данных MySQL в другую и для осуществления резервного копирования.

Единственный способ быть уверенным в 100% восстановлении данных — самостоятельно выполнять регулярное резервное копирование информации. Для этого необходимо воспользоваться утилитой mysqldump, которая доступна через unix shell.

Пример команд для экспорта и импорта базы данных:

mysqldump -u имя_пользователя -p -h имя_сервера_БД

имя_базы > dump.sql

Данные будут сохранены в файле dump.sql. Далее (в случае необходимости) восстанавливаем данные из резервной копии (дампа) так:

mysql -u имя_пользователя -p -h имя_сервера_БД

имя_базы < dump.sql

Запускаемые указанным образом утилиты для работы с MySQL будут запрашивать пароль к базе данных. Нужно вводить пароль соответствующего пользователя БД.

По умолчанию система считает, что данные в базе хранятся в кодировке UTF-8. Если ваши данные хранятся в другой кодировке, то после создания резервной копии (дампа) для последующего корректного восстановления данных необходимо открыть созданный файл текстовым редактором и исправить в нём строчку:/*!40101 SET NAMES utf8 */;

Например, для кодировки Windows-1251 нужно указать:/*!40101 SET NAMES cp1251 */;

Дополнительные опции утилиты mysqldump:

–add-drop-table — опция, которая добавляет команду DROP TABLE перед созданием таблиц. Перед восстановлением таблиц из дампа, таблицы с таким же именем в рабочей базе данных будут удалены и пересозданы из резервной копии. Рекомендуется использовать для предотвращения возможных ошибок после восстановления;

–add-locks — опция, которая добавляет команды LOCK TABLES перед выполнением и UNLOCK TABLE после выполнения каждого дампа таблицы. Применяется для ускорения доступа к MySQL;

–quote-names — опция, сообщающая утилите о необходимости ставить кавычки для названий таблиц и столбцов. Рекомендуется к использованию для MySQL версий, младше 4.1.1. В старших версиях она активирована по умолчанию.

Опции –quick и –opt рекомендуется использовать, если база данных MySQL слишком большая для того, чтобы целиком поместиться в памяти.

При этом утилита mysqldump выдает ошибку:mysqldump: Out of memory (Needed XXXXX bytes)

mysqldump: Got error: 2008: MySQL client

run out of memory when retrieving data from server

В итоге строчка для создания копии базы данных получается следующей:

mysqldump –opt -u имя_пользователя -p -h имя_сервера_БД

–add-drop-table имя_базы > dump.sql

либо такой:mysqldump –quick -u имя_пользователя -p -h имя_сервера_БД

–add-drop-table имя_базы > dump.sql

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

–set-variable max_allowed_packet=1M

либо-O max_allowed_packet=1M

Если во время импорта вы получите ошибку вида

mysqldump: Error 2020:

Got packet bigger than ’max_allowed_packet’

bytes when dumping table `some_table_name ` at row: 2

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

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

Если на вашем сервере установлена версия MySQL 4.0.x, то для корректного переноса данных со сторонних серверов необходимо при экспорте базы данных использовать ключ:

–compatible=mysql40

AJAX и PHP — работа с базой данных

Задача:

Динамический показ данных (товар) в зависимости от выбора элемента (категория) в выпадающем списке , используя AJAX.

Решение (Пример):

Шаг 1

Создать файл index.php, в котором

  • подключаемся к базе данных для получения списка категории

Листинг файла подключения к БД auth.php

<?
$hostname = "localhost"; // название/путь сервера, с MySQL
$username = "root"; // имя пользователя (в Denwer`е по умолчанию "root")
$password = ""; // пароль пользователя (в Denwer`е по умолчанию пароль отсутствует, этот параметр можно оставить пустым)
$dbName = "test"; // название базы данных

/* Создаем соединение */
mysql_connect($hostname, $username, $password) or die ("Не могу создать соединение");
mysql_query('SET NAMES utf8') or header('Location: Error');

/* Выбираем базу данных. Если произойдет ошибка - вывести ее */
mysql_select_db($dbName) or die (mysql_error());
?>
  •  выводим форму с выпадающим списком из этих категорий

Выпадающий список

  • пишем AJAX запрос на обработку выбранного элемента

Листинг файла с AJAX запросом index.php

<?php
include "auth.php";//Подключаем БД
//делаем запрос на категории
$query = "select * from allcat where Id_parent=0 ";
$result = mysql_query($query) or die(mysql_error());
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; Charset=UTF-8">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
</head>
<body>
<form id="myForm">
Выберите Категорию:<br/>
<select id="idcat">
<?php
//Выводим категории и ее ID
while ($row=mysql_fetch_array($result))
{
print "<option value=".$row['Id_cat'].">";
print $row['Name'];
echo("</option>");
}
?>
</select>
</form>

<div id="content"></div>

<script>
$(document).ready(function(){

$('#idcat').change(function(){
$.ajax({
type: "POST",
url: "show.php",
data: "idcat="+$("#idcat").val(),
success: function(html){
$("#content").html(html);
}
});
return false;
});

});
</script>

</body>
</html>

Шаг 2

Создать файл show.php, в котором обрабатываем AJAX запрос

  • подключаемся к базе данных для получения списка товаров по ID категории
  • выводим полученные товары

Листинг файла для обработки запроса show.php

<?php
include "auth.php"; //Подключаем БД
//делаем запрос на товары этой категории
$query = "select * from allcat where Id_parent=".$_REQUEST['idcat']."";
$result = mysql_query($query) or die(mysql_error());
// выводим товары полученные по запросу
while ($row=mysql_fetch_array($result))
{
print $row['Name']."<br>";
}
?>

 

Запрос SQL для добавления записи в БД

Запрос SQL для добавления записи в таблицу БД.

Общий вид  запроса

INSERT INTO имя таблицы (поле1, поле2) VALUES (‘данные поля1’,’данные поля2’)
или
INSERT INTO имя таблицы SET поле1=‘данные поля1’, поле2=’данные поля2’

Пример запроса

INSERT INTO fruit (Name, color) VALUES (‘apple’,’green’);

Рабочий пример листинга использования запроса на добавления (MySql + php.)

/* Соединяемся с базой данных */
$hostname = "localhost"; // название/путь сервера, с MySQL
$username = "root"; // имя пользователя
$password = ""; // пароль пользователя (если пароль отсутствует, этот параметр можно оставить пустым)
$dbName = "test"; // название базы данных
 /* Таблица MySQL, в которой хранятся данные */
$table = "test_table";
 /* Создаем соединение */
mysql_connect($hostname, $username, $password) or die ("Не могу создать соединение");
/* Корректный вывод русских букв */
mysql_query('SET NAMES cp1251') or header('Location: Error');
/* Выбираем базу данных. Если произойдет ошибка - вывести ее */
mysql_select_db($dbName) or die (mysql_error());
/* Запрос на добавление */
  $query = "INSERT INTO
   	     $table
	    SET
	     dolzhnost='$dolz',
	     inn='$inn',
	     fullnameorg='$fname',
	     fio='$fioname',
	     date='$cdate',
	     yuradres='$yuradress',
	     factadres='$fadress'
  	   ";
/* Выполняем запрос. Если произойдет ошибка - вывести ее. */
mysql_query($query) or die(mysql_error());
/* В случае успешного сохранения выводим сообщение и ссылку возврата */
echo ("<div style=\"text-align: center; margin-top: 10px;\">
<font color=\"green\">Данные успешно отправлены!</font>
<a href=\"index.php\">Вернуться назад</a></div>");
header("Location: /eoz/index.php");
        exit;
};
/* Закрываем соединение */
mysql_close();)

Также можно посмотреть:

Пример запроса SQL на обновления поля в таблице БД

Вывод каталога используя smarty

Smarty ШаблонизаторИтак необходимо реализовать вывод каталога с подкаталогами неограниченной вложенностью, используя шаблонизатор smarty.

Один из способов:

1. Прежде чем начать необходимо иметь таблицу в нашей БД с необходимыми данными. К примеру как на рисунке ниже.

Таблица MySql для реализации вывода каталогов2. Теперь пишем необходимый php код в файле index.php
в комментариях необходимые пояснения

require('../libs/Smarty.class.php'); //подключение smarty

include "authBD.php"; //в этом файле подключаем БД

$smarty = new Smarty; // создаем объект шаблонизатора

// создаем текст запроса для выборки из нашей БД
$query = "select * from category"; 

// делаем выборку и заносим в массив
$result_table  = mysql_query($query) or die(mysql_error());
$rows_array=array();
while ($row=mysql_fetch_array($result_table))
   $rows_array[]=$row;

//формируем дерево из выборки
 $cat_tree=select_to_array_tr($rows_array); 

//создаем переменную для нашего дерева каталогов
$smarty->assign('cat1', $cat_tree);

//вызываем шаблон
$smarty->display('index.tpl');

3. Формирования дерева из массива выборки

Функция не использует рекурсию, основана на ссылках, в child хранятся подкаталоги если они есть у родителя.

Листинг

function select_to_array_tr($arr,$mk='Id_cat',$sk='Id_parent',$child='child')
{  // если нет создаем
    if(!$arr) {
        return array();
    }

    $mas = array();
    $l = count($arr); //кол-во элементов в массиве
    for($i = 0; $i < $l; $i++) {
        $mas[ $arr[$i][$mk] ] = &$arr[$i];
    }
    // child - массив дочерних каталогов
    foreach($mas as $k => $v) {
        $mas[ $v[$sk] ][$child][] = &$mas[$k];
    }

    $res = array();
    foreach($arr as $v) {
        if(isset($v[$sk]) && $v[$sk] == 0) {
            $res[] = $v;
        }
    }
//возвращаем готовый массив
     $arr = $res;
    return $arr;
}

необходимо добавить ее в наш файл index.php перед ее вызовом.

4. Необходимо отредактировать шаблон index.tpl, он находится в папке templates.

Листинг шаблона index.tpl

<ul>
{foreach item='ListTree' from=$cat1}
{* вывод корневых каталогов *}   
     <li>{$ListTree.Name}    </li>
{* вывод подкаталогов используется рекурсия шаблонов *}
    {if count($ListTree.child)>0}
        {include file='ListTree.tpl' object=$ListTree}
    {/if }    
{/foreach}
</ul>

5. Затем создадим файл ListTree.tpl со следующим кодом(ниже) и сохраним в папке templates. Этот шаблон будет вызываться для всех дочерних каталогов.

Листинг шаблона ListTree.tpl

<ul>
{foreach item='ListTree' from=$object.child}
{* вывод корневых каталогов *}
     <li>{$ListTree.Name}    </li>
{* вывод подкаталогов используется рекурсия шаблонов *}
    {if count($ListTree.child)>0}
        {include file='ListTree.tpl' object=$ListTree}
    {/if }
{/foreach}
</ul>

Результат получается такой

Вывод каталога используя Smarty

Smarty и MySql

Smarty ШаблонизаторВывод данных из базы данных Mysql используя шаблогизатор Smarty.

1. Формируем необходимые данные из нашей базы данных

 

Листинг php кода

require('../libs/Smarty.class.php');
include "auth.php"; //здесь код для подключения к БД
$smarty = new Smarty; // создаем объект
$table = 'cat1'; //наша таблица с данными
$query = "select * from $table"; //формируем запрос
$result  = mysql_query($query) or die(mysql_error());
$rows=array();
while ($row=mysql_fetch_array($result))
   $rows[]=$row;
$smarty->assign('cat1', $rows); //переменная для шаблона
$smarty->display('index.tpl');

2. Добавить код для вставки в шаблоне index.tpl для вывода наших данных

 {foreach from=$cat1 item=item}
   <p>{$item.IdCat} - {$item.NameCat} - {$item.Idcc}</p>
{/foreach}